社区
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()方法存在的真正意义是什么?求大神点播,多谢。
...全文
493
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
“)详细
区别
从底层介绍
String
的两种创建方式差异所造成的效果
String
str1="
abc
";和
String
str2=new
String
("
abc
");的
区别
http://tech.techweb.com.cn/viewthread.php?tid=525631
String
str1="
abc
";和
String
str2=new
String
("
abc
");的
区别
Java
把内存划分成两种:一种是栈内存,一种是堆内存。 在函数
中
定义的一些基本类型的变量和对象的引用变量都在函数的栈内
String
str=new
String
(“
abc
“);到底创建了几个
String
对象?
String
str=new
String
("
abc
")创建了2个
String
对象
java
中
String
s=“
abc
“及
String
s=new
String
(“
abc
“)详解
String
s =new
String
()分析堆与栈,是先定义S,还是先new
string
()步骤:1) 栈
中
开辟一块空间存放引用str1;2)
String
池
中
开辟一块空间,存放
String
常量"
abc
";3) 引用str1指向池
中
String
常量"
abc
";4) str1所指代的地址即常量"
abc
"所在地址,输出为true;步骤:1) 栈
中
开辟一块空间存放引用str2;2) 堆
中
开辟一块空间存放一个新建的
String
对象"
abc
";
String
a="
abc
"与
String
b=new
String
("
abc
")的
区别
先说几个概念 1、常量池 指的是在编译期确定,并被保存在已编译的字节码文件
中
的一些数据,它包括类、方法、接口等
中
的常量,存放字符串常量和基本类型常量(public static final)。 2、栈(stack) 主要保存基本数据类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(re...
Java
51,408
社区成员
86,096
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章