您的位置:首页 > 编程语言 > Java开发

<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的实例。一般认为==是比较好的风格。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: