intern( )的使用
如果不是用双引号声明的String对象,可以使用String提供的intern方法: intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
●比如: String myInfo = new String("I love XXXXX") .intern()
;
也就是说,如果在任意字符串上调用String. intern方法,那么其返回结果所指向的那个类实例,必须和直接以常量形式出现的字符串实例完全相同。因此,下列表达式的值必定是true:
("a" + "b" + "c") . intern() == "abc"
通俗点讲,Interned string就是 确保字符串在内存里只有一-份拷贝,这样可以节约内存空间,加快字符串操作任务的执行速度。注意,这个值会被存放在字符串内部池(String Intern Pool)。
拓展
题目: new String (“ab”)会创建几个对象?
拓展:new String(“a”) + new String(“b”)呢?
intern()的使用: jdk6 vs jdk7/8
总结String的intern()的使用:
- jdk1.6中,将这个字符串对象尝试放入串池。
- 如果串池中有,则并不会放入。返回已有的串池中的对象的地址
- 如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址
- Jdk1.7起,将这个字符串对象尝试放入串池。
- 如果串池中有,则并不会放入。返回已有的串池中的对象的地址
- 如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址
练习
intern(的效率测试:空间角度
大的网站平台,需要内存中存储大量的字符串。比如社交网站,很多人都存储:北京市、海淀区等信息。这时候如果字符串都调用intern()方法,就会明显降低内存的大小。