《Java技术》第二次作业

《Java技术》第二次作业

(一)学习总结

1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。

==:比较的是两个字符串的地址。
equals()方法:比较两个字符串内容是否相等
例子:

    public class Test1 {
    	public static void main(String[] args) {
    		String str1="hello";
    		String str2=new String("hello");
    		String str3 = str2;
    		String str4 = "hello";
    		System.out.println("==方法:");
    		System.out.println("str1 == str2 --> " + (str1 == str2));
    		System.out.println("str1 == str3 --> " + (str1 == str3));
    		System.out.println("str2 == str3 --> " + (str2 == str3)); 
    		System.out.println("str1 == str4 --> " + (str1 == str4));
    		System.out.println("equals方法:");
    		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))); 
    		System.out.println("str1 equals str4 --> " + (str1.equals(str4)));
    	}
    }

2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
(1)构造方法:
构造方法用于在创建对象时对其进行初始化。
(2)构造方法的重载:
方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。
(3)下面的程序不能通过编译,因为构造构函数Foo()未定义

    public class Test {
        public static void main(String args[]) { 
           Foo obj = new Foo();       
        }     
    }
    class Foo{
        int value;
        public Foo(int intValue){
            value = intValue;
        }
    }

3.运行下列程序,结果是什么?查阅资料,分析为什么。
结果是“不等于0.3”。
原因:精度缺失,计算机是二进制的,double是浮点型的,无法用二进制精确表示。

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");
        }
    }     
}

修改后的程序:

    import java.math.BigDecimal;
    public class Test {
        public static double add(double a,double b,double c){ 
            BigDecimal a1 = new BigDecimal(a); 
            BigDecimal b1 = new BigDecimal(b);
            BigDecimal c1 = new BigDecimal(c);
    		return a1.add(b1).add(c1).doubleValue();
        }
        public static double round(double d,int len){
            BigDecimal a1 = new BigDecimal(d); 
            BigDecimal b1 = new BigDecimal(1);
            return a1.divide(b1,len,BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        public static void main(String[] args){
            System.out.println("等于"+Test.round(Test.add(0.1,0.1,0.1),1));
        }   
    }

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];
        for(int i=0;i<3;i++){
        	arr[i]=new MyClass();
        }
        arr[1].value=100;
    }
}
class MyClass{
    public int value=1;
}

5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。
应该用StringBuffer类。

  • String类表示的字符串是常量,创建之后内容和长度都不能改变。
  • StringBuffer类表示字符容器,内容和长度可以随时修改。
  • 在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类型,如果需要对字符串进行增删操作,则使用StringBuffer类。

String类

public class Test1 {
        public static void main(String args[]) {
            String str="Hello";
            for (int i=0;i<10000;i++) {
               str=str+" world!";
            }
             System.out.println(str);
        }
}

StringBuffer类

public class Test1 {
        public static void main(String args[]) {
            StringBuffer buf=new StringBuffer("Hello");
            for (int i=0;i<10000;i++) {
               buf.append(" World!");
            }
             System.out.println(buf);
        }
}

(二)实验总结

1.评分系统

  • 程序设计思路:用for循环输入每个选手的成绩,然后在for循环里再写一个for循环求出最大值和最小值,接着用循环求成绩总和,循环之后,在外循环内再让成绩总和减去最大值最小值,最后求平均值(将平均值强制转换成float型)并且输出,将求出来的五位选手的平均值放入一个新的数组里输出,最后让这些平均值用Java类库完成排序操作使其从大到小输出。
  • 实验问题分析:
    问题1:求平均值时,成绩的总和没有减去最大值和最小值。
    原因: 将求最大值最小值的程序写在循环外(输入选手成绩之前)了,所以最大值最小值求不出来。

    解决方案:将求最大值最小值的程序写在输入成绩的程序之后,这样最大值和最小值就可以求出来了。

    问题2:将平均值放入一个新的数组时,只是将最后一个选手的平均值放进去了,前面四位选手的平均值并没有放入。
    原因:将新数组的赋值写在了循环外,这样赋值给新数组的值就是最后一组循环完的数据,即第五位选手的平均值。

    解决方案:将赋值的语句写在外循环内,即求平均值的程序后面,并将定义新数组的语句写在外循环之前。


    问题3:提示有错误

    原因:数组名写错了,写成了变量avg
    解决方案:将变量名avg改为数组名newArr

2.Email验证

  • 程序设计思路:输入一个email地址,然后查找“@”和“.”是否同时存在,在String中使用indexOf()方法,可以返回指定的字符串的位置,如果不存在返回-1。并且可以通过返回字符串的位置判断“@”的位置是否在“.”之前 ,如果“@”的位置下标小于“.”的位置下标,则证明“@”在“.”之前。在String中使用startsWith()方法可以判断字符串是否以指定的内容开头,使用endsWith()方法可以判断字符串是否以指定的内容结尾。

  • 实验问题分析:
    问题1:无法输入字符串
    原因:输入语句有错误

     Scanner input=new Scanner(System.in);
     System.out.println("请输入email地址:");	
     String str=input.nextString();
    

    解决方案:将String str=input.nextString();改为String str=input.next();
    问题2:截取字符串的语句出现问题,“未对参数类型 String, boolean 定义运算符 &&”。

    原因:str.substring(str.indexOf(".")+1语句不能直接放在if里
    解决方案:定义一个新的变量String str1,将截取的字符串赋值给str1,然后让str1同email地址的标准结尾作比较

        String str1=str.substring(str.indexOf(".")+1);
     		if(str.indexOf("@")!=-1&&
     		   str.indexOf(".")!=-1&&
     		   str.indexOf("@")<str.indexOf(".")&&
     		   str.indexOf("@")!=0){
     				if(str1.equals("com")||
     				   str1.equals("cn")||
     				   str1.equals("net")||
     				   str1.equals("gov")||
     				   str1.equals("edu")||
     				   str1.equals("org"))
    

(三)代码托管

  • 码云commit历史截图
posted @ 2017-03-27 13:32  luhan1  阅读(280)  评论(0编辑  收藏  举报