《Java技术》第二次作业


Java第二次作业


一 . 学习总结

1 . String类的equals()方法及其实现方法

  • equals()方法截图

  • equals()方法判断的是字符串内容,字母的大小写必须相同

  • equalsIgnoreCase()方法判断的是字符串内容,不区分字母大小写

  • compareTo()方法按照字典顺序,字母按照Unicode值比较,区分字母大小写

  • 注意equals()方法与的区别,equals()方法比较的是字符串的内容,而比较的是字符串存储的地址

  • 综合实例 :
    import java.util.Scanner;
    public class exciese {
	public static void main(String args[]) {
		System.out.println("请输入字符串 : ");
		Scanner Scan = new Scanner(System.in);
		String str = Scan.nextLine();
		String str1 = "hello";
		// equals方法
		System.out.println("equals方法 : ");
		if (str1.equals(str)) {
			System.out.println(" true");
		} else {
			System.out.println(" false");
		}
		// equalsIgnoreCase方法
		System.out.println("equalsIgnoreCase方法 : ");
		if (str1.equalsIgnoreCase(str)) {
			System.out.println(" true");
		} else {
			System.out.println(" false");
		}
		// compareTo方法
		System.out.println("compareTo方法 : ");
		if (str1.compareTo(str) > 0) {
			System.out.println(" 1");
		}
		if (str1.compareTo(str) < 0) {
			System.out.println(" -1");
		}
		if (str1.compareTo(str) == 0) {
			System.out.println(" 0");
		}
		// ==方法
		System.out.println("==方法 : ");
		if (str1 == str) {
			System.out.println(" true");
		} else {
			System.out.println(" false");
		}
	  }
    }

2 .构造方法及其构造方法的重载

  • 构造方法 :
    是一种特殊的方法,构造方法的名字必须与定义他的类名完全相同,并且没有返回类型,使用new关键字创建一个对象时需要调用构造方法,构造方法的作用是初始化对象。

  • 构造方法的重载 :
    构造方法的重载 条件1 参数类型不同,条件2 参数个数不同。

  • 此实例是不可以重载的,因为实例化对象时,调用的构造方法并不是构造的有参数的构造方法

  • 修改方法1 : 构造一个无参方法,进行调用
    public class Test {
	    public static void main(String args[]) {
		    Foo obj = new Foo();
		    System.out.println(obj);
	    }
    }
    class Foo {
	    public Foo() {}
    }
  • 修改方法2 : 调用的方法中,添加一个参数
    public class classcode {
	    public static void main(String args[]) {
		    Foo obj = new Foo(3);
		    System.out.println(obj);
	    }
    }

    class Foo {
	    int value;
    	public Foo(int intValue) {
		    value = intValue;
	    }
    }

3 .对于处理精度损失问题,使用java.math.BigDecimal类

  • 运行程序后,结果为:0.30000000000000004

  • 出现以上结果的原因是:float与double是不需要准确的计算结果的精度

  • 解决方案:需要使用java.math.BigDecimal类的方法计算准确结果

  • 修改代码如下:

    import java.math.BigDecimal;
    public class Test {
    	public static void main(String args[]) {
    		double a = 0.1;
    		double b = 0.1;
    		double c = 0.1;
    		double d = a + b + c;
    		int len = 1;
    		System.out.println("加法运算: " + round(d, 1));
    	}
    
    	public static BigDecimal round(double d, int len) {
    		BigDecimal d1 = new BigDecimal(d);
    		BigDecimal d2 = new BigDecimal(1);
    		return d1.divide(d2, len, BigDecimal.ROUND_HALF_UP);
    	}
    }  
    

4 .static的声明使用要求

  • 运行后的程序的结果是:

     Exception in thread "main" java.lang.NullPointerException
             at classcode.main(classcode.java:15)
    
  • 出现以上错误的原因是:
    主方法是声明为static的方法,此方法只能访问类的static数据成员或调用类的static的成员方法,不能访问类的非static数据成员或调用类的非static的成员方法。

  • 修改后的程序是:

    public class Test {
        public static void main(String[] args) {
        	MyClass[] arr = new MyClass[3];
    	    arr[1].value = 100;
    	    System.out.println("arr[1].value = " + arr[1].value);
        }
    }
    class MyClass {
        public static int value = 1;
    }
    

