String a = “abc”;
String b = new String("abc");
这两种声明方法得到的String是不一样的,第一种声明方法得到的String是存储在String常量池里面的,而第二种方式的声明很明显是正常的创建一个对象的使用方法,所以存储在堆中。
当String类直接赋值时,如果常量池内存在这个字符串,则s1直接指向常量池的地址,若没有,则先在常量池内创建这个字符串对象,s1直接指向常量池这个字符串的内存地址; 当String类使用new实例对象时,首先在堆里创建这个对象,若是常量池内没这个字符串,则也创建一个,然后堆里的对象的value指向常量池内的字符串。
所以答案是一个或者两个,如果常量池中原来有”abc”,则创建一个对象;如果常量池中原来没有”abc”,那么会创建两个对象