Java作业02 计科1501 闫国雨
(一)学习总结
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。
答:在本次的String的学习中,我学会了用Eclipse查看jdk源代码的方法,摁住ctrl再点击你想看的源代码,就会跳转到该地方。

2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
答:构造方法是与类名一样的方法,没有返回值,当类实例化时候自动运行的方法。它不能被static,final等修饰词修饰,不可被子类继承。
上面的程序不能通过编译,因为当类不写构造方法的时候会自动填写一个构造方法,当写了构造方法之后,在初始化类的时候就得,就得根据构造方法进行初始化,由于初始化的时候没有传入参数,所以不能编译通过。
3.运行下列程序,结果是什么?查阅资料,分析为什么。
public class Test {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
答:double类型中,是有精度的,当进行运算之后,就会产生精度损失,导致0.1+0.1+0.1的结果接近0.3但是不等于0.3。所以在运行之后,产生的结果是不等于0.3。
在要求数据准的计算方面,写四则运算的话,可以调用java.math.BigDecimal类里面的方法,进行精度运算。例如:
import java.math.BigDecimal;
public class Test {
public static void main(String args[]) {
BigDecimal a = new BigDecimal(0.1);
BigDecimal b = new BigDecimal(0.1);
BigDecimal c = new BigDecimal(0.1);
b=b.add (c);
a=a.add(b);
double f =a.divide(new BigDecimal("1"),1,BigDecimal.ROUND_HALF_UP).doubleValue();
if( f == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
} //此时的代码就等于0.3。
4.运行下列程序,结果是什么?分析原因,应如何修改.
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
答:上免得代码知识申请了一个MyClass类的数组,并没有把数组实例化,所以要想用arr[1]的变量时候需要初始化,例如:
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1] =new MyClass();
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}//此时的代码编译的时候将不再报错。
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
答:在循环连接操作中,String与StringBuffer是有区别的,因为再用String操作中,每次链接需要创建新的内存,把拼接后的结果放在新的内存中,而StringBuffer中是把添加的代码放在字符串的后面。在字符串的操作中,应当尽量用StringBuffer来连接,例如:
public class Test {
public static void main(String[] args) {
String str1 ="hello ";
System.out.println(str1.hashCode());
str1 =str1+"world";
System.out.println(str1.hashCode());
StringBuffer str2 =new StringBuffer("hello ");
System.out.println(str2.hashCode());
str2.append("world");
System.out.println(str2.hashCode());
}
}
当用第一个的方法拼接的时候,地址是改变的,当用第二个方法拼接,地址是不变的。如图所示:

(二)实验总结
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
答:在写这个程序时候,就和c语言一样简单,只要懂得方法的概念,写出来求最大值,最小值,平均值即可,值得说的是这个用到了之前学过的排序方法,我用的是冒泡排序法。切实在学习之中我们还学过选择排序法等,应该不断的复习,不断地提升。
2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
答:在写这个程序的时候我遇到了一个困难,我在写程序的时候忘记了indexOf这个方法的存在,我就一直在思考怎么写这个方法,不过听到舍友说这道题最简单,然后经过我仔细的翻书找打了这个现成的方法,只要用这个方法,几个比较就得出了结果,值得说一下的是在indeOf类中,是以int来定义的,是有返回值的,返回值是你要查找的符号所在的位置。
3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
答:这道题没什么可以说的,浪费的我大量的学习时间,就是对字符串进行拆分,然后在拆分,然后就是合并和查找,只要足够的细心和耐心,多看看书,就完全可以写得出来。
4.身份证识别:公民身份证号码由十八位数字组成。从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。顺序码的奇数分配给男性,偶数分配给女性。编写一个识别身份证基本信息的小工具,输入一个居民身份证号,则输出居民所属省份(直辖市、自治区),生日(格式:xxxx-xx-xx)和性别信息。
答:这道题和第三道题一模一样,都是字符串的拆分,不过有一个简单的方法,老师上课说的,定义一个String类型的二维数组,这样就可以用二维数组进行存储地区,提取信息的时候也将变得简单起来。
(三)代码托管(务必链接到你的项目)
码云commit历史截图
https://git.oschina.net/hebau_cs15/Java-CS01ygy.git
上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。


浙公网安备 33010602011771号