1. 本章学习总结
1.final声明,一旦赋值不能被改变。移位运算符的应用,负数右移高位补“1”,正数右移高位补“1”。利用移位运算,按位与运算可以方便得出整数的32位二进制表示。
2.String类的重要,被final所修饰,它的对象是不可变的,对象创建后是不再对它进行修改,可以进行字符串共享,直接从字符串池中取出使用。但是频繁修改字符串的话,则会大量字符串对象,例如对字符串的拼接虽不改变原字符串,但会产生大量字符串对象,此时应使用StringBulider。
3.理解equals与“”的区别,如果比较的是字符串内容则使用equals而“”只比较是否是同一对象,只比较是否是同一地址。
4.引用型数据和基本数据 ,基本类型可以赋值给引用型。
5.for(int element:a)等价于for(int i=0;i<a.length;i++)
2. 书面作业
Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代码?简单分析String对象的设计思路。
分析:String其实是基于字符数组char[]实现的,用它来存放字符串,并且有一个int型的变量hash来存放计算后的哈希值。用一个空的构造器,创建空的字符序列,使用字符串类型的对象来初始化,使用字符数组来构造String(使用Arrays类复制),然后用字节数组将字节以charsetName编码格式拷贝给value,之后再解码造成String。
Q2.为什么要尽量频繁的对字符串的修改操作应该是用StringBuilder而不是String?
因为String对象建立就是不可修改,所以使用String会产生大量的字符串对象。而使用StringBuilder类中的append()就可以对已有的对象进行修改,在进行大量字符串的修改操作上,append()的效率就高多了。
Q3.比较两个字符串的值是否相等?为什么不能用==直接进行比较?
不能,“==”在基本数据类型的时候,比较的是实际的值是否相同,而在比较引用型时候,则是堆内存的地址。如果比较内容的话要用equals()比较好,它比较的是字符串的序列是否相同。
Q4.尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 =“hi“, str2=“hi“;
String str3 = new String(str1);
System.out.println(str1==str2);
以上输出结果:true。“hi”存在字符串池中,str1和str2同时指向“hi”,而String str3=new String(str1);
产生的“hi”并不存在字符串池中,所以str1与str2引用值一样,与str3不一样。
Q5.Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i
Integer是包装类(引用数字类型),而int是基本数据类型,它可以直接进行赋值。Integer是对象,要用一个引用指向这个对象。这个叫做对象的自动封箱与拆箱,相当于Integer i=Integer.valueOf(100);
,在调用的时会自动拆箱,int i=intValue(100);
。
6.尝试分析下面代码输出结果
Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false
一个字节(-128到127)的整型数在jvm启动时会加载入内存,第一次调用Integer.valueOf()
,发现Integercache中并没有127,所以创建一个新对象,Integer i2=127;
,Integercache中已有这个对象直接引用,所以输出结果为true。而128已经超出Integercache范围了,所以生成了新的Integer对象,i1==i2输出结果为false。
Q7.package与javac、 java、 -classpath、 -d在 com.ibm包中编写 StringUtil类,内有一方法
public static void foo1(){
System.out.println(StringUtil.class+" method:foo1");
}
在edu.jmu包中编写Main类,调用com.ibm.StringUtil的foo1方法
7.1 尝试用命令行进行编译并运行,截图
7.2 将生成的StringUtil.class放到d盘的lib目录下,将Main.class在d:\test目录下,尝试命令行下运行,截图。
7.3 Eclipse中源代码放在哪个目录、class文件放在哪个目录。在Eclipse项目中按一下ctrl+f11就可以直接运行Main,尝试分析背后实现的原理。
源代码放在src目录下,class文件放在bin目录下。eclipse在执行的时候直接编译,我们之前设置好了环境变量,并且eclipse环境设置为自动编译,一个class文件的组织方式是由“外部路径”和“内部路径”构成的,执行的要记住完整的类名和包名称。编译时“外部路径”默认为“output folder”的路径,“内部路径”为.java文件的包路径,按ctrl+f11运行,package中的路径和.java文件路径完全一致,所以eclipse自动根据.java文件存放路径够将完整的包路径执
行。
Q8.自己在这门课的目标与计划
◦请描述一下你的技术基础(会什么语言,都写了多少行代码)
◦一周准备花多少时间在这门课上?一周准备写多少行代码?采用怎样的学习方式?遇到困难打算怎样解决?
◦关于这门课的smart目标参考链接
c、c++语言,但是掌握的并不扎实。一周里准备每天花一半的空闲时间学习java,做到每天打一份代码。通过问老师、百度、问同学的方式来解决做java时遇到的不懂的问题。smart目标:s(具体、量化):学好java,每天打一到两篇代码,并且上相关视频网站每天看一个视频学习java; m(可以衡量):每天可以打30行代码; a(可以达到):可以自己打出一篇较难的代码; r(相关性): 在学好java的同时,也涉及其他语言的学习; t(截止日期): 希望一个月内可以打200行代码。
Q9.选做:公交卡里应该还有多少钱?请分析原因
余额为-0.2元。浮点数计算不精确,金融计算不能用浮点数。
3. PTA实验总结及码云上代码提交记录
3.1本周Commit历史截图
3.2 实验总结
学会使用了StringBuilder、BigDecimal、Arraylist,但是还不是很熟悉。实验也只会做些简单的,很经常答案错误。