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

    JAVA第二次作业

    (一)学习总结

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

    equals()方法

    个人理解:String类的equals()方法和的区别就在于:通过equals()方法对比内容,通过对比地址。例如

    String str1=new String("str");
    String str2=new String("str");
    

    这里新建了两个String类型的变量str1,str2,那么如果用equals()方法和==对这两个变量进行比较,结果会是什么?

    System.out.println(str1==str2);
    System.out.println(str1.equals(str2));
    

    可以看到,明明两个变量的内容都是“str”,但是通过==对比得出的结果是false,为什么?

    同理,我们再新建两个变量,分别对比

    String str1="str";
    String str2="str";
    System.out.println(str1==str2);
    System.out.println(str1.equals(str2));
    


    结果显示两个true,为什么?这是因为在第一个例子中,通过new String分别赋予了两个变量新的地址,也就是str1指向地址1,,str指向地址2,虽然它们的内容都是“str”,但地址指向不同的位置,通过对比地址所得到结果自然也是false;而在第二个例子中,两个变量没有使用new String方法来创建新的地址,而是直接指向str,也就是str1和st2是从同一个地址取值,通过对比得到的结果则是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;
    	}
    }
    

    编译

    出现错误。原因:想要通过在Foo类中定义的Foo(int intValue)方法来实例化,需要在方法中加入相同类型的数据,在Foo()方法中需要加入int类型的数据。

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

    这样即可编译运行,也可以通过下边的方法来解决问题,加入个传入空参时使用的方法

    public class Demo {
    	public static void main(String args[]) { 
    	   Foo obj = new Foo();
    	   obj=new Foo(1);
    	   Foo foo = new Foo(1);
    	 }     
    }
    class Foo{
    	int value;
    	public Foo(){
    		
    	}
    	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进行数学计算时有一个原则,就是double和float用来做科学计算,商业计算中(也就是日常使用的时候)最好使用java.math.BigDecimal

    修改如下

    import java.math.BigDecimal;
    public class Demo {
        public static void main(String args[]) { 
            double a = 0.1;
            double b = 0.1;
            double c = 0.1;
            if(add(add(a,b),c) == 0.3){
                System.out.println("等于0.3");
            }else {
                System.out.println("不等于0.3");
            }
        }    
        public static double add(double d1,double d2){
            BigDecimal b1=new BigDecimal(Double.toString(d1));
            BigDecimal b2=new BigDecimal(Double.toString(d2));
            return b1.add(b2).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;
    }
    

    结果

    原因:只是声明了数组并但没有对其进行实例化,而当对空指针进行操作时就会出现该错误。

    修改

    public class Demo {
       		public static void main(String[] args) {
        	    MyClass[] arr=new MyClass[3];
        	    for(int i=0;i<arr.length;i++){
        	    	arr[i]=new MyClass();
        	    }
        	    arr[1].value=100;
        	}
    	}
    	class MyClass{
    		public int value=1;
    	}
    

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

    String 和 StringBuffer 的区别,就是常量和变量的区别,其中String的内容不可被修改,重新赋值也只是隐形创建新对象,释放原对象,而StringBuffer的内容可被修改,可通过方法实现对其内容的操作,效率更高。

    通过String将字符串进行10000次链接操作所需时间

    public class Demo{
    	public static void main(String args[]){
    		String str="str";
    		String str1="";
    		int n=10000;
    		long star=System.currentTimeMillis();
    		for(int i=0;i<n;i++){
    			str1+=str;
    		}
    		long end=System.currentTimeMillis();
    		long time=end-star;
    		System.out.println(time);
    	}
    }
    

    结果

    通过StringBuffer将字符串进行10000次链接操作所需时间

    public class Demo{
    	public static void main(String args[]){
    		String str="str";
    		StringBuffer str1=new StringBuffer();
    		int n=10000;
    		long star=System.currentTimeMillis();
    		for(int i=0;i<n;i++){
    			str1.append(str);
    		}
    		long end=System.currentTimeMillis();
    		long time=end-star;
    		System.out.println(time);
    	}
    }
    

    结果


    可以看出,StringBuffer的效率比String不知道要高到哪里去了 更高。
    参考自String类和StringBuffer类的区别,String与StringBuffer的区别,想了解更加具体的区别可以自行查看

    6.其他

    在java中有很多预置好的类和方法,在写程序之前一定要去查阅一下相关信息,因为这或许会让编程变得轻松很多(傻不拉几费半天劲写完email之后才看到别人写的都是直接使用indexOf()啊endwith()啊啥的(;¬_¬)啊......)

    (二)实验总结

    实验内容:

    1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。

    • 程序设计思路:输入分数,分数之间用指定好的字符隔开,对成绩进行排序,第一个是最小值,最后一个是最大值,掐头去尾留中间再求平均分,得到该选手的最终成绩,所有选手的平均分排序后倒序输出。

    • 总结:求最高分和求最低分可以通过多种方式取得,个人感觉通过java自带的方法进行排序后得到的首尾即最小最大值得方法更加简便,当然也可以写个方法来专门求极值,删除后再进行排序。

           java.util.Arrays.sort() ;
           public static int[] delete(int temp[]){		//去掉最高分和最低分
               int te[]=new int[temp.length-2];
       	    System.arraycopy(temp, 1, te, 0, temp.length-2);
       	    return te;
           }
      

    2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )

    • 程序设计思路:先判定“@”和“.”:设置一个常量为0,采用for()循环先后判定是否具有“@”和“.”,如果有,常量自增,检查完后通过if()判断常量是否为2,true则继续,false则提示错误,其中“@”不能为首位;再判定结尾是否有效:取出“.”后的全部字符,通过equals()方法一次对比,true则提示输入地址有效,false则提示错误。

    • 问题:@与.的检查无法实现

    • 原因:使用多个if()进行多次判断太过冗杂

    • 解决方案:添加自增常量即可实现,也可使用indexOf()方法

       int n=0;
       for(int i=0;i<temp.length;i++){
       	if(temp[i]=='@'){
       		n+=1;
       		for(int j=i+1;j<temp.length;j++){
       			if(temp[j]=='.'){
       				n+=1;
       			}
       		}
       	}
       }
       if (n!=2){
       	return false;
       }
      

    3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。

    • 程序设计思路:与评分系统和Email验证大致相同,扩展上两个题的功能即可。在首字母大写时先通过Character.isDigit()判断是否是数字,false则继续通过Character.isLowerCase()判断大小写。
      在输出文件类型个数时要将全部的格式放入一个字符串数组中进行查重操作后再输出。

    • 问题:最后的文件类型个数的查重输出不能达到预计的效果

    • 原因:设置了两个for()循环来查重,第二个for()的范围设置成了小于第一个正在自增的值

    • 解决方案:第二个for()从最后一位开始,且范围为第一个循环的自增值

       for(int i=0;i<str2.length;i++){		//查重并输出
       	    int n=0;
       	    for(int j=str2.length-1;j>i;j--){
       		    if(str[j].equals(str[i])){
       			    n+=1;
       		    }
       	    }
       	    if(n==0){
       		    System.out.println(str[i]+":"+m[i]+"个");
       	    }
       }
      

    4.身份证识别:公民身份证号码由十八位数字组成。从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。顺序码的奇数分配给男性,偶数分配给女性。编写一个识别身份证基本信息的小工具,输入一个居民身份证号,则输出居民所属省份(直辖市、自治区),生日(格式:xxxx-xx-xx)和性别信息。

    • 程序设计思路:输入18位数字,先取出前两位判定是否有效,true则继续依次取出出生日期及后续的顺序码,最后一位校验码则需要另写算法,在此程序中没有写出来。
    • 总结:提前在方法中设置好数据,通过if()判断即可。

    (三)代码托管

    • 码云commit历史截图

    (四)学习进度条

    代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
    目标 5000行 300小时
    第2-4周 300/300 15/15 学习了用Scanner从控制台输入和随机数的创建和应用
    第5周 500/500 25/25 String和char[]等之间的相互转化
    第6周
  • 相关阅读:
    HttpServletRequest字符集问题
    原码反码补码
    无符号1byte转int
    初识spark的MLP模型
    冗余系统必要性
    shiro的rememberMe不生效
    阅读笔记-异常
    优雅的处理异常
    使用Maven搭建SpringMVC
    Jmeter发送soap请求
  • 原文地址:https://www.cnblogs.com/yamito/p/6619131.html
Copyright © 2011-2022 走看看