社区
Java
帖子详情
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()方法存在的真正意义是什么?求大神点播,多谢。
...全文
521
5
打赏
收藏
java String中的intern和String a="abc"的区别到对是什么
如题 String的intern()方法用于检查常量池中如果有等于此String对象的字符串存在,则直接返回常量池中的字符串对象,否则,将此String对象所包含的字符串添加到运行时常量池(字符串池)中,并返回此String对象的引用。 我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
技术小黑屋
2014-12-22
打赏
举报
回复
关于使用intern的前提就是你清楚自己确实需要使用。比如,我们这里有一份上百万的记录,其中记录的某个值多次为美国加利福尼亚州,我们不想创建上百万条这样的字符串对象,我们可以使用intern只在内存中保留一份即可。其目的是节省内存占用,你可以查看一下这篇文章
http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/
快叫我java小菜鸟
2014-12-22
打赏
举报
回复
引用 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,因为编译优化了
String
s=“
abc
“和new
String
(“
abc
“)详细
区别
本文围绕
Java
中
字符串创建及常量池展开。介绍了
Java
基本类型与
String
类,阐述字符串常量池和运行时常量池的概念、位置及作用。分析了
String
str=\
abc
\和
String
str=new
String
(\
abc
\)的内存结构,验证了new
String
(\
abc
\)会将字符串放入常量池,还说明了不同创建方式对字符串引用比较结果的影响。
String
str=new
String
(“
abc
“);到底创建了几个
String
对象?
本文围绕
Java
中
String
对象的创建展开分析,指出
String
str=new
String
(\
abc
\)创建了2个对象。介绍了堆和栈的
区别
、创建对象的方法、字符串池等相关概念,详细分析了字面量和new关键字创建对象的过程,还提及了
intern
()方法的作用。
String
str1="
abc
";和
String
str2=new
String
("
abc
");的
区别
本文解析了
Java
中
使用
String
str1=
abc
;与
String
str2=new
String
(
abc
);两种实例化方法的
区别
,详细介绍了这两种方式下字符串在内存
中
的存储位置及引用情况,并通过示例代码进行了说明。
java
中
String
s=“
abc
“及
String
s=new
String
(“
abc
“)详解
本文围绕
Java
中
String
对象展开,介绍了变量的两种语义,即原始类型变量的值语义和对象类型变量的引用语义。阐述了
String
类的特性,如不可继承、值不可变等。还讲解了
String
对象的创建方式及原理,以及
String
类型不可改变和定义时的堆栈问题。
String
a="
abc
"与
String
b=new
String
("
abc
")的
区别
本文详细解释了
Java
中
字符串比较的四种不同情况,包括常量池的使用、堆内存
中
的对象引用以及通过equals方法进行的内容比较。
Java
51,407
社区成员
86,110
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章