1. 本周学习总结
通过查询API掌握了一下几种类的基本用法:
- String类
- StringBuilder类
- ArrayList类
- BigInteger类
- BigDecimal类
- Arrays类
认知两种基本变量:
- primitive主数据类型
- 引用
2. 书面作业
1. String-使用Eclipse关联jdk源代码
1.1 查看String对象的源代码,分析String使用什么来存储字符串?
String对象源代码部分截取:
/** The value is used for character storage. */
private final char value[];
- 分析: String用字符数组来存储字符串。
1.2 分析其构造函数public String(char value[])
的作用?
String对象源代码部分截取:
* 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);
}
- 分析: 由以上可知该够造函数可接收一个char数组,生成一个String对象。
举例:
char[] ch={'c','h','a','r'}; String str=new String(ch); System.out.println(str)
运行结果:
char
1.3 阅读public String replace(char oldChar, char newChar)
方法的代码,回答String的不可变性在该函数中如何体现?
String对象源代码部分截取:
- 分析:在进行字符串替换时并不是直接对原有字符串进行操作,而是建立了一个新的字符串,将新的字符放入到新字符串的适当位置上,将新字符串作为返回值赋给Sting类型的引用。总结来说,此过程中是String类型的引用由一个旧的对象指向一个新的对象。
1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?
Java是面向对象的。类是创建对象的模版,类中包含了许多的方法,当我们用new方法创建一个对象时,就有许多现成的方法可供我们调用,相比其他语言,Java使用更为方便。运用new方法创建一个String类的对象时,若我们需要进行一些操作则只需调用String类中的方法就可,相比于字符数组,String更便捷;另一方面,由于String的不变性,若我们对字符串进行增添,修改,等操作时,便会生成新的对象,而那些旧的对象失去了对其的引用,将会失去生命力,垃圾回收器若不及时回收这些废弃的对象,整个程序将会非常低效,而此时若用字符数组则会显得比较灵活。不过,若是追溯到底层,String对字符串的存储及操作也是借助字符数组来实现的。
2. StringBuilde
2.1 结合PTA -2(StringBuilder),说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?
以该题为例,通过输入n将0至n-1之间的数作为字符串存入变量中。
String:因其具有不可变性,每进行一次循环将会在堆上生成一个新的对象,大大降低了程序运行的效率。
StringBuilder:每次循环是对对象本身进行操作,而不是生成新的对象。
2.2 阅读jdk文档,查询StringBuilder的append(char[]str)
方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[]str)
方法时,是如何实现添加字符的操作?
该方法的功能:将 char 数组参数的字符串表示形式追加到此序列。
StringBuilder对象源代码部分截取:
AbstractStringBuilder对象源代码部分截取:
- 分析:同String其内部使用字符数组来存放数组。
添加操作的实现过程:添加这个序列的char数组参数的字符串表示形式。字符数组参数按顺序追加,该序列的内容。这个序列的长度增加该参数的长度。
3. 字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 ="hi",
String str2="hi";
String str3 = new String(str1)
System.out.println(str1==str2);
-
执行该程序输出结果为true,共创建了两个对象。
-
执行第一行代码结果:在字符串常量池创建一个对象,其引用为str1,该对象存放的内容为hi。
-
执行第二行代码结果:此时字符串常量池中已存在字符串hi,str2直接指向str1所指向的对象,而不是再创建一个新对象。
-
执行第三行代码结果:通过new方法在堆上新建了一个对象,该对象存放的内容为hi。
-
执行第四行代码结果:对于引用类型==可以理解为判断两个引用所指向的对象的内存地址是否相同。而此题srt1与str2分别指向相同的对象,故其相等。
3.2 对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
对于引用类型==可以理解为判断两个引用所指向的对象的内存地址是否相同。
若要比较两对象内容是否相等,调用equals方法即可。例:str1.equals(str2)
,其返回值为boolean
4. Wrapper(包装类)
4.1 Integer i = 100;
100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;
这一串命令中包含了些什么操作?
- 第一串命令:Integer为int的包装类,能将int类型的值赋给Integer类型的,是因为包装类具有自动装箱功能。
- 第二串命令:Integer x = 100;装箱
int y = x+1;装箱
x++;先拆箱后装箱
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
- 可以通过包装类,实现String和基本类型之间相互转换。
- 可以通过包装类,实现基本数据类型的相互转换。
- Integer是一个引用类型,在传参,返回参数方面比int,即值类型,更兼容。
5. 实验总结
5.1 结对编程实践
使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
结对对象:林文秀
由于PTA上的大部分题目在上星期就已完成,在宿舍也就和舍友讨论了下PTA上格式输入,输出的问题。有时候代码打完在eclipse上可以运行,但是放到PTA上却无法通过,可能是格式的错误或是对题目理解的错误,这时候和舍友讨论一下,看一下舍友的做法,比一个人在那里死扣好。但是如果自己没有深入的思考就开始问别人,一方面自己养成不了独立思考的能力,另一方面也是浪费别人的时间。每个人都有思维的盲区,我们面对问题的时候都是以一贯的思维来思考,如是遇到自己实在无法解决的问题时,就要与别人探讨交流,换个角度去想问题的解决方法。
5.2 PTA-1综合小测验
- 基本思路:
- 创建一个私有的静态整形数组,用于存储整形元素。
static private int[] arr;
- 通过
while (sc.hasNext())
控制输入。 - 根据用户输入的关键字进入不同的switch分支。
- 输入相应数据进入函数:
public static void sort(String[] str)
主要功能:将Strig类行的数组str转化为int型数组,存入arr<并对其排序,通过System.out.println(Arrays.toString(arr));
进行输出。
public static void search(int e)
主要功能:通过Arrays.binarySearch(arr, e)
查找元素e,返回其下标,若不存在则返回-1
public static void getBirthDate(String id)
主要功能:通过substring方法对输入的id进行截取,输出其出生日期。
public static void fib(int n)
主要功能:通过参数n打印出斐波那契数列的前n项,采用累加法。
5.3 PTA-3身份证排序。并回答:使用sort2
方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?
- 使用Arrays.sort方法对数组进行的排序为升序,若需降序排序则将通过Arrays.sort方法排序后的数组从最后一项开始输出即可,或者采用冒泡法,其他排序方法也可以。
- 通过substring方法截取id中的月份,将其转化为int型存入数组,调用Arrays.sort方法对数组进行的排序。
5.4 PTA-4动态数组
基本思路:
- 通过
while (sc.hasNext())
控制输入。 - 进入
getDynamicMatrix
函数
private static void getDynamicMatrix(int n)
主要功能:根据输入的n值打印相应的乘法表。通过双层for循环来实现,将每一行的输入存入的String类型的二维数组中,通过System.out.println(Arrays.deepToString(str));
打印二维数组。
5.5 PTA-8ArrayList入门。并回答:为什么有了数组还要使用ArrayList?
基本思路:
- 查询API文档即可。
- 通过使用ArrayList类我们可以动态添加数组元素,因为java是面向对象的,ArrayList中提供了许多方法,更便于使用。
5.6 浮点数计算
基本思路:运用math包中的BigDecimal类。在创建对象时若需精确计算则需向其构造函数中传入Sctring类型的参数。调用add方法实现两数相加;调用multiply方法实现两数相乘。
5.7 枚举
基本思路:enum
相当与class
,可以理解为一些常量的集合。根据PTA的输出要求,注意不要把其定义在Main
类中就可以。
5.8 大整数相加
基本思路:运用math包中的BigInteger类。
BigInteger sum = new BigInteger("0");
用sum
存储其和- 通过
while (sc.hasNext())
控制输入。 - 按行读取字符串。
- 若字符串为e或E,跳出循环。
- 通过add方法进行相加。
- 通过
System.out.println(sum.toString());
输出和。
6. 选做:公交卡里应该还有多少钱?请分析原因
分析:公交卡已欠费。将4294967276转为十六进制产生了溢出,而在系统中以无符号整形来存储,故而出现了余额很大的显示界面。
7. 选做(难):package与javac、 java、 -classpath、 -d与Eclipse
在 com.ibm
包中编写 StringUtil
类,内有一方法
public static void foo1(){ System.out.println(StringUtil.class+" method:foo1"); }
在edu.jmu包中编写Main类,调用com.ibm.StringUtil的foo1方法。
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命令?
class文件目录:E:\java workspace2\MyProject3\bin\JavaLearn2
源文件目录:E:\java workspace2\MyProject3\src\JavaLearn2
按下 ctrl+F11,是执行了bin
下相应的字节码文件。
3. 码云及PTA
3.1 码云代码提交记录
3.2 截图题集“Java基本语法”PTA提交列表
3.3 使用老师发的jar程序统计每周的代码量
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
2 | 665 | 665 | 20 | 20 |
4. 小任务
2.1 加分考核点:新建n个大小的数组,往数组中随机填入1-100之间的整数(写成函数形式),然后统计并输出其中大于50与小于等于50的百分比(写成函数形式)。(注意:可以使用for each循环进行统计,随机数用法见参考资料 )
代码:
运行结果: