java String中的intern和String a="abc"的区别到对是什么

zhizi1988 2014-08-17 05:13:46
如题
String的intern()方法用于检查常量池中如果有等于此String对象的字符串存在,则直接返回常量池中的字符串对象,否则,将此String对象所包含的字符串添加到运行时常量池(字符串池)中,并返回此String对象的引用。

我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

因此我觉得没有什么区别啊。intern()方法能做的事用String a="abc"这种方法同样能做到。那么intern()方法存在的真正意义是什么?求大神点播,多谢。
...全文
340 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
技术小黑屋 2014-12-22
  • 打赏
  • 举报
回复
关于使用intern的前提就是你清楚自己确实需要使用。比如,我们这里有一份上百万的记录,其中记录的某个值多次为美国加利福尼亚州,我们不想创建上百万条这样的字符串对象,我们可以使用intern只在内存中保留一份即可。其目的是节省内存占用,你可以查看一下这篇文章http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/
  • 打赏
  • 举报
回复
引用 2 楼 whos2002110 的回复:
一个在编译期,一个在运行期。 intern方法jdk7跟6也不一样
这个萌萌的小狗是正解,编译器是无所谓的,但是运行期就需要intern来判断了,比如:String s1 = "ab";String s2 = "c";String s3 = "abc"; s3=="ab"+"c"是true因为编译器检测到常量池有abc这个对象,但是s3!=s1+s2,因为这是运行期的事,但是如果s3==(s1+s2).intern是true了,这就是intern要办的事,写jdk的都是大牛,怎么会写个没用的方法呢
humanity 2014-09-09
  • 打赏
  • 举报
回复
当我们在代码中用 "+" 拼接字符串时有一部分内容已经是常量(就是引号内的那些),但拼接出来的结果却不是常量,而是变量,因为当我们的逻辑确实想把它放入常量池时就用 intern,要知道这个过程本身是基于某个逻辑的结果,而引号里面的内容是在编译时就确定的因此不是动态的,我们很多时候明确地调用 intern 是基于性能考虑,在代码在编译时我们并不能确定将来运行这个程序的机器环境是什么样的,比如当是 Windows 时我们用"C:\Document and Settings\zhangsan\aaa.exe" 而在linux 下用 "/home/zhangsan/aaa.exe" 这个我们知道它是固定不这的,但不同的机器是不同的。因此我们的程序可以先确定机器类型后拼接出字符串然后 intern 冻结它。 所以说,这里面其实就是静态的和动态的区别。
whos2002110 2014-09-08
  • 打赏
  • 举报
回复
一个在编译期,一个在运行期。 intern方法jdk7跟6也不一样
blackze 2014-09-08
  • 打赏
  • 举报
回复
区别的话应该是没什么区别(没正式测过) 从别的角度来分析一下- - 举个例子 Integer i = 10; int i2 = 10; syso(i == i2); Integer和int是同一个类型吗? 那为什么会相等呢?因为自动装箱拆箱,它(可能是运行前编译,也可能是语言级支持比如类似于运算符重载我不太确定)把这个过程给简化了 比如说 String a = "a"+"b" 它编译后的结果不是两个字符串常量a和b而是一个字符串ab,因为编译优化了

50,531

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