A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String.intern功能介绍

首先String.intern方法是为了减少String内存的复制而出现的方法。举个例子说明String.intern的功能:
  1. String a = new String("abc");
  2. String b = new String("abc");
复制代码


这时候,a和b对象是不同的,因为他们其实使用的不是相同一块存储空间。那么我们怎么做才能让他们使用相同的空间呢?那就是使用intern方法。改成:
  1. String a = new String("abc").intern();
  2. 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之后就可以放心使用了。

1 个回复

倒序浏览
已收走,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马