黑马程序员技术交流社区

标题: String s = "abc";与String s = new String("abc");有什么区别? [打印本页]

作者: 刘贤俊    时间: 2015-7-22 00:17
标题: String s = "abc";与String s = new String("abc");有什么区别?
String s = "abc";与String s = new String("abc");有什么区别?
作者: e咕噜    时间: 2015-7-22 23:00
String s = "abc" :s是存储在栈里。
先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令s指向”abc”,如果已经有”abc” 则直接令s指向“abc”。例子如下:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2); //true
说明s1和s2指向同一个对象

String s = new String("abc") : s是存储在堆里。
每调用一次就会创建一个新的对象。 例子如下:
String s1 =new String ("abc");
String s2 =new String ("abc");
System.out.println(s1==s2); // false
说明s1和s2是不指向同一个对象的
作者: 骑士@魔龙    时间: 2015-7-22 23:08
很好的一道面试题,值得参考
作者: Mr冷夏    时间: 2015-7-22 23:20
楼下总结的很好
作者: 曾云鹏    时间: 2015-7-22 23:24
我的理解是:String s = "abc"先在栈内存中开辟一个空间,然后将字符串赋值给s两者都存在栈内存中;
而String s = new String("abc"),s存在于栈内存中,然后new String("abc")在堆内存中开辟一个空间新建一个字符串
"abc",然后将地址值赋给s.相当于类创建了一个新的对象,不知道可不可以这么理解.
作者: Matrix_heima    时间: 2015-7-22 23:26
前者创建了一个对象,后者创建了两个对象。
作者: longbao    时间: 2015-7-22 23:40
第一个是一个对象,第二个是两个对象
作者: 李峥    时间: 2015-7-23 00:21
String(String original)
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

这是String构造函数的说明,意思是new String("abc")是"abc"的副本.
所以new String("abc")有两个对象
作者: xclyijin    时间: 2015-7-23 11:19
一个存放在栈中,一个存放在堆中。
String s="abc"会先在栈中查找有没有存在“abc”,如果没有再开辟空间;所以如果要比较字符串是否相等要用equals,用==比较的是地址;
用new的话时存储在堆内存中,每次的地址都不一样。
作者: rose_xiaomei    时间: 2015-7-23 16:10
楼下正解
作者: lizhichao    时间: 2015-7-23 18:26
public class demo2 {
        public static void main(String[] args) {
                                String str1 = "abc";
                String str2 ="abc";
                String str3 = new String("abc");
                String str4 = "a"+"bc";
                System.out.println(str4 == str1);
                System.out.println(str2.equals(str3));//'真
                System.out.println(str1==str2);//真 比较的是地址值;
                System.out.println(str2 == str3);//;假
                /*String = "abc";是在常量池中开辟一个空间 存入"abc":当再次 String str2 ="abc"时str就会在常量池中找到之前的创建的"abc"所以;
                str1 == str2为真   这正是说名他们指向同一个地址
                new String("abc");的意思是在堆内存中开辟空间;
                String str4 = "a"+"bc";        System.out.println(str4 == str1);这是因为java有的常量优化机制;在计算是就把他们结合了:
*/        }
}

作者: lizhichao    时间: 2015-7-23 18:30
public class demo2 {
        public static void main(String[] args) {
                                String str1 = "abc";
                String str2 ="abc";
                String str3 = new String("abc");
                String str4 = "a"+"bc";
                System.out.println(str4 == str1);
                System.out.println(str2.equals(str3));//'真
                System.out.println(str1==str2);//真 比较的是地址值;
                System.out.println(str2 == str3);//;假
                /*String = "abc";是在常量池中开辟一个空间 存入"abc":当再次 String str2 ="abc"时str就会在常量池中找到之前的创建的"abc"所以;
                str1 == str2为真   这正是说名他们指向同一个地址
                new String("abc");的意思是在堆内存中开辟空间;
                String str4 = "a"+"bc";        System.out.println(str4 == str1);这是因为java有的常量优化机制;在计算是就把他们结合了:
*/        }
}
2:第一个是一个一个对象第二个是两个对象
作者: qingger    时间: 2015-7-23 22:32
恩恩,受教了
作者: aurora_bessie    时间: 2015-7-23 23:09
学习了!
作者: lishang    时间: 2015-7-23 23:13
了解了,受教了
作者: myself123    时间: 2015-7-23 23:38
学习了!!!




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