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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 未济64 初级黑马   /  2012-3-17 20:36  /  1930 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家看看有什么区别,好像第一句更加简洁一些啊!
        String str="abc";
        String str1=new String("abc");

  

7 个回复

正序浏览
存在着本质的区别,前面的是在栈中存储的,而后面的是堆中存储的。不是哪个简洁那么回事。
回复 使用道具 举报
      这是用两种形式来创建的,第一种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”;第二种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

    Java把内存划分成两种:一种是栈内存,一种是堆内存。
    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
    当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
    堆内存用来存放由new创建的对象和数组。
    在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
    在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
    引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
回复 使用道具 举报
String s=new String('abc')
String本身就是一个类,而一个字符串就是String类的匿名对象,如果使用了new关键字,那么无论如何都会重新开辟一个空间而这个空间的内容还是'abc'
之后另外一个“abc”就成垃圾了
加入用 String s='abc' 那么内存中始终只有一份abc 当重新再定义 String r='abc' 时 r和s 指向的是同一个内存空间
可以用这样的代码来验证

String s='abc' ;
String r='abc' ;
String b=new String('abc')

System.out.println(s==r);
结果返回的是true
System.out.println(s==b);
结果返回的false

则可以验证我上面所说的了,大致的理解就是像上面所说的一样!
回复 使用道具 举报
java中,有一个特殊的存储区域,为字符串常量池。当需要使用某个字符串时,会先到该常量池中搜索,若发现存在,则直接使用,否则就将该字符串加入到该池中。
对于第一句代码,编译会先到字符串常量池中查找,没找到"abc",则将“abc”添加到常量池去,然后str指向该字符串;
而第二句代码,是使用new来创建String对象,这样就会直接在堆上创建字符串对象。
当反复需要使用到“abc”时,可以看出明显是第一种方法更好
回复 使用道具 举报
经典案例,楼上正解,详情百度
回复 使用道具 举报
String str="abc";创建了一个对象
String s = new String(“abc”);实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。
其它的构造方法的参数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马