java第二次作业

《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周
posted @ 2017-03-26 21:52  曾经的曾经···  阅读(154)  评论(0编辑  收藏  举报