A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jonn 高级黑马   /  2013-1-11 22:54  /  5699 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

区别在哪儿呢?从jvm中堆栈角度分析并解释下,实在是难明白......

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

11 个回复

倒序浏览
tring str =“123”是在栈内存中建立了名字叫str的字符串类型的变量  并被赋值为字符串123,
String str=new String("123")是在堆内存建立了一个对象str,对象中存放着123这么一个数据。new是在堆内存创建一个实例的意思。
栈内存中的str是局部变量,  堆内存中str的是new创建的一个对象。

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

评分

参与人数 1黑马币 +10 收起 理由
刘志雄 + 10 赞一个!

查看全部评分

回复 使用道具 举报
基本类型的变量是在栈内存中分配,而new产生的对象是在堆内存中..
java堆栈详解
回复 使用道具 举报
首先前面的那个 String str="123"是在常量池创建了一个新的对象“123”
后一个  String str=new String("123") 首先也是新创建了一个对象“123”同时又对其进行引用也就是new了一个新的对象str指向了“123”。这是就有两个对象啦
如果再String str2=“123”这时不会在创建新对象,因为在常量池中可以找到“123”不会再次创建避免浪费内存
回复 使用道具 举报
可以查找java堆栈详解 http://blog.csdn.net/bangbt/article/details/6232299
回复 使用道具 举报
"123"本身就是一个对象,这个对象已经初始化了,然后,str指向了这个对象。第二句中String str=new String("123")又new了一个对象,所以有二个对象。
回复 使用道具 举报
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-11 23:15
tring str =“123”是在栈内存中建立了名字叫str的字符串类型的变量  并被赋值为字符串123,
String str=ne ...

String str = "123";字符串123是放在常量池中的,不是放在栈,只是变量str放在栈中。str指向常量池中的123
回复 使用道具 举报
高浩 中级黑马 2013-1-14 15:06:31
9#
String 它是一个特殊的类,   
可以String str="123";
可以创建对象  String str=new String("123");
调用了该类的构造函数,传了一个“123”参数,初始化了一个String 对象。
回复 使用道具 举报
黄锦成 发表于 2013-1-14 12:24
String str = "123";字符串123是放在常量池中的,不是放在栈,只是变量str放在栈中。str指向常量池中的12 ...

额,我还没有学到常量池,嘿嘿
回复 使用道具 举报
本帖最后由 崔仁军 于 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: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“对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马