String str = new String("abc");
String str2 = "abc";
第一个问题:第一种写法是否创建了两个对象?如果是,那么创建了哪两个对象?对象存放在堆中,声明的这个str存放在哪里,是堆中还是栈中?
第二个问题:第二种写法中的值“abc”是否存放在栈中?如果是,那么为什么都说栈中只能存放基本数据类型,可String   确是一个类?

解决方案 »

  1.   

    String是一个class,而JAVA默认都是用 new 来建立一个对象的,new的对象是在堆里面的,栈里面只是存着一个句柄,也就是一个房门号而已。int i = 1;计算机是将其放在栈里面的,
    这样的数据类型系统可以轻松的在栈里面处理。
      

  2.   

    我的理解是这样的:第一种写法,编译期会在“常量池”中创建一个东西(String常量),运行期会在堆里创建一个对象(String对象)、栈里创建一个变量(str)。第二种写法,编译期会在“常量池”中创建一个东西(String常量),运行期会在栈里创建一个变量(str)。
    ■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  3.   

    第一个String貌似可以理解为引用数据类型(new出来的) 第二个可以理解为基本数据类型
      

  4.   

    个人理解..String str = new String("abc");
    String str2 = "abc";
    第一个问题:第一种写法是否创建了两个对象?如果是,那么创建了哪两个对象?对象存放在堆中,声明的这个str存放在哪里,是堆中还是栈中?
    第二个问题:第二种写法中的值“abc”是否存放在栈中?如果是,那么为什么都说栈中只能存放基本数据类型,可String 确是一个类?No1.第一种写法只创建了一个对象,"abc"存放在栈中,指向它的引用地址存放在堆中.
    No2.是;因为"abc"只是所谓的值,对于底层来说,只是拼起来的数字,所以依然是基本数据类型,对于它的引用地址才会放在堆中.
      

  5.   

    第一个问题: 
       创建了2个对象,一个对象在栈中,一个对象在堆中,str变量在堆中
    第二个问题:
       只创建一个对象,该对象在栈中。
    通常new的对象是放在堆中的,元类型是放在栈中的。但是由于String是java中最经常使用的类(注意没有之一),所以设计者把这个类设计为final class,而且这个类也很特别。
      

  6.   

      应该是创建了一个对象,“abc”在堆内存中,而str,str2在栈内存中,都指向“abc”这个堆内存
      
      

  7.   

    String str = new String("abc");创建了2个对象,一个在堆中,一个在String池里。
    String str2 = "abc"; 没有创建对象,str2中的对象在String池里有了,直接用,所以一共创建了2个对象!