首页新闻找找看学习计划

Java中string创建的区别

0
[待解决问题]
问题一:
String str1="abc";
如果字符串池中没有"abc",那么执行这句话后,在哪创建了"abc"对象?池中?堆中?还是池中和堆中都创建?
问题二:
String str2=new String("hello");
如果字符串池中没有"hello",我知道执行这句话后在堆中创建了"hello"对象,那在池中还会再创建"hello"吗?
海天s的主页 海天s | 菜鸟二级 | 园豆:211
提问于:2015-10-18 14:15
< >
分享
所有回答(4)
0

http://blog.csdn.net/cs_lht/article/details/6742531

搜的,可以参考,但是这里面讲的不一定全对。

比如里面:Strings3="abc"

 Strings4="abc"这个地方,

写一个测试类,再javap --verbose一下,就会发现

class文件编译完,就已经把s3与s4指向同一个常量了~也就是说,class文件load进jvm里面,"abc"这个变量 ,JVM一共找了一次~

如果说错了,还请见谅~

之奇一昂 | 园豆:1421 (小虾三级) | 2015-10-19 10:04

http://bbs.csdn.net/topics/190153906

了解下String.intern()方法

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-10-19 10:11
0

我发表下我见解哦,如我们所知道的,jvm中的栈放都是我们基本常量,堆里面都是放对象,实例化的数据。 而String,他是一个对象,它的这两种定义方式在java内部都是都是存放在堆里面的,然后在栈里面有一个指向堆存放的地址。  而你所说的字符串池,首先得调用String.intern(),如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。       有什么问题咱们可以讨论下

lynn少 | 园豆:206 (菜鸟二级) | 2015-11-11 11:14
0

FangJinuo | 园豆:930 (小虾三级) | 2015-11-23 18:03
0

你就这么理解,字符串对象都会放在常量池中,至于在堆中怎么表示不重要,重要的是你的引用都会指向常量中的字符串对象,字符串对象只会在常量池中,比如String s = new String("abc");,这样的例子,就相当于栈中的一个引用指向堆中的一个引用,堆中再指向常量池的"abc".

jasondyoung | 园豆:424 (菜鸟二级) | 2016-01-20 00:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册