1. 本周学习总结
·java中的字符串及String的用法
"=="比较的是两字符串的地址,而不是内容
String类的对象是不可变的,创建之后不能进行修改
·数组Array的用法
Arrays.sort(数组名);//方便对数组进行排序
·学会如何看对象的源代码
·BigDecimal的用法,用于浮点数精准计算
import java.math.BigDecimal;
BigDecimal b1 = new BigDecimal(m1);
2. 书面作业
Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代码?简单分析String对象的设计思路。
(1)Eclipse源代码关联的步骤:
1.点 Eclipse首页的Windows--》 preferences---》 Java ---》 Installed JREs
2.此时"Installed JRES"右边是列表窗格,列出了系统中的JRE环境,选择你的JRE,然后点边上的 "Edit...", 会出现一个窗口(Edit JRE)
3.选中rt.jar文件的这一项 c:javajdk1.8.0_102jrelib
t.jar; 点左边的">"号展开它,可以看到Source Attachment:C:javajdk1.80_102src.zip,
点这一项,然后点右边的按钮Source Attachment..., 选择你的JDK目录下的 src.zip文件,完成。
截图如下:
(2) 查看String对象的源代码的方法:
按住ctl键,用鼠标点击类名,就出现该类的源代码
String 对象的设计思路:
1) String是基于字符数组char[]实现的。
2) String字符串是常量,其值在实例创建后就不能被修改
3) 使用字符串类型的对象来初始化
4) 使用字符数组来构造
Q2为什么要尽量频繁的对字符串的修改操作应该是用StringBuilder而不是String?
答: 因为String 是不可变的对象,因此在每次对字符串进行修改操作的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,
所以经常改变内容的字符串最好不要用 String。其次StringBuilder是一个可变的字符序列,不会一直创建对象。
Q3比较两个字符串的值是否相等?为什么不能用==直接进行比较?
答:用= =比较两个对象时是比较堆内存中的地址是否一样,不能比较它们的值,所以应该用equals()方法来比较内容是否一样
**Q4尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:
String str1 =“hi“, str2=“hi“;
String str3 = new String(str1)
System.out.println(str1==str2);**
答:这段代码创建了两个对象。
这段代码首先定义一个变量str1,因为用""写下的字符串为字符串常量,所以赋值的数据"hi"存在常量区。因为以包括的字符串,只要内容相同,无论在程序代码出现几
次,JVM都只会建立一个String实例,并在字符串池中维护,所以给str2赋值时先去字符串池寻找是否有相同的字符串,发现存在,则不需要创建新的对象。而str3是用
new一定建立新对象,所以创建一个新的对象在堆区中。
Q5Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i
答:jdk自己帮你完成了调用Integer.valueOf(100)*
源码:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
**Q6尝试分析下面代码输出结果
Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false**
答:(1)结果为true(2)结果为false
分析:查看Integer的源代码,部分代码如下
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range ```-128 to 127```,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
用这种方式赋值Integer会自动调用valueof()
从部分代码可以看到当Integer定义类型的值在-128~127之间才能缓存,所以当取值为128时,比较的是地址
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: est正确的目录结构,尝试在命令行下运行,并截图。
7.3 Eclipse中源代码放在哪个目录、class文件放在哪个目录。在Eclipse项目中按一下ctrl+f11就可以直接运行Main,尝试分析背后实现的原理。
答:源代码放在src目录里面,class放在bin目录中
网上找了一下还是不清楚,大概感觉跟自己手动在CMD上运行.java的过程差不多,先编译一下.java在bin目录下生成.class,在运行Main。
Q8自己在这门课的目标与计划
·请描述一下你的技术基础(会什么语言,都写了多少行代码)
答:会C语言,和基础的C++,没有具体计算过写了多少代码,但是有在oj跟lintcode上做题。(虽然做的不多。)
·一周准备花多少时间在这门课上?一周准备写多少行代码?采用怎样的学习方式?遇到困难打算怎样解决?
答:大概三四天吧,实际可能用得更多,有时候一天其实总共没花很多时间在学习上,时间比较零散,最近有比较多的活动要准备,时间比较紧张。
写多少行,这无法具体讲,不能保证写了多少行代码就提交正确。本来代码就要多写,不断调试,才会正确。一般老师布置的作业尽量完成。
一般遇到困难,百度查找或者咨询同学。
·关于这门课的smart目标参考链接
http://www.weixueyuan.net/view/6198.html
Q9选做:公交卡里应该还有多少钱?请分析原因**
答:可能是浮点数二进制存储出现问题,可能出现负数,然后补码溢出,或者机器出现故障。
3. 使用码云管理Java代码
在码云的项目中,依次选择“统计-Commits历史-设置时间段”,然后搜索并截图
4. PTA实验
题目集: jmu-Java-02-Java基本语法 中的判断、选择、编程(8道)
第一题: 这道题问题比较多,要处理的事情比较多,刚开始写的时候遇到很多问题,后来老师上课进行了分析,听了以后比较会写。
主要问题,一开始不知道字符串比较的用法跟C不同,用了“==”判断字符串是否相同结果
结明显错了,后来学习了String才知道用.equals( )方法;
学习了 str=line.split(" ");方便了在每个字符串中加空格符号。后来我上网查找,发现还有很多功能
在java.lang包中有String.split()方法,返回是一个数组。“.”和“|”都是转义字符,必须得加"\";如果用“.”作为分隔的话,必须是如下写法:
String.split("\."),这样才能正确的分隔开,不能用String.split(".");
如果用“|”作为分隔的话,必须是如下写法:
String.split("\|"),这样才能正确的分隔开,不能用String.split("|");
更多方法: http://blog.csdn.net/kunlong0909/article/details/8507290
虽然想要截取,不怕麻烦的话可以运行代码,自己试试看要从第几个开始到第几个结束。了解这个函数是怎么用的话就不用这么麻烦了。
public String substring(int beginIndex,int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。
因此,该子字符串的长度为 endIndex-beginIndex
第三题:第三题的第一个要求跟第一题很相似,主要是第二个要求。一开始我是想自己写一个冒泡排序比较的字母从第六个开始,感觉应该是可以的,写起来有一些麻
烦的感觉,我就想利用第一个要求,已经得到的年月日的数组,然后用冒泡排序年月日的数组,不一样只是在要换数组是同时换Id的数组,虽然感觉效率不是很好
但是提交可以了,我就没在想,感觉应该还有更好的方法。
第五题: 这个问题本身不难,我却搞了很久,因为我一开始写时,我是输出4.0,我以为答案要输出4.00 才可以,在这绕了很多弯路。
主要还是对BigDecimal不熟悉,后来经过问同学,终于提交正确。关键问题
String m1=sc.next();
String m2=sc.next();
BigDecimal b1 = new BigDecimal(m1);
BigDecimal b2 = new BigDecimal(m2);
BigDecimal b3=b1.add(b2);
输入的应该为字符串