20162308 2016-2017-2 《程序设计与数据结构》第2周学习总结
教材学习内容总结
- Java 的字符串
- print & println 方法
- Java 的基本数据类型
- 读取输入数据
教材学习中的问题和解决过程
- 为什么Java不同于 C, C++ 等语言,String 和 Int 两种数据类型可以直接相加,而不用转换数据类型?
- 在cnblog上找到的这篇很精确地解释了这个现象。我把这个理解为Sun公司为Java语言添加的语法糖。因为所有的类都是由Object类继承的,而Object类中加入了toString()方法,所以让所以的非String对象在于String对象相加时,会自动执行toString方法,转化为String类型,进行字符串的连接。
- 在上面这篇博客中看到了 StringBuffer 类型和 StringBuilder 类型, 和String 类型有什么区别?
- 参考了这篇。感觉String类型跟这两个比,丝毫没有优势啊。String 类型定义的是一个字符串常量,也就是说每一次赋值,都会生成一个新的字符串,然后比这个变量的地址转到新的字符串上,而不是直接在内存上修改,并且String类型不是线程安全的,只适合单线程环境下使用。StringBuffer 类型是直接在内存上修改,所以相对来说效率更高,并且StringBuffer类型是线程安全的。StringBuilder 类型总的来说跟StringBuffer差不多,但是他没有线程锁,所以只适用于单线程下,因为减少了线程锁对性能的开销,效率比StringBuffer还要高。
- 好了,由第二个问题,又有了第三个问题,既然这样看来String类型相对另外两种类型来说,效率较低,那么我们为什么还会在代码中广泛的是用String类型?
看到这篇在生产环境中String类型确实会避免使用。不过按照第一个答主的说法,在JDK编译器中,已经将。所以实际上
String temp = "ABC" + 200 + 'D'; 与下面的代码是等价的 String temp = new StringBuilder().append( "ABC" ).append( 200 ).append('D').toString(); 但是当涉及到for循环的连加是,JDK是在每一次循环中,实例化一个StringBuilder,效率仍然会远低于直接使用StringBuilder。所以其实还不如就直接使用StringBuilder。代码调试中的问题和解决过程
- PP2.2中打印平均数中只能打印出整数。
一开始是这样写的:
double aver = (num1 + num2 + num3)/3; System.out.printf("%.3f",aver); //输出:x.00,即无法输出准确值 //后来改成下面这样 double aver = (num1 + num2 + num3)/3.0; System.out.printf("%.3f",aver);//解决!代码提交过程 & 代码量截图:
上周考试错题总结
- 这次终于拿了5分,但是感觉还是不够。因为这次的5分就是打了一个擦边球,错了三题,错的也都是老师上课讲过的知识点,有点可惜。希望下次能够有更好的表现。
其他(感悟、思考等,可选)
在问题中发现问题,在进步中再次进步。
这周收获最大的就是对String有了更深入的研究。而这一开始,只是因为我想要直到为什么String可以和Int类型直接进行运算。在寻找答案的过程中,不知不觉地,发现了更大的世界。从String类型的理解,到StringBuffer和StringBuilder类型的引入,再到性能上的比较,这种自发性的学习过程实际上是很让人血脉贲张的,在这种状态下,学习成为一件既具有幸福感的事。反过来说,每一个人的学习都是自己的事,碰到问题寄希望于求助往往是事倍功半、效率极低的方法,不妨利用现在极其发达的搜索引擎,网上很多从业者的说法,往往具有更多的价值和意义。这也就是我不喜欢找老师答疑的原因。发现一个问题是很可贵的,自己去解决这个问题的过程会比解决问题本身更能够引导我们向知识的纵深走去。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 26/26 | 1/1 | 7/7 | |
第一周 | 81/107 | 1/2 | 8/15 | String类型的使用 |
计划学习时间:5小时
实际学习时间:8小时
改进情况:关于String的学习收获很多