1.本周学习总结
- Java有基本数据类型(类似c)和引用数据类型(不同于c)两种数据类型。
- Java是面向对象的语言,引用类型变量存放指向对象的引用,而不是该对象本身。因此判断两对象值是否相等时,需使用
equals
,==
用于比较两对象的引用是否相同。 String
对象是不可变的,例String x = "abc": x = x + "123"
,x指向的原来的内容“abc”未改变,而是生成新对象“abc123”。- 频繁对字符串进行修改时,使用
StringBuilder
,避免耗用大量时间及内存。 - Java包含基本数据类型、对象、包装类、数组,基本类型有对应的包装类。包装类的自动装箱及自动拆箱语法。
foreach
循环,for(type element:arr)
。- 多维数组:数组初始化、不规则数组。
- 动态数组ArrayList及其常用方法,特点:无法存放基本数据类型,只能存放引用类型。
2.书面作业
1.String-使用Eclipse关联jdk源代码
1.1查看String对象的源代码(截图),分析String使用什么来存储字符串?
String使用char数组存储字符串。
1.2分析其构造函数public String(char value[])
的作用?
通过char数组,生成String字符串对象。
1.3阅读public String replace(char oldChar, char newChar)
方法的代码,回答String的不可变性在该函数中如何体现?(重点)
String的本质是字符串常量,一旦定义后不可改变。
1.4简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
string
属于类而且不可变,而字符数组是可变的。String
使用了字符串常量池,避免了占用大量的存储空间。
2.StringBuilder
2.1 结合PTA -2(StringBuilder),说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
频繁修改字符时,由于String是不可变的,因而直接使用String会不断生成新对象,造成内存的大量占用,耗时。
2.2 阅读jdk文档,查询StringBuilder的append(char[] str)
方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[] str)
方法时,是如何实现添加字符的操作?
Q1:StringBuilder的append(char[] str)
功能为将 char 数组参数的字符串表示形式追加到此序列,实现拼接。
Q2:用字符数组存放字符。
Q3:在原字符串的尾部添加。
3.字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi", str2 ="hi";
String str3 = new String(str1);
System.out.println(str1==str2);
创建了了两个字符串对象,执行String str1 ="hi", str2 ="hi";
时,str1指向“hi”的引用后,在常量池内添加了“hi”这一元素,而str2并没有使用new,且指向对象也为“hi”,这时在常量池内已经有了“hi”,所以str2直接复用这个“hi”,所以在最后的str1==str2
判断比较二者引用时,输出true。第二句中使用了new
,创建了新的对象,故本段代码一共创建了两个字符串对象。
3.2 重点:对基本类型我们可以使用==
比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用==
比较?应该怎样比较他们的值是否相等呢?
Q1:Java中对于引用类型,使用=
进行赋值时,此时变量指向的为该对象的引用,而不是该对象的本身,使用==
进行判断时是判断二者的引用是否相同,而不是判断值。
Q2:比较引用类型的值是否相等时,应用equals
。
4.Wrapper(包装类)
4.1 Integer i = 100;
//100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;
这一串命令中包含了些什么操作?
Q1:Integer i = 100;
可以替换为Integer i=new Integer(100);
此处实为包装类的自动装箱语法,将基本类型转换Integer类型。
Q2:包含了自动装箱、自动拆箱。
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了
5.实验总结
5.1 结对编程实践
本次我的结对编程对象为吴延彬。结对编程有好处也有坏处,但对我来说可能还是不大适合,好处时可以多和同学交流各自对题目的看法以及编写思路,加快对题目的解决速度。但是各自编写一段时间感觉上就比较鸡肋,由于各自的编写习惯不同,代码上难免出现较大的出入,,一旦出现分歧,就很有可能打乱原有的思路,也比较耗时。
5.2 PTA-1综合小测验
本题中需使用switch
对输入指令作区分,方法同C。斐波那契数列采用了for循环依次将前两数值相加后赋值。获取生日则使用了substring
截取指定字符串。
5.3 PTA-3身份证排序。并回答:使用sort2
方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
使用了substring
截取指定位置的字符串并输出,对于sort2
则使用了compareTo
,根据数字比较两个Character对象,如果该 Character 等于此 Character,则返回 0;如果该 Character 的数值小于参数 Character,则返回小于 0 的值;如果该 Character 的数值大于参数 Character,则返回大于 0 的值(有符号比较)。返回的值大于0时,则交换前后顺序,将大者后置。若需降序,同理,将大者前置即可,指定月份比较则将读入进行比较的位置进行改变。
5.4 PTA-4动态数组
创建动态字符串二维数组,将乘法口诀表内容作字符串依次存入,再对输出形式加以调整依次输出。
5.5 (重点:小测题目)PTA-8 ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
本题中创建ArrayList后,多使用JDK文档中ArrayList
类所包含的方法。数组一旦确定大小,无法改变,而ArrayList可动态改变大小,且Java中ArrayList
类中包含了众多的常用方法,使用便捷。
5.6 选做:5-5(浮点数计算)
本题中主要问题是浮点数计算的精确问题,由于计算机采用二进制,若直接使用+
和*
等符号进行运算,结果不精确。需使用String
的形式读取参数,再使用类BigDecimal
转化为不可变的、任意精度的有符号十进制数,使用add
和multiply
进行运算。