201521123002 《Java程序设计》第2周学习总结
《Java程序设计》第2周学习总结
1. 本章学习总结
- String
1.String类的对象是不可变(immutable)的
2.拼接(+号)
"PG"+13;
(一个字符串与一个非字符串的值进行拼接,后者被转化成字符串)
要大量拼接字符串的话,请使用StringBuilder
3.java中“==”比较的是对象的内存地址。 - 输入输出-Scanner(扫描器)
具体查看书本及Scanner类的用法.txt - 数组
1.for(int element:a)
类型 变量 集合
例如
for(int element:a) //a为数组
System.out.println(element);
2.Arrays工具类 - 类管理机制:包(没听懂)
包-package关键字
2. 书面作业
Q1. 使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)?简单分析String对象的设计思路
答:
1.使用Eclipse关联jdk源代码:
参考文章:
Eclipse关联JDK源码
如何在Eclipse下查看JDK源代码
"window">"Preferences">"Java">"Installed JRES".
此时"Installed JRES"右边是列表窗格,列出了系统中的JRE环境,选择你的JRE,然后点边上的 "Edit...", 会出现一个窗口(Edit JRE)
Edit -->Source Attachment -->Extenal location -->Extenal File...-->src.zip -->OK-->Finish
2.查看String对象的源代码:
ctrl+鼠标左键选中某一个类,或者选中类之后按F3,源代码文件弹出
3.String对象的设计思路:
- 选中String类之后按F3弹出源代码文件
分析源码的能力较差仅能看出几点
1.String是final类型的
2.String字符串是常量,其值在实例创建后就不能被修改
Java源码分析——String的设计
这篇文章有更详细的设计思路,无奈现在还有很多地方看不懂,先保存在这里之后java学的更好了在回头来看看
Q2. 为什么要尽量频繁的对字符串的修改操作应该是用StringBuilder而不是String?
答:
- String对象是不可变的,创建后就不能被修改,改变只能开辟一个新的内存来存放新的对象
- 如果用String频繁修改字符串,就会要占用很多的内存空间了创建新的对象。
- 而StringBuilder是在原来的对象中进行修改不会产生新的对象,节省内存空间。
Q3. 比较两个字符串的值是否相等?为什么不能用==直接进行比较?
答:
- java中“==”比较的是对象的内存地址,不是比较字符串的内容。
- 当字符串开辟一个新的空间来存储相同的内容,用==不能判断内容是否相同,要用equals来判断。
**Q4. 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 =“hi“, str2=“hi“;
String str3 = new String(str1)
System.out.println(str1==str2);
**
答:
- 本题结果true;
- 第一行中str1和str2都指向了存放“hi“的内存地址;
- 第二行创建了一个新的对象str3,字符串开了一个新的内存地址存放和str1相同内容的字符串“hi“;
- 最后一行 == 比较的是两个字符串的地址,str1和str2指向的地址相同所以结果为true;而如果是str1和str3比较结果false。
Q5. Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i?
答:
参考文章:
java 自动装箱与拆箱
- 100是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明,这就是自动装箱的魅力
- 自动将基本数据类型转化为对应的封装类型。成为一个对象以后就可以调用对象所声明的所有的方法
相当于:
//声明一个Integer对象
Integer num = 100;
//以上的声明就是用到了自动的装箱:解析为
Integer num = new Integer(100);
**Q6. 尝试分析下面代码输出结果
Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false
**
答:
- true
- false
- java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象
-而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;- ==:是用来判断两个对象的地址是否相同,即是否是指相同一个对象.
**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,当按下Ctrl+F11时,到底在哪个目录下执行了什么样的java命令?**
- 源代码放在src文件中,class文件放在bin文件中。
- 我们在写每个程序的时候,都会在开头package相应的包名,这就让其他程序在调用此程序中类的时候有了一个路径,而在调用其他类时import或者用完全限定名。所以我们运行程序的时候能够让其找到我们所调用的各种存在的包中的类。
Q8. 自己在这门课的目标与计划
1.请描述一下你的技术基础(会什么语言,都写了多少行代码)
答:C语言和不太系统的c++,这种东西没有统计过,一直在累积中.
2.一周准备花多少时间在这门课上?一周准备写多少行代码?采用怎样的学习方式?遇到困难打算怎样解决?
答:
- 今年课程比较多,我周末也要上课,所以时间相较于上学期真的比较紧,但一周花最多的时间就是在这门课程上了,其他课程上课认真听,马上消化理解,做好作业尽量花最少的时间做高效率的学习。深知java实践的重要性所以放最多的时间在这门课程上,目前学习java是一有空就学所以显得没什么规律。之后尽量保证平常有一个小时的时间在java上,周末一天三四个小时。
- 写几行代码这种东西我真的没有一个量的概念,也没有统计过。做好pta已经私下的一些小练习这些代码有多少行一周就有多少行。
- 主要自学比较重要,多敲代码多看文章,搞懂理论提高敲代码的能力,看视频也是可以的网上的不少java学习视频都是很不错的。
- 百度,bing 老师,同学。
3.关于这门课的smart目标参考链接**
答: java已有类库能够熟练掌握,编程能力得到提高,如果之后自己能用java开发一些程序就是最好的了。
Q9. 选做:公交卡里应该还有多少钱?请分析原因(在规定时间内若未完成后面补上)
3. 使用码云管理Java代码
现有choice.txt文件,里面包含上千行,上百题选择题。先在老师要将其中的题目转化为PTA网站的选择题。然而PTA网站上的选择题对输入格式有要求。要求如下:
- 题面第1行及选项行前不能有空格,题面其他行无此要求。
- 题面第1行结尾要包含答案字符串,内容形式
@[C](2)
,代表答案为C,分值为2 - PTA出题格式需符合Markdown要求,才能有良好的显示效果。现要求每一行结尾一定要有2个或以上的空格。
- 统计:题目数量
- 输出:最后生成outChoice.txt,包含经过处理的所有问题。文件第1行,代表题目数量。
注1:使用Scanner处理输入文件, 使用PrintWriter输出文件。读写文件请参考WriteReadFileTest.java
注2:Choice.txt下载
注3:题目很简单,大概50行左右,不要畏难。
进阶:可以为将来的自动出题、组卷系统做准备。