zoukankan      html  css  js  c++  java
  • Java第二次作业

    《Java技术》第二次作业

    (一)学习总结

    1-1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法:
    在Eclipse上的菜单栏选择项目-----属性-----左侧菜单栏Java构建路径-----库-----JRE系统库-----rt.jar-----源代码连接-----外部文件-----设置外部文件的路径为JDK安装路径下的src.zip。在程序的equals处按住ctrl单击equals。


    1-2.举例说明equals方法和的区别:
    equals是用于字符串的比较,之前我们一直通过“
    ”判断是否相等,但“”只适用于数值的比较,因此String中提供了equals的比较方法;使用equals比较,若是相等返回ture,不相等返回false。
    如下的例子:
    定义了str1=hello,str2=hello,str3=world,str4=new String(“hello”)。判断str1=str2,返回ture,判断str1=str3,返回false。判断str4=str1,返回true。

    若是用“
    ”比较str1不等于str4,str4是新开辟的空间存储的hello,str1和str4的地址不同,所以结果不相等,“==”比较的是地址而不是字符串本身。
    2-1.什么是构造方法
    构造方法的方法名要和类名相同,作用是对类的初始化。

    在类中定义的person构造方法,当调用关键字new实例化对象时才会低啊用构造方法。使用构造方法要注意以下几点:

    • 构造方法名要和类名相同
    • 构造方法的声明出不能有任何的返回值类型声明
    • 不能再构造方法中是用return返回一个值

    2-2.什么是构造方法的重载
    方法的重载就是方法名相同,但是参数的个数参数的类型不同,通过传递参数的个数和参数的类型的不同可以完成不同功能的方法;构造方法和其他一样也可以是用重载。
    在程序中定义了两个person的构造方法,一个参数是String类的name;另一个是String类的name和int类的age;这就是一个构造方法的重载。
    2-3下面的程序是否可以通过编译?为什么?

    public class Test {
        public static void main(String args[]) { 
           Foo obj = new Foo();       
        }     
    }
    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");
            }
        }     
    }
    

    运行结果:

    double是浮点型数据是无法在计算机中准确表示,存在精度丢失问题。
    使用java.math.BigDecimal类修改:

    public class Test {
    	    public static void main(String args[]) 
    	    { 
    	        System.out.println("a+b+c="+MyMath.Round(MyMath.add(0.1,0.1,0.1),1));
    	    }
    }
    	        class MyMath
    		    {
    		    	public static double add(double d1,double d2,double d3)
    			    {
    			    	 BigDecimal a1 = new  BigDecimal(d1) ;
    				     BigDecimal b1 = new  BigDecimal(d2) ;
    				     BigDecimal c1 = new  BigDecimal(d3) ;
    				     return a1.add (b1).add(c1). doubleValue();
    			    }
    
    				public static double Round(double d, int i) {
    					BigDecimal a1 = new  BigDecimal(d) ;
    				    BigDecimal b1 = new  BigDecimal(1) ;
    				    return a1.divide(b1,i,BigDecimal.ROUND_HALF_UP).doubleValue();
    					
    				}	    	
    		    }
    	   
    
    
    

    运行结果:

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

    程序只是对arr数组进行了声明,并没有初始化。
    可以改为:

    public class Test {
    	    public static void main(String[] args) 
    	    {
    	        MyClass[] arr=new MyClass[3];
    	        arr[1]= new MyClass(100);
    	    }
    	}
        class MyClass
        {
        	int value=1;
            public MyClass(int i)
            {
            	value = i;
             }
    
    


    5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。
    使用StringBuffer:因为使用String中+运算需要创建对象开辟空间,而创建对象通常会降低效率,在循环中循环次数越多效率越慢;所以是用StringBuffer更好。
    使用StringBuffer所用时间:

    public class Test {
    	public static void main(String[] args) 
    	{
            int times = 10000;
            StringBuffer buf = new StringBuffer();
            buf.append("hello");
            long time1 = System.currentTimeMillis();
            for(int i = 0;i <times;i++)
            {
                 buf.append(i);
            }
            long time2 = System.currentTimeMillis();
    		long time = (time2-time1);
            System.out.println(time);
    	}
    }
    


    使用String所用时间:

    public class Test {
    	public static void main(String[] args) 
    	{
            int times = 10000;
            String str = new String();
            long time1 = System.currentTimeMillis();
            for(int i = 0;i <times;i++)
            {
            	str="hello";
                str+=str;
            }
            long time2 = System.currentTimeMillis();
    		long time = (time2-time1);
            System.out.println(time);
    	}
    }
    
    


    使用String的时间比StringBuffer的时间长。
    6.其他需要总结的:
    写程序最好用方法写 练习了方法的调用。

    (二)实验总结

    • 选手评分的程序设计思路:有5个参赛选手10个评委,评委给选手打分,求出平均分并且按顺序输出;定义一个二维数组,分别存选手和评委打分,计算平均分是需要去掉一个最高分和一个最低分,分别写两个带返回值方法,方法传递数组和i=5,两个参数,方法里设置10个评为评分的循环,找出最高分和最低分,返回值返回。计算平均分,写一个方法,把10的评为的评分相加求和,在减去最高分和最低分除8求得平均。因为成绩可能有小数,所以数组定义为double类型。
      问题1:求出的最大值和最小值是所有成绩的最大值和最小值。

      原因:两层循环,外循环导致把所有的成绩比较。
      解决方案:去掉选手的循环,直接把选手的参数传递过来。
    • 检验邮箱的程序设计思路:输入一串字符串,用if else语句判断,当满足一个条件时在判断下一个条件。
      问题2:当邮箱的格式满足 @ 不开头,其他条件也满足时,地址仍然无效。

      原因:所有的检验条件都是和循环输入在一起,也就是输入一个检验一个所结果不对。
      解决方案:输入的字符串不用数组存放,避免了输入一个检查一个。
    • 身份证号的程序思想:写一个方法把省市放在一个二维数组中,截取身份证号的前两位存放到数组中,输出数组中对应的省份;在写一个方法,截取出生日期按要求输出;第三个方法取第17位和2求余,结果余0为女生,余1为男生。主方法调用。
      问题3:输入前两位的书为11,应该是北京市。

      原因:输入的11应该是数组的下标,可以改为:

    (三)代码托管

    https://git.oschina.net/hebau_cs15/Java-CS01yxr.git

    (四)学习进度条

    代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
    目标 5000行 300小时
    第2-4周 150/300 30/30 学习了....
    第5周 220/300 30/50 学习了关于double类型存在精度问题,取指定位置和截取字符串;数组的应用
    第6周
  • 相关阅读:
    cout 格式化输出
    CreateEvent的用法
    深入理解CRITICAL_SECTION
    const型类成员
    用 const 限定类的成员函数
    C++文件读写详解(ofstream,ifstream,fstream)
    C++中回调函数(CallBack)的使用
    SetTimer函数的用法
    CString转换成int CString类相应函数
    自己设计并制作了一个自己主动温度控制系统
  • 原文地址:https://www.cnblogs.com/errui/p/6621806.html
Copyright © 2011-2022 走看看