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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s = "abc";与String s = new String("abc");有什么区别?

15 个回复

倒序浏览
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:16
藤椅
很好的一道面试题,值得参考
回复 使用道具 举报
楼下总结的很好
回复 使用道具 举报
我的理解是:String s = "abc"先在栈内存中开辟一个空间,然后将字符串赋值给s两者都存在栈内存中;
而String s = new String("abc"),s存在于栈内存中,然后new String("abc")在堆内存中开辟一个空间新建一个字符串
"abc",然后将地址值赋给s.相当于类创建了一个新的对象,不知道可不可以这么理解.
回复 使用道具 举报 1 0
前者创建了一个对象,后者创建了两个对象。
回复 使用道具 举报
第一个是一个对象,第二个是两个对象
回复 使用道具 举报
李峥 中级黑马 2015-7-23 00:21:24
8#
String(String original)
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

这是String构造函数的说明,意思是new String("abc")是"abc"的副本.
所以new String("abc")有两个对象
回复 使用道具 举报
一个存放在栈中,一个存放在堆中。
String s="abc"会先在栈中查找有没有存在“abc”,如果没有再开辟空间;所以如果要比较字符串是否相等要用equals,用==比较的是地址;
用new的话时存储在堆内存中,每次的地址都不一样。
回复 使用道具 举报
楼下正解
回复 使用道具 举报
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有的常量优化机制;在计算是就把他们结合了:
*/        }
}
回复 使用道具 举报
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:第一个是一个一个对象第二个是两个对象
回复 使用道具 举报
恩恩,受教了
回复 使用道具 举报
学习了!
回复 使用道具 举报
了解了,受教了
回复 使用道具 举报
学习了!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马