String.intern功能介绍
首先String.intern方法是为了减少String内存的复制而出现的方法。举个例子说明String.intern的功能:
- String a = new String("abc");
- String b = new String("abc");
复制代码
这时候,a和b对象是不同的,因为他们其实使用的不是相同一块存储空间。那么我们怎么做才能让他们使用相同的空间呢?那就是使用intern方法。改成:
- String a = new String("abc").intern();
- String b = new String("abc").intern();
复制代码
这时候a和b就使用相同的空间了,因为Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回。
那么我们来看一下。 String.intern方法在java678之间的差别。
java6
JAVA6中字符串池最大的问题是他的位置-永久代. 永久代的特点是在运行时不能被扩展。
它能使用参数 -XX:MaxPermSize=96m。这字符串池的尺寸依然是固定的.这个限制需要我我们小心的使用String.intern-你最好对不能控制的字符不要使用intern这方法。 因此在JAVA6中大部分的情况下,都是使用手动来管理map来实现字符串池的。
java7
java7中对字符串池作了一个非常重要的改进, 那就是把字符串池移动到堆中。 因此字符串池更加地灵活了。 和所有的字符对象将和其他普通对象一样位于堆中。 大小依赖自己的程序,因此可以放心地使用。
java8
java7中,换句话说。你被限制在一个更大的堆内存中。意味着你可以预先设置好String池的大小(这个值取决于你的应用程序需求)。 但是这个设置也是有限的。 java8依然接受 -XX:StringTableSize, java8只是对这个大小做了进一步的扩大。把默认的池大小增加到25-50K。
因此, java6中少用String.intern, java7之后就可以放心使用了。 |
|