黑马程序员技术交流社区

标题: String str="123" 与 String str=new String("123") 区别 [打印本页]

作者: jonn    时间: 2013-1-11 22:54
标题: String str="123" 与 String str=new String("123") 区别
区别在哪儿呢?从jvm中堆栈角度分析并解释下,实在是难明白......
作者: 程一帆    时间: 2013-1-11 23:15
tring str =“123”是在栈内存中建立了名字叫str的字符串类型的变量  并被赋值为字符串123,
String str=new String("123")是在堆内存建立了一个对象str,对象中存放着123这么一个数据。new是在堆内存创建一个实例的意思。
栈内存中的str是局部变量,  堆内存中str的是new创建的一个对象。

新手上路 ,解释不一定到位,还请见谅。

作者: 汪平乐    时间: 2013-1-11 23:19
基本类型的变量是在栈内存中分配,而new产生的对象是在堆内存中..
java堆栈详解
作者: 黑马斯巴达    时间: 2013-1-11 23:23
首先前面的那个 String str="123"是在常量池创建了一个新的对象“123”
后一个  String str=new String("123") 首先也是新创建了一个对象“123”同时又对其进行引用也就是new了一个新的对象str指向了“123”。这是就有两个对象啦
如果再String str2=“123”这时不会在创建新对象,因为在常量池中可以找到“123”不会再次创建避免浪费内存
作者: 汪平乐    时间: 2013-1-11 23:23
可以查找java堆栈详解 http://blog.csdn.net/bangbt/article/details/6232299
作者: 郝肖肖    时间: 2013-1-11 23:24
"123"本身就是一个对象,这个对象已经初始化了,然后,str指向了这个对象。第二句中String str=new String("123")又new了一个对象,所以有二个对象。
作者: 张敬培    时间: 2013-1-14 10:15
String str = "123"是在方法区的字符串常量池里创建了一个"123"的对象,并把值赋给了str;而String str1 = new String("123")是在堆区创建了一个String的实例,这个实例的内容是指向字符串常量池重的“123”,同时把堆区重的地址值传给了str1。所有,System.out.println(str==str1),为false,比较的是两个字符串的地址值,一个在常量池一个在堆区,肯定不相同;System.out.println(str.equal(str1)),为true,比较的是值因为都是指向常量池中的“123”,所以为true
作者: 黄锦成    时间: 2013-1-14 12:24
程一帆 发表于 2013-1-11 23:15
tring str =“123”是在栈内存中建立了名字叫str的字符串类型的变量  并被赋值为字符串123,
String str=ne ...

String str = "123";字符串123是放在常量池中的,不是放在栈,只是变量str放在栈中。str指向常量池中的123
作者: 高浩    时间: 2013-1-14 15:06
String 它是一个特殊的类,   
可以String str="123";
可以创建对象  String str=new String("123");
调用了该类的构造函数,传了一个“123”参数,初始化了一个String 对象。
作者: 程一帆    时间: 2013-1-14 22:09
黄锦成 发表于 2013-1-14 12:24
String str = "123";字符串123是放在常量池中的,不是放在栈,只是变量str放在栈中。str指向常量池中的12 ...

额,我还没有学到常量池,嘿嘿
作者: 崔仁军    时间: 2013-1-15 02:06
本帖最后由 崔仁军 于 2013-1-15 02:21 编辑

1. String s = “123”; (采用字面值方式赋值)
    a) 首先查找String Pool  中是否存在“123 ”这个对象,如果不存在,则在String Pool  中创建一个“123 ”对象,然后将String Pool  中的这个“123 ”对象的地址返回来,赋给引用变量s,这样s 会指向String Pool  中的这个“123”字符串对象
    b) 如果存在,则不创建任何对象,直接将String Pool 中的这个“123”对象地址返回来,赋给s 引用。
2. String s = new String(“123”);
    a) 首先在String Pool  中查找有没有“123 ”这个字符串对象,如果有,则不在String Pool 中再去创建“123”这个对象了,直接在堆中(heap )中创建一个“123”字符串对象,然后将堆中的这个“123 ”对象的地址返回来,赋给s 引用,导致s 指向了堆中创建的这个“123 ”字符串对象。
    b) 如果没有,则首先在String Pool  中创建一个“123“对象,然后再在堆中(heap)创建一个”123“对象,然后将堆中的这个”123 “对象的地址返回来,赋给s引用,导致s 指向了堆中所创建的这个”123“对象。
作者: 崔仁军    时间: 2013-1-15 02:07
本帖最后由 崔仁军 于 2013-1-15 02:19 编辑

1. String s = “123”; (采用字面值方式赋值)
    a) 首先查找String Pool  中是否存在“123 ”这个对象,如果不存在,则在String Pool  中创建一个“123 ”对象,然后将String Pool  中的这个“123 ”对象的地址返回来,赋给引用变量s,这样s 会指向String Pool  中的这个“123”字符串对象
    b) 如果存在,则不创建任何对象,直接将String Pool 中的这个“123”对象地址返回来,赋给s 引用。
2. String s = new String(“123”);
    a) 首先在String Pool  中查找有没有“123 ”这个字符串对象,如果有,则不在String Pool 中再去创建“123”这个对象了,直接在堆中(heap )中创建一个“123”字符串对象,然后将堆中的这个“123 ”对象的地址返回来,赋给s 引用,导致s 指向了堆中创建的这个“123 ”字符串对象。
    b) 如果没有,则首先在String Pool  中创建一个“123“对象,然后再在堆中(heap)创建一个”123“对象,然后将堆中的这个”123 “对象的地址返回来,赋给s引用,导致s 指向了堆中所创建的这个”123“对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2