zoukankan      html  css  js  c++  java
  • 201421123042 《Java程序设计》第2周学习总结

    1. 本周学习总结

    以几个关键词描述本周的学习内容。并将关键词之间的联系描述或绘制出来。
    原则:少而精,自己写。即使不超过5行也可,但请一定不要简单的复制粘贴。
    引用类型 引用类型是指向一个对象,感觉跟以前学的指针有点类似,但是一般要使用new来初始化。
    包装类 可以自动装箱将基本类型转换成Integer类型,自动拆箱将Integer类型自动转换成int。
    字符串池字符串池可以看成字符串的一个集合,具有相同字符串序列的字符串在池子里只有一个。
    一维数组 与C语言里面的数组一样,数组中的元素都具有相同的数据类型,也可以用统一的数组名和数组下标来访问数据。但是在JAVA中声明数组时不能指定数组长度。

    2.书面作业

    1.String-使用Eclipse关联jdk源代码
    1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?
    ①由于我不知道String在哪个包里,通过百度:

    于是我找到了jdk文件下src将src解压后打开java文件夹,再打开lang文件夹,在众多java文件夹中找到String.java文件。

    从String.java文件的开头可以看到字符串是常量:

    ②根据老师提供的参考资料的方法,可以先打开eclipse,然后输入String,按住ctrl然后点击String,就会自动弹出String的源代码:

    所以字符串是存储在字符串常量池中。通过内部代码也可以看出,String内部其实是用字符数组char[]来存放数据的。

    1.2分析其构造函数public string(char value[])的作用?
    通过查看源代码,String的构造函数有5种,①String() ②String(String original) ③String(byte[] bytes) ④String(char[] value) ⑤String(StringBuffer buffer)
    分析第四种,参数为字符数组的构造方法 String(char[] value)

        /**
         * Allocates a new {@code String} so that it represents the sequence of
         * characters currently contained in the character array argument. The
         * contents of the character array are copied; subsequent modification of
         * the character array does not affect the newly created string.
         *
         * @param  value
         *         The initial value of the string
         */
        public String(char value[]) {
            this.value = Arrays.copyOf(value, value.length);
        }
    

    这个构造函数通过字符数组对String进行赋值,使用到了Array.copyOf(value,value.length)方法,value.length获得value数组的长度,意思就是先将输入的字符串存在一个字符数组value中,然后将value中的value.length个字符复制到this.value中。

    1.3阅读public String replace(char oldChar, char newChar)方法的代码,回答String的不可变性在该函数中如何体现?(重点)

        public String replace(char oldChar, char newChar) {
            if (oldChar != newChar) {
                int len = value.length;
                int i = -1;
                char[] val = value; /* avoid getfield opcode */
    
                while (++i < len) {
                    if (val[i] == oldChar) {
                        break;
                    }
                }
                if (i < len) {
                    char buf[] = new char[len];
                    for (int j = 0; j < i; j++) {
                        buf[j] = val[j];
                    }
                    while (i < len) {
                        char c = val[i];
                        buf[i] = (c == oldChar) ? newChar : c;
                        i++;
                    }
                    return new String(buf, true);
                }
            }
            return this;
        }
    

    不可变性体现在最后的return new String(buf,true),意思就是返回的字符串是新建的,是new出来的,不会修改原来的字符串,这样的好处是更安全。
    参考资料:

    为什么Java字符串是不可变对象?

    1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
    字符串与字符数组之间可以方便的来回转换,从String的源代码中的源代码中其实也能看出,字符串的一些方法其实还是用字符数组来实现的。不同点我觉得在于,字符串是一个常量数组,一旦被创建之后,不能再改变里面各元素的值,比较安全。另外String中有许多编写好的函数,再处理字符串的时候可以直接调用,就不用我们写底层的方法,比较方便。

    2.StringBuilder
    2.1 结合PTA -2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
    String的长度是不可变的,StringBuilder的长度是可变的。在PTA-2中使用到了StringBuilder的append方法,用来在原来字符串的后面添加内容,要是用String类型,然后进行字符串的扩充,由于String的长度是不可变的,原来的字符串没有从字符池中清除掉,会在字符池中创建新的字符串,然后内存池中就会有很多的字符串,比如说在PTA-2这一题中,会产生0,01,012,0123,01234,012345……等等字符串,就会对java程序的运行造成不好的影响。

    2.2 阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilderappend(char[] str)方法时,是如何实现添加字符的操作?
    功能是在原来的字符串后面追加内容。
    StringBuilder内部使用字符串数组存放字符。
    调用StringBuilder的append(char[] str)方法时,首先会检查原来用于存储字符串的字符串数组长度够不够存储原来的长度加新增加的长度,不够的话,先扩大再添加。够的话可以直接添加。添加主要是用到了getChars()方法。

    3.字符串与字符串池
    3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
    String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
    输出结果为true,这段代码创建了2个字符串对象,使用String str1="hi",语句时,首先再字符串池里找有没有“hi"这个对象,由于第一次执行,字符池中没有,于是就新建一个”hi“对象, 到str2="hi";语句执行时,也是首先查找字符串池里有没有”hi“这个字符串,由于第一个语句已经创建了”hi“字符串,所以可以直接引用,就不新创建对象,到了 String str3 = new String(str1);语句,new出来的对象都是在非字符串池中新建对象,所以肯定会新建一个字符串对象。

    3.2 重点:对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
    因为==比较的是两个变量的值是否相等,如果变量属于基本数据类型那么就可以直接比较,如果是引用类型比较的就是对象在内存中的地址,因为不同的对象有可能存储的值是相同的,但是他们存储的地址并不同,这两个变量用==返回的结果就可能是false。如果想要比较两个引用类型对象存储的内容是否相同,就需要使用equals,equals比较的是两个引用类型对象的内容。

    4.Wrapper(包装类)
    4.1 Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?
    Integer是int的包装类,i声明为Integer类型,但是100这个int类型的值可以赋值给I是因为Integer有自动装箱的功能。
    Integer x = 100; int y = x+1;x++; 这一串命令先自动装箱,把100转化为Integer类,在需要进行计算的时候(x+1)自动拆箱将Integer类型转换为int类型,x++也是先拆箱为int类型再装箱为Integer类型。

    4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
    在JAVA中每种基本数据类型都有相对应的包装类

    好处:①有的时候,能够被处理的数据类型只能是引用类型,使用包装类就可以将基本类型数据包装起来,就能够间接处理基本数据类型。
    ②包装类中有很多函数,方便使用。

    5.实验总结
    5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
    结对队友姓名:陈晓菲。
    结对题目:实验二中Math类应用的2.1
    结对体会:虽然我的结对队友觉得结对效果不好,但是对于我来说受益匪浅。因为我的水平不是很高,在结对过程中,队友可以给我很多好的思路。

    5.2 PTA-1综合小测验
    因为要对输入的字符串先处理,输入字符串使用Scanner进行处理。根据不同的字符串进行不同的操作,所以我想到用switch语句来完成。
    对于输入字符串fib:
    调用自己写的函数fib(int num),在主函数中只要让num,递增,就能得到斐波那契的第num个数字,再进行输出。
    重要代码:

    	public static int fib(int num){
    		if(num==1||num==2)
    			return 1;
    		
    		return fib(num-1)+fib(num-2);
    		
    	}
    

    对于输入字符串sort
    以前的思路是使用数组来存放所有的数字,然后用冒泡的方法进行排序,但是接触了Java之后,知道了Arrays类中有sort方法可以直接调用。就免去了自己编写冒泡的麻烦。

    对于输入字符串search
    使用Arrays类中的binarySearch方法,Arrays.binarySearch(chars, x);chars为数组,x为要再chars中查找的元素,如果这个数组中存在我们要查找的元素就会返回该元素的位置,不存在就会返回-1。

    对于输入字符串getBirthDate
    主要是对于输入年月日的字符串拆分出单独的年,月,日,使用到了String类的substring(int beginIndex, int endIndex);方法,可以将原来的字符串从其实位置beginIndex,截止到位置endIndex。

                                           String id = sc.next();
    					String year = id.substring(6, 10);
    					String month = id.substring(10, 12);
    					String day = id.substring(12, 14);
    				    System.out.println(year+"-"+month+"-"+day);
    

    5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
    先用String类型的数组存放身份号,然后使用String类型的SubString方法截取出年月日存放到一个变量数组data中,然后使用Arrays类中的sort方法进行排序,就能得到排序好的数组。
    降序排列:先还是得到一个升序排列好的数组,创建一个新的数组,然后使用一个for语句,从就数组的最后一个元素开始逆序赋值给新的数组,新的数组从第一个元素开始被赋值。然后得到的新的数组就是逆序的。
    按照出生月份排序:使用SubString截取的月,把月份放在最前面,然后再用sort排序,排完之后再换回来。

    5.4 PTA-4动态数组
    乘法表可以使用二维数组来存储,二维数组中的元素为String对象,可以将整个式子完整存储进去,主要是使用for循环生成式子。
    主要代码:

    for(int i=1;i<=n;i++)
    			{
    				for(int j=1;j<=i;j++)
    				{
    					str[i-1][j-1]=i+"*"+j+"="+(i*j);
    					if(j==i)
    						System.out.printf("%s"+"\n",str[i-1][j-1]);
    					else
    						System.out.printf("%-7s",str[i-1][j-1]);
    				}
    			}
    

    5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
    使用ArrayList不用操心数组的长度,它可以在程序运行时改变长度。
    ArraysList可以存储对象,方便使用。
    ArraysList类中有许多方法,可以直接使用。

    5.5 选做:5-5(浮点数计算), 5-6(枚举), 5-7(大整数相加)

    6.选做:公交卡里应该还有多少钱?请分析原因

    输出的结果4294967276,我的想法是这个数正常来说不会这么大,通过百度我知道数值在内存中是以补码的形式存放的,有一种可能就是处理数据的时候将有符号整型的负数当成了无符号整型来处理,使得最高位代表负数的1,变成了数值上的最高位。为了方便叙述我先把单位元化成分,42949672.76元=4294967276分。4294967276写成二进制为11111111111111111111111111101100,int(整型)和unsigned int(无符号整型)的性质,他们4个字节也就是32位的二进制来表示,不一样的是但int有一位是符号位(第一位是符号位,第一位为1表示负数,0表示正数),unsigned(无符号整型)则没有符号位。-20的int类型表示为1000 0000 0000 0000 0000 0000 0001 0100(第一位的1为符号位),补码为1111 1111 1111 1111 1111 1111 1110 1100,将其强制转换成unsigned int ,则1111 1111 1111 1111 1111 1111 1110 1100的第一位1就不代表负数了,代表的是数值上的1,导致这个数变得很大。实际上存储的应该是-20分,也就是欠费0.2元。

    3. 码云及PTA

    3.1. 码云代码提交记录
    在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图

    3.2 截图题集“Java基本语法”PTA提交列表

    3.3 使用老师发的jar程序统计每周的代码量

    注意:请使用学姐更新的1.0版,使用新版前请先删除以前information.txt

    4. 小任务(加分)

    实验任务书中的题目2(Math类应用)、6(一个实用的身份证信息查询程序)、8(作业随机分配)。截图运行界面和参考代码即可。
    加分考核点:新建n个大小的数组,往数组中随机填入1-100之间的整数(写成函数形式),然后统计并输出其中大于50与小于等于50的百分比(写成函数形式)。(注意:可以使用for each循环进行统计,随机数用法见参考资料)

  • 相关阅读:
    修改数据库的兼容级别
    如何写出安全的API接口
    最新IP地址数据库
    java 中的静态(static)代码块
    Java RTTI(类型信息)(.class 类对象)
    机器学习之决策树预测——泰坦尼克号乘客数据实例
    敏捷开发 —— TDD(测试驱动开发)
    Java 内存泄漏
    红顶商人 —— 胡雪岩
    各地特色美食与点菜的艺术
  • 原文地址:https://www.cnblogs.com/liao1531870282/p/7577407.html
Copyright © 2011-2022 走看看