《Java技术》第二次作业
(一)学习总结
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。
举例说明equals方法和==的区别。
在String类中“==”用于数值比较,比较的是字符串的地址,而equals()方法用于内容比较,比较的是字符串的内容是否一样。
例如
public static void main(String[]args){
String str1="hello";
String str2=new String ("hello");
String str3=str2;
System.out.println("str1==str2->"+(str1==str2));
System.out.println("str1==str3->"+(str1==str3));
System.out.println("str2==str3->"+(str2==str3));
}
结果为
str1==str2->false
str1==str3->false
str2==str3->true
结果发现字符串都一样,但比较结果却不一样,说明“==”不能比较字符串内容,他比较的是字符串的地址。
public static void main(String[]args){
String str1="hello";
String str2=new String ("hello");
String str3=str2;
System.out.println("str1 equals str2->"+(str1 equals (str2));
System.out.println("str1 equals str3->"+(str1 equals (str3));
System.out.println("str2 equals str3->"+(str2 equals (str3));
}
结果为
str1 equals str2->true
str1 equals str3->true
str2 equals str3->true
因为equals比较的是字符串的内容,所以返回结果都是TRUE。
2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
构造方法 构造方法是一种特殊的方法,与一般的方法不同是:
(1)构造方法的名字必须与定义他的类名完全相同。
(2)没有返回类型。
(3)构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
(4)可以重载。
构造方法的重载只要每个方法的参数类型或参数个数不同,即可实现重载。
下列函数不可以通过编译,如果定义了一个有参的构造方法,系统就不会在定义一个无参的构造方法,就不能调用。
可以修改为以下程序
public class Test {
public static void main(String args[]) {
Foo obj = new Foo(0);
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
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");
}
}
}
为了处理精度损失的问题,可以使用java.math.BigDecimal类,查阅JDK帮助文档或教材p378,对上述程序进行修改。
结果为“不等于0.3”,输出a+b+c结果为0.30000000000000004,原因是浮点数没有办法精确表示。
修改为
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");
BigDecimal d = new BigDecimal("0.3");
if(a.add(b.add(c)).compareTo(d)==0){
System.out.println("等于0.3");
}
else {
System.out.println("不等于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;
}
修改为
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1].value=100;
System.out.println("arr[1].value="+arr[1].value);
}
}
class MyClass{
public static int value=1;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。
String类是字符串常量,它具有不可变性,就是一旦创建,对它进行的任何修改操作都会创建一个新的字符串对象。StringBuffer类是字符串可变量。由于String类是不可变的,每次对其改变都要创建新字符串对象,所以它是最慢的。所以用StringBuffer类进行循环。
(二)实验总结
1.评分系统
- 程序设计思路:先定义两个数组,一个放五个人的平均分,一个放十个评委给每个人的分数,输入一个二层循环外层循环是五个人的平均分,内层循环是十个评委给打得分数,在外层循环里找出每个人的最大值最小值以及总合,用总和减去最大值最小值除以8,算出平均值放在数组里。最后用冒泡排序输出平均值数组。
实验问题分析:
问题1:输出平均分一直是0
原因:写上这个输出语句后显示为score[0]=0;System.out.println("score["+i+"]="+score[i]""score["+i+"]="+score[i]");
说明我没有输上内容
解决方案:
for(i=0;i<score.length;i++){
Scanner input1 =new Scanner(System.in);
System.out.print("请输入第"+(a+1)+"个人的成绩:");
score[i]=input1.nextInt();
System.out.println("score["+i+"]="+score[i]);
}
写了这样一个循环输入。
问题2:定义
int score[] =new int[10];
double average[]=new double [5];
double avg=(sum-max-min)/8
输出结果为5.0,6.0.
原因:sum-max-min为int类型
解决方案:强制转换为double类型
double avg=(double)(sum-max-min)/8
2.验证e-mail地址
- 程序设计思路:用string的方法做,写一个验证是否以指定字符开头或结尾的方法,然后在主函数里用if条件约束。
实验问题分析:
问题1:string不会动态输入
解决方案:询问同学后得知Scanner in =new Scanner(System.in); System.out.print("请输入邮箱:"); String str =in.nextLine();
问题2:写str.indexOf()方法无法返回两个值
解决方案:换了种方法,直接在if条件里约束str.indexOf("@")!=(-1)&&str.indexOf(".")!=(-1)
就解决了
3.文件夹分类
程序设计思路: 定义一个字符串,一个字符串数组,用string类的方法进行截取,存放在字符串数组中,
for (i = 0; i < s.length; i++) { System.out.println((s[i].substring(0,1)).toUpperCase()+ (s[i].substring(1))); }
在进行比较相不相同
if ((s[j].substring(s[j].indexOf(".")).equalsIgnoreCase(s[k].substring(s[k].indexOf("."))) == true)) { count++; }
- 实验问题分析:
问题:输出语句一直重复
原因:进行循环时,要比较的内个字符串会与前边的再次进行比较,造成重复。
解决方案:加入了一个重复标志,在当前要比较的字符串的位置向前比较,如果有相同的,重复标志为1,在重复标志不为1时进行输出。
4.身份证号验证 程序设计思路:定义一个数组存放身份证号,一个字符串二维数组存放省份,
进行如上循环进行省份输出。for( j = 0;j < shengfen.length;j++){ for( k =0;k < shengfen[j].length;k++){ if(((j+1)*10+k+1) == (s[0]*10+s[1])){ System.out.println(shengfen[j][k]); } } }
实验问题分析: 重庆市
问题:四川省以后的输出错误
原因:重庆市与其他省份规律不同
解决方案:把重庆市单拎了出来if(s[0]*10+s[1]==50){ System.out.println("重庆市"); }
(三)[代码托管]https://git.oschina.net/hebau_cs15/hebau-cs01cyl.git
- 码云commit历史截图
(四)学习进度条
代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 300/300 | 30/30 | 学习了.... |
第5周 | 200 | 30 | 学习了string类的方法和数组的用法 |
第6周 |