<Head First Java>十大遗珠之憾
2016-03-17 15:46
543 查看
为什么要在乎String的不变性?
当程序越来越大时,不可避免地会有很多String对象。为了安全性和节省空间的原因,String是不变的。意思是下面的程序:String s = "0"; for(int x=1;x<10;x++){ s=s+x; }实际上会创建出10个String对象("0","01"."012"......"0123456789")。最后会引用到"0123456789"这个值,但此时会存在10个String。
创建新的String时,Java虚拟机会把它放到称为”String Pool“的特殊存储区中。如果已经出现同值的String,Java虚拟机不会重复建立String,只会引用已存在者。这是因为String是不变的,引用变量无法改变其他参考变量引用到的同一个String值。
String pool不受GC管理,因此我们for循环建立的10个String有9个事在浪费空间。
同样的事情存在包装类
Integer iWrap = new Integer(42);它的值永远会是42.包装对象创建后就无法改变该对象的值。
如何节省内存?
如果要执行一堆String操作,则StringBuilder这个class更为合适。StringBuilder官方文档借助于它的相关方法,可以方便的进行增删改,但是StringBuilder适用于单线程,如果多线程需要同步,则推荐使用StringBuffer。StringBuffer官方文档
好玩的数组
问题:5x5的数组Key[][]有多少个引用变量才能存取所有元素呢?Key[][] k = new Key[5][5];回答: 1个引用变量k
5个引用变量k[0]到k[4]
25个引用变量k[0][0]到k[4][4]
共计31个。
方便的枚举
有时候我们需要一组常量来代表可用值的集合。这样的一组可用值被称为枚举。enum是这样的:public enum Members { JERRY, BOBBY, PHIL}; public Members selectedBandMember; //Members的实例只能有JERRY,BOBBY,PHIL三种类型 if(selectedBandMember == Members.JERRY){ //执行与JERRY有关的程序 }是不是很方便,如果是以前,会定义JERRY是1,BOBBY是2,PHIL是3。传入的值是1......(祈祷不要传入9527)。
枚举可以使用if和switch。我们可以用==或者.equals()来比较enum的实例。一般认为==是比较好的风格。
相关文章推荐
- java.lang.UnsatisfiedLinkError: Couldn't load libjniFramework from loader
- java里this的应用
- JAVA中单例模式的几种实现方式
- JAVA对excel文件的处理方式
- Spring中的事务传播属性详解
- SpringMVC对静态资源文件的访问(配置)
- HashTable 和 HashMap的区别
- spring 远程调用
- spring整合hibernate的详细步骤
- Eclipse/MyEclipse中使用复制粘贴功能卡的解决办法
- JAVA_SE基础——58.如何用jar命令对java工程进行打包
- java中的内部类总结
- 如何在Eclipse下查看JDK源代码 (转)
- 回溯算法解数独问题(java版)
- 图解JDK7的Comparison method violates its general contract异常
- java中的socket编程有关printStream的println方法和write方法
- java并发:获取线程执行结果(Callable、Future、FutureTask)
- java 线程如何被终止
- 关于Spring,default-autowire-candidates属性的作用验证
- java代码走查审查规范