Java中的缓存
Java诞生之初是为消费性数字产品而设计,这类产品自身内存及运算资源十分有限。因此,Java有着许多为节省资源而作的设计,如整型缓存池、字符串池等。这样的设计无疑节省了资源提高了效率,但如果对此一知半解很可能导致一些难以发现的问题。看看下面的代码:
public class CacheMain {
public static void main(String[] args)
{
String str1 = "java";
String str2 = "java";
System.out.println(str1 == str2);
System.out.println("java" == str1);
System.out.println("java" == str2);
}
}
Java中的“==”号对基本类型比较二者的值是否相等,对类类型比较二者是否引用自同一个对象。按照这个逻辑,此处的str1和str2均是类类型,那么是否应该输出false呢?但运行结果却是3个true,换句话说,str1和str2均指向了同一个对象。
用双引号写下的字符串称为字符串常量,既然是常量,那么只要内容相同(包括序列和大小写)无论在代码中出现多少次均指向同一个String实例。
再看下面的代码:
public class CacheMain {
public static void main(String[] args)
{
String str = "java";
String str1 = new String(str);
String str2 = new String(str);
System.out.println(str == str1);
System.out.println(str1 == str2);
}
}
这次输出了2个false,原因就是str1和str2的建立均使用了new,因为new一定是建立新对象。除了字符串中的缓存池以外还有整型缓存池,可以见我的另一篇文章——自动装箱与拆箱中的陷阱。