• java第二次作业


    《Java技术》第XX次作业

    (一)学习总结

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

    equals方法的源码如下:

    public boolean equals(Object obj)
    {
        if(this == obj)
        return true; 
        if(obj instanceof String){
        String s = (String)obj; 
        int i = value.length; 
        if(i == s.value.length){
        char ac[] = value;
        char ac1[] = s.value;
        for(int j = 0; i-- != 0; j++)
        if(ac[j] != ac1[j])
        return false;
        return true;
        }
    }
    return false;
    }
    

    从代码可以看出如果是同一个对象的地址,该方法就直接返回true,若不是同一个对象的地址进行比较就逐个比较字符是否相等。若是相同就返回true,否则返回false。在基本数据类型中short,char,int,long,float,double等,它们用 == 比较,比较的是值,而复合数据类型(String等),比较的是对象的内存地址。

    2.什么是构造方法?什么是构造方法的重载?

    构造方法是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,它的功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。
    构造方法的重载则是在创建对象时,系统会自动根据所调用的构造方法中包含的参数类型,个数,选择匹配的构造方法创建对象。
    下面的程序是否可以通过编译?为什么?

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

    不能通过编译,因为没有在有参构造方法中传递一个参数,应在Foo obj = new Foo()中添加一个参数,如:Foo obj = new Foo(10); ,可通过编译。

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

    结果是不等于0.3,尝试输出a+b+c的值,如下图:

    因为浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是 因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。修改如下:

    import java.math.BigDecimal;
    public class Test {
    public static void main(String args[]) { 
    	add();
    }
    public static void add(){
        BigDecimal a1 = new BigDecimal ("0.1");
        BigDecimal b1 = new BigDecimal ("0.1");
        BigDecimal c1 = new BigDecimal ("0.1"); 
        System.out.println(a1.add(b1).add(c1).doubleValue());
        if(a1.add(b1).add(c1).doubleValue()==0.3){
        	 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();
        arr.value=100;
    }
    }
    class MyClass{
        public int value=1;
    }
    

    5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
    当拼接次数多的时候,使用String方法会消耗大量的性能和时间,因为每次String拼接时都会建立一个新的对象,随着拼接次数的增多,性能消耗、时间消耗会大量增加,这个时候应该使用StringBuffer方法。

    public class test {
        public static void main(String[] args) {
           String cc = "chengyifei";
           long t1=System.currentTimeMillis(); 
           for(int i=0;i<10000;i++){
        	   cc = cc + "chengyifei"; 
           }
           long t2=System.currentTimeMillis();
           System.out.println((t2-t1)/1000f);       //string类的用时
          
           StringBuffer aa = new StringBuffer();
           long t3=System.currentTimeMillis(); 
           for(int i=0;i<10000;i++){
        	   aa.append("chengyifei"); 
           }
           long t4=System.currentTimeMillis();
           System.out.println((t4-t3)/1000f);    //stringbuffer类的用时
           
        }
    }
    

    用以上代码运行的结果是:

    显然用StringBuffer类耗时更少,性能更好。

    (二)实验总结

    1.评分系统

    • 程序设计思路:
      定义一个长度为10的数组,通过五次循环,为每次选手的十次分数赋值,每次循环中,先求最大值,最小值,再将分数总和减去最大值最小值除以8得出平均分,存到另一个数组中,最后将平均分排序倒序输出。
    • 实验问题分析:
      问题:无法输出平均分。
      原因:平均分为double类型,总分,最大值与最小值均为为int型。
      解决方案:
    	for(int x=0;x<score.length;x++){
    		sum = sum+(double)score[x];
    	}
    	max = (double)max(score);
    	min = (double)min(score);
    

    将整数型 强制转换成double型

    2.email有效地址验证

    • 程序设计思路:
      将用户输入的邮箱字符串,传递到我的判断方法中,分别用startWith,endWith,indexof来判断是否符合规则。
    • 暂无问题

    3.字符串统计

    • 程序设计思路:
      首先将输入的字符串,按照“,”分隔开存放到一个字符串数组s[]中,再把每个独立字符串中的“.”后面的字符串存放到另一个字符串数组p[]中,将s[]字符串数组中的每个字符串第一位分隔开换成大写再与后续相连接,再分别输出可以将每个文件名输出,用三个循环嵌套,统计p[]中重复出现的字符串则是对文件类型的统计,后续输出。
    • 实验问题分析:
      问题:对最后输出的xx类型的文件有xx个,数量统计不正确。
      原因:p[]数组中即使比较过的字符串也会重复比较
      解决方案:设置第三个循环,如果遇到已经出现过的文件名则跳出循环。

    4.身份证识别

    • 程序设计思路:
      把输入的身份证号字符串分成三个部分,利用三个方法,来判断地址,性别,出生年月,省市可以用二维字符串数组来存放
    • 实验问题分析:
      问题:程序不能正常执行,地址不能正常输出
      原因:数组长度越界
      解决方案:将原有的add[6][7],改成add[7][8],增加了长度。

    (三)代码托管

    (四)学习进度条

  • 相关阅读:
    C系统,操作符和词法元素
    值类型和引用类型
    WPF
    C#版本进化
    快速排序
    C语言字符串
    查找
    简单快速排序
    PHP运行出现Notice : Use of undefined constant 的解决办法
    vs2010 修改注释模板
  • 原文地址:https://www.cnblogs.com/cheng666/p/6623525.html
Copyright © 2020-2023  润新知