5 .String类与StringBuffer类的功能与使用区别

  • String声明的变量是不可改变的,当你用String声明一个变量时,在堆中会为字符串分配一个空间,当你做完连接操作后,堆会新生成一个空间来存放新连接的字符串,之后再分配一个新空间放连接完整的字符串,证明已经连接成功。
  • 实例:
    public class Test {
        public static void main(String[] args) {
            String str = "abc";
            System.out.println(str.hashCode());
            for(int i=0;i<10;i++){
        	    str = str + "d";
        }
            System.out.println(str);
            System.out.println(str.hashCode());
        }
    }
  • 运行结果为:
    96354
    abcdddddddddd
    733799522
  • 注:在Java中是不可以返回对象的地址并输出的,所以使用hashcode()方法,把地址转化成整数进行输出,输出的并不代表实际地址。但是此结果说明两个字符串并不是同一个地址。String方法连接字符串浪费空间,不方便。
  • StringBuffer的方法:
  • public StringBuffer append(String str)
    将str添加到当前字符串缓冲区的字符串的末尾
  • public StringBuffer insert(int offset,String str)
    在当前字符串缓冲区的字符串的下标offset插入str,如果offset等于旧长度,则str添加在字符串缓冲区的末尾。
  • 实例:

     public class classcode {
         public static void main(String[] args) {
     	    StringBuffer str = new StringBuffer("abcde");
     	    for (int i = 0; i < 10; i++) {
     		    str.append("fg");
     	    }
     	    System.out.println(str);
     	    str.insert(2,"fg");
     	    System.out.println(str);
         }
     }
    
  • 运行结果:
    abcdefgfgfgfgfgfgfgfgfgfg
    abfgcdefgfgfgfgfgfgfgfgfgfg
  • 使用StringBuffer()方法比String更简便,空间不会浪费。

6 .其他知识总结

  • 使用Eclipse关联jdk源代码

Exlipse常用快捷键:

  • ctrl+s 保存 ctrl+a 全选 ctrl+c 复制 ctrl+v粘贴 ctrl+z 撤销 ctrl+x 剪切 ctrl+1 快速修改 ctrl+shift+f 格式准确化

常用操作:

  • 界面乱的解决方法:窗口->复位透视图
  • 找不到控制台或某些窗口解决方法:窗口->显示视图->点击进行添加或者窗口->显示视图->点击进行添加->其他
  • Exlipse编辑器字体设置:窗口->首选项->常规->外观->颜色和字体->基本->文本编辑器区字宽选择

二 .实验总结

1 .评分系统

  • 程序设计思路:
    使用三个方法,在主方法进行循环输入分数,按逻辑调用方法,求出选手分数,使用数组方法,进行排序,循环输出。
    public static double max(double score[])
    public static double min(double score[])
    public static double sum(double score[])

  • 问题1:把选手的分数求出如何放进数组,循环输出错误

  • 原因:数组声明放错地方,排序后的数组按从小到大排序,要求应该从大到小进行输出,循环输出时,变量值控制错误

  • 解决方案:

        double AvgArr[] = new double[5];
        //循环与调用方法代码段
        for(int i=0;i<AvgArr.length;i++){
    		System.out.println("第" + (i+1) + "个选手的分数为" + AvgArr[i]);
        }
        Arrays.sort(AvgArr);
    	System.out.println("从高到低排序为 : ");
    	for(int i=AvgArr.length-1;i>=0;i--){	
    		System.out.println(AvgArr[i]);
    	}			
    

2 .Email验证

  • 程序设计思路:
    使用一个方法,在主方法中调用输出,如果正确返回true,否则返回false
    public static boolean select(String str)

  • 问题1:如何判断这四个条件成立
    A: @和.同时存在
    B: @在.之前
    C: 不能@开头
    D: 以com|cn|net|gov|edu|org结尾

  • 原因:还不能准确并正确的使用String类的方法,并且不了解他们的功能

  • 解决方案:

    int locate1 = str.indexOf("@");
    int locate2 = str.indexOf(".");
    if (locate1 != 0 && locate2 != 0 && locate1 < locate2 &&  locate1 != 0) 
    if (str.endsWith("com") || str.endsWith("cn")
    	|| str.endsWith("net") || str.endsWith("gov")
    	|| str.endsWith("edu") || str.endsWith("org"))
    

3 .统计文件

  • 程序设计思路:
    使用方法进行调用,在主方法中输入文件名,在调用方法中进行判断,文件名输入是否用“,”分隔,判断输入的文件名的扩展名是否相同,输出不同类型文件的个数。
    public static void Statistic(String str)

  • 问题1:开始不知道如何判断扩展名相同,之后统计文件数错误,要么统计少一种文件扩展名,要么就是有一种统计少一个

  • 原因:运用for循环进行判断时,会使字符串下标多加1,所以就会少判断一种文件扩展名

  • 解决方案:
    首先定义记录与扩展名相同的字符串的位置sign,再定义记录相同文件个数的变量number,当字符串数组下标i小于最大长度时,让第一个与下一个进行比较,相同number加1,j加1,第一个与下一个进行比较,如果第一个与每一个判断完,让i与你所记录的位置sign比较,如果二者不等,输出相同文件名,i++进行第二个字符串与其他字符串的比较,
    注意: 如果使用for循环,要明白循环的规则

    while (i < str2.length) {
    	int number = 1;
    	int j = i + 1;
    	while (j < str1.length) {
    		if (str2[j].equals(str2[i])) {
    			number++;
    			sign = j;
    		}
    		j++;
    	}
    	if (i != sign) {
    		System.out.println(str2[i] + "	" + number + "个");
    	}
    	i++;
    }
    

4 .身份证识别

  • 程序设计思路:
    使用方法,在主方法调用,在主方法进行输入身份证号,在调用方法进行实验要求的判断与输出

  • 问题1:不能正确输出省份,输出的时候会输出0,循环时,出现错误

  • 原因:字符串不能转化成字符数组,不能将字符数组转化成整型数组,与地址码不符合,输出错误,并且会输出0

  • 解决方案:
    先定义一个字符串类的数组对省份进行静态初始化。
    然后将字符串类的数组进行转化,先转化字符型数组,再转化为整型数组,对整型数组进行双层循环,整型数组数据与字符串数组对应的值相对应,最后对字符串数组的内容进行输出

  • 注意:重庆市对应的值不可以在循环中进行输出,他的值为50,应该进行单独输出
        int[][] intArray = new int[str1.length][str1.length];
		String str2 = str.substring(0,2);
		char charArray[] = str2.toCharArray();
		int[] intArray1 = new int[2];
		for(int i=0;i<2;i++){
			intArray1[i] = intArray1[i] * 10 + charArray[i]-'0';
		}
		for (int i = 0; i < intArray.length; i++) {
			for (int j = 0; j < intArray[i].length; j++) {
				if(intArray1[0]*10+intArray1[1] == ((i+1)*10 +  (j+1))){
				System.out.println("所在省份是 : " +   str1[intArray1[0]-1][intArray1[1]-1]);
				}
			}
		}
		if(intArray1[0]*10 == 50){
			System.out.println("重庆市");
		}

三 . 代码托管

  • 码云commit历史截图


四 .学习进度条

进程 代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 500/500 45/45 自学了前四章的内容,自己练习了学习过程中的所有代码,并写了一些练习题提交到了码云中
第5周 200/700 15/60 学习了老师要求的内容
第6周

posted @ 2017-03-25 23:22  Melody529  阅读(283)  评论(1编辑  收藏  举报