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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Baiye 中级黑马   /  2014-8-20 21:12  /  1362 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Baiye 于 2014-8-21 10:38 编辑

String str = new ("abc");
这条语句会创建两个对象吗?

8 个回复

倒序浏览
记得不错的话是两个对象,常量池里面一个,堆里面一个!{:3_47:}
回复 使用道具 举报
String str = new ("abc"); 应该只创建一个对象,如下程序证明:
public class Test {
       
        public static void main(String[] args){
//                test_1();
                test_2();
        }
       
        public static void test_1(){
                String str1 = new String("abc");
                String str2 = "abc";
                System.out.println(str1==str2);
        }
       
        public static void test_2(){
                String str1 = "abc";
                String str2 = "abc";
                System.out.println(str1==str2);
        }

}
test_1打印false,说明String str = new ("abc");只创建一个对象,没有在常量池创建对象
test_2打印true,说明str1、str2都执行常量池。
回复 使用道具 举报
这是道面试题吆,任意字符串都是对象,此题在字符串常量池里有一个对象,在堆内存new 出来一个对象,共两个
回复 使用道具 举报
java_dream 发表于 2014-8-20 21:37
String str = new ("abc"); 应该只创建一个对象,如下程序证明:
public class Test {
       

test_1中,String str1 = new String("abc")在堆中new了一个String对象,同时在常量池中也创建了"abc",str1指向的地址是堆中对象的地址,str2指向的是常量池中"abc"的地址,所以结果为false。
回复 使用道具 举报 1 0
支持楼上的
回复 使用道具 举报
yqj 中级黑马 2014-8-22 16:52:42
7#
应该是跟两个对象相关连,但堆内存中肯定会创建一个新对象,如果常量池中有“abc”则直接将堆中的地址指向常量池中的“abc”,没有创建后在指向。这是我的理解吧
回复 使用道具 举报
同意大家的观点……
回复 使用道具 举报
是两个对象,一个池中一个,堆中一个,楼上代码详解!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马