• java第二次实验作业


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

    ‘==’比较的是字符的地址 ‘equals’比较的是字符串的内容
    例:
    截图

    public class lianxi {
    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));
    }
    

    }

    截图

    public class lianxi {
    public static void main(String[] args){
    String str1 ="hello";
    String str2 =new String("hello");
    String str3=str2;
    System.out.println("str1str2->"+(str1str2));
    System.out.println("str1str3->"+(str1str3));
    System.out.println("str2str3->"+(str2str3));
    }
    }

    ‘==’比较的地址不相同 所以有false,而‘equals’比较内容则都是true

    2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
    构造方法是一种特殊的方法,与一般的方法不同是:
    1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
    2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
    3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
    方法重载就是同一个方法名,不同的传参。

    这个程序构造函数Foo()未定义 应该改为
    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");
        }
    }     
    

    }

    double或float是不需要准确计算精度的数字可以用的,而这个需要精确的计算小数点后面的位数
    应该改为

    import java.math.BigDecimal;
    public class lianxi {
    	public static void main(String args[]) { 
            BigDecimal b1 = new BigDecimal ("0.1");
            BigDecimal b2 = new BigDecimal ("0.1");
            BigDecimal b3 = new BigDecimal ("0.1");     
            if(b1.add(b2).add(b3).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 lianxi {
    	public static void main(String[] args) {
    		MyClass[] arr={new MyClass(),new MyClass(),new MyClass()};
    	    arr[1].value=100;
    	}
    
    
    	}
    	class MyClass{
    	    public int value=1;
    }
    

    5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
    通过在网上查阅资料,了解到由于String类是不可变的,每次对其改变都要创建新字符串对象,所以它是最慢的; StringBuilder不需要执行同步操作,速度要比StringBuffer快

     public static void main(String[] args) {
              long begin = System.currentTimeMillis();
              StringBuilder sb = new StringBuilder();
              for(int i=0;i<10000;i++){
                  sb.append(i);
              }
              long end = System.currentTimeMillis();
             long time = end - begin;
              System.out.println(time+"");
        }
     
     }
    
    
    同样循环调用10000次,换成StringBuffer,结果是5毫秒。
    
    
       public static void main(String[] args) {
          long begin = System.currentTimeMillis();
          String str = "";
          for(int i=0;i<10000;i++){
              str = str+i;
          }
          long end = System.currentTimeMillis();
          long time = end - begin;
          System.out.println(time+"");
     }
     
    
    
     用String,循环调用10000次,得出的结果是639毫秒
    

    (二)实验总结
    1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
    ①程序设计思路
    先写一个输入,利用for循环 输入十次,再用一个for循环套在外面,使得能够循环5次,得出五个学生的总成绩,设计一个求最大值最小值的函数程序,返回最大最小值,用总成绩减去最大值最小值并除以8就能得到成绩,之后利用冒泡排序程序,得出成绩的顺序。
    ②问题1
    在算成绩时一直显示的跟计算器算出来的不一样
    ③原因
    除号用错了,用的求余的符号
    ④解决方案
    将%改为/
    问题2:
    之前函数调用一直出错,
    解决方案:

    public static void paixu(double d[])
    

    类名换成了上面的写法,原来是在函数里面定义的 d[]
    2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
    程序设计思路
    用的int aite = email.indexOf("");
    来定义‘@’和‘.’,通过判断符号的地址来判断这俩符号的前后位置,在判断以什么结尾时,用的endsWith("");

    3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
    程序设计思路
    String s[] = str.split("\,") ;来将输入的数据按逗号来分离,之后利用for循环将分开的数据输出
    在将循环的次数输出就是分开的个数

    (三)代码托管

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

    | 项目 | 代码行数(新增/累计) | 学习时间(新增/累计) |本周学习内容 |
    | -------- | -----: | :----: |
    | 目标 | 5000行 | 300小时 |
    | 第2-4周 | 234/300 | 41 |
    | 第5周 | 123/300 | 28 |学会了indexof的使用,学会了用符号将一段数据分隔的方法,复习了函数调用
    | 第6周 | | |

  • 相关阅读:
    [LeetCode] 1081. Smallest Subsequence of Distinct Characters 不同字符的最小子序列
    [LeetCode] 1080. Insufficient Nodes in Root to Leaf Paths 根到叶路径上的不足节点
    [LeetCode] 1079. Letter Tile Possibilities 活字印刷
    [LeetCode] 1078. Occurrences After Bigram 双元语法分词
    [LeetCode] 1074. Number of Submatrices That Sum to Target 元素和为目标值的子矩阵数量
    [LeetCode] 1073. Adding Two Negabinary Numbers 负二进制数相加
    [LeetCode] 1072. Flip Columns For Maximum Number of Equal Rows 按列翻转得到最大值等行数
    [LeetCode] 1071. Greatest Common Divisor of Strings 字符串的最大公因子
    [LeetCode] 1054. Distant Barcodes 距离相等的条形码
    [LeetCode] 1053. Previous Permutation With One Swap 交换一次的先前全排列
  • 原文地址:https://www.cnblogs.com/JoeH/p/6626321.html
Copyright © 2020-2023  润新知