201621123037《Java程序设计》第二周学习总结

Week02-Java基本语法与类库


1. 本周学习总结

  • 关键词:常量池、对象、null、不可变性、string对象拼接、字符串池
  • 关键概念之间的联系:Java中有常量池,超出常量池以外的就会新开辟内存空间。如String x="abc";x不是存放"abc",而是指向它的对象。比较特殊的null这个在Java中不等同于0,代表没有值。Java中String类具有不可变性,如果不停地进行字符拼接来修改字符串时,每次更改后的字符串是一个新的面向对象,而原来的字符串不会消失仍占用内存空间(系统可以定时清除占用空间),所以用String来频繁修改字符串时会占用大量空间,故当字符拼接操作量大的时候,则应运用StringBuilder来进行拼接。被“”包裹起来的字符串字面常亮会先在字符串常量池中进行查找,如果有则不创建。

2. 书面作业

1.String-使用Eclipse关联jdk源代码

1.1 查看String对象的源代码(截图),分析String使用什么来存储字符串?

答:String使用存放变量,但对象本身不存放在栈中,而是存放在或者常量池中(字符串常量对象存也放在常量池中)。其中的堆使用new得出的对象,常量池是在堆中开辟的一块区域存放基本常量。String用char[]数组存储字符串,不过没办法动态增加数组长度。

1.2 分析其构造函数public String(char value[])的作用?

答:函数输入的参数为字符数组类型,通过函数内的运算之后,输出返回值,返回值类型为字符串类型。

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

public String replace(char oldChar, char newChar)方法的代码如下:

答:由于String的不可变性,字符串拼接的话将会占用大量内存空间。所以代码中创建和原来字符数组一样大小的buf数组,改成对数组的改变。

1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?

答:String初始化创建的字符串常量被定义为只读,也就是说没办法对定义后的字符串进行修改;而字符串数组存放的是若干个元素,是可以对单个字符进行修改的。在大部分情况下String和字符数组可以互换使用,但是若要修改字符元素,则不能用String。虽然字符数组很灵活,但是String可以加快字符串处理速度。

2.StringBuilder

2.1 结合PTA -2(StringBuilder) ,说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?

答:
由于String具有不可变性,如果不停地进行字符拼接来修改字符串时,每次更改后的字符串是一个新的面向对象,而原来的字符串不会消失仍占用内存空间(系统可以定时清除占用空间),所以用String来频繁修改字符串时会占用大量空间,故当字符拼接操作量大的时候,则应运用StringBuilder来进行拼接。

2.2 阅读jdk文档,查询StringBuilder的append(char[] str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)方法时,是如何实现添加字符的操作?

ava.lang.StringBuffer.append(char[] str) 方法追加char数组,即str参数为这个序列的字符串表示形式。数组参数的字符追加的顺序到这个序列的内容。这个序列以该参数的长度增加它的长度。

答:StringBuilder的内部使用字符数组来实现的,数组可以进行动态扩展。当输入字符后,先存放到缓冲区中,然后转换成字符数组添加到StringBuilder中。

3.字符串与字符串池

3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:

String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
答:
输出结果为true,创建了两个对象。首先初始化str1时创建"hi"常量字符串放入到常量池中,当再创建str2时,则会优先在常量池中搜索,若搜索到则指向相同的对象,若未搜索到就创建放常量池中。而str3则是直接在内存开辟空间创建对象。所以上述的str1和str2指向的是同一个面向对象,所以答案为true.

3.2 重点:对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?

答:
比较的"=="是用来比较两个变量本身的值,即两个对象在内存中的首地址。而引用类型new创建的话,则会出现内容相同但是地址不同的状况。若想要比较,可以用“equals()”比较字符串中所包含的内容是否相同。

4.Wrapper(包装类)

4.1 Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?

答:
Integer i = 100; 自动装箱,基本类型->Integer类型
Integer x = 100; int y = x+1;x++;包含了 自动装箱(100转换成Integer类型);然后自动拆箱将Integer类型转换为int类型;最后是自动拆箱(Integer类型转换为int类型)后加一再自动装箱回Integer类型。

4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?

答:
因为在实际生活中,很多问题不单单是一个基本数据类型可以解决,当输入端错误或空时,基本数据无法表示这种状况,而包装类中可以很好的表示出来。加之基本数据类型之间的转换比较麻烦,定义包装类可以更加方便,解决问题更加全面。

5.实验总结

5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。

推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。

合作对象:姚雯婷
答:关于结队编程这个,最开始有和舍友尝试一起写一道题,但是在我们一同审题判断时,产生很大分歧,两个人思路差异有点大,然后我们就两个互相尝试自己的办法打代码,不过这样的话后面就没办法交流了,最后都是各自解决问题,最多在格式上有所互助。所以感觉结队代码的方式应该比较适合两个人打完之后交流,或者在更改格式啊或者小地方进行交流,不然的话是没办法进行互助交流的。

5.2 PTA-1综合小测验

答:
这道题四大部分:

  • fib部分主要是编写 斐波那契数列,只要会编写函数很好解决;
  • sort部分则需要用String[] str1=input.nextLine().split(" ");来创建数组,达到分离的目的。再将转换成int类型进行排序,后输出。这道题的关键是输出格式,原先采用自己打的方式一直报错,后来发现Arrays.toString(num)可以输出要求格式。不过到现在也不太明白之前的输出格式有什么错误。

System.out.print("[");
for (j= 0; j<num.length; j++) {
if(j==0) {
System.out.print(num[j]);
}
else {
System.out.print(", "+num[j]);
}
}
System.out.print("]");

  • 关于search部分,只要学会创建静态变量,将sort中的数组定义为全局变量就可以完成。
  • getBirthDate,重点学会str.substring(start,end)函数的应用。

5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?

答:
这道题的sort1和上一题差不多,比较好些。重点是sort2部分,刚开始百度想用Array.sort(类型,start,end)函数进行总排序,后来发现存入信息的id数组相当于一维数组下的字符串数组,没办法这么应用。之后在实验课上听讲到用冒泡法进行排序,这样需要改变顺序的时候整个id数组交换即可。

5.4 PTA-4动态数组

答:
这道题需要搞清楚每一行和数组下标的关系,在双层for循环中,如果i,j从一开始,则对应的下标应该减一。并且应该注意一行末尾最后一次打印应该不同。

5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?

答:
加上头import java.util.ArrayList;
首先学会创建ArrayList list = new ArrayList();(String)则是拿出来的时候为字符串类型。
这道题主要学会以下函数即可:
ch.contains("!!end!!")
list.add(0, "begin");
list.indexOf(str1)
list.lastIndexOf(str1)
list.get(0)
list.remove(0)
size()与isEmpty()

ArrayList是动态数组,有以下好处:
(1)动态的增加和减少元素
(2)灵活的设置数组的大小

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

5-5:本题主要运用BigDecimal类,开头加入import java.math.BigDecimal;,创建使用BigDecimal d = new BigDecimal(b); 和 函数 a.add(d); 进行精确计算即可。

5-6:本题运用枚举方法
,主要将构建代码块Grade getGrade(int score)在外定义,主要要掌握枚举的格式。后面引用switch语句就可以了。

5-7:本题用到大数字操作类中的BigInteger类,注意的是定义sum初值为0应该定义方式如下:
BigInteger sum=new BigInteger("0");
运用a.equalsIgnoreCase("e")函数进行E和e的判断。后运用sum.add();即可完成相加操作。

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

答:计算机底层进行浮点数运算的时候出现了溢出问题,也就是说有符号的负数变成了无符号的极大地正数,故卡中应该是欠费的。

7.1 尝试用命令行进行编译并运行,截图

在edu.jmu包中编写Main类,其中掉了com.ibm.StringUtil的foo1方法


7.2 将生成的StringUtil.class放到d:\lib下正确的目录结构下,将Main.class放到d:\test下正确的目录结构,尝试在命令行下运行,并截图。

7.3 Eclipse中自己编写的源代码放在哪个目录、class文件放在哪个目录(给出绝对目录)?在Eclipse项目中按一下Ctrl+F11就可以直接运行Main,当按下Ctrl+F11时,到底在哪个目录下执行了什么样的java命令?

源代码在:src目录下
字节码文件在:bin目录下
运行时,在bin目录下编译.class文件输出。

3. 码云及PTA

3.1. 码云代码提交记录

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

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


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

行数 新增行数 文件数 新增文件数
233 233 6 6

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

posted @ 2017-09-23 13:28  酒怂  阅读(352)  评论(2编辑  收藏  举报