String对象直接用双引号创建的字符串将会被放入堆中的常量池中
(JDK1.7之后位于堆中),当使用双引号直接创建的字符串值相同时会在池中查找是否有相同的值,如果找到将会直接使用(通过地址值进行指向),没有的话将重新创建,String的创建都是基于byte的进行的,当通过new的方式创建字符串时,String对象将不会放入常量池而是直接位于堆中(常量池除外)并且会被赋予地址值
public class StringClass {
public static void main(String[] args) {
String string = "abc";
String string1 = "abc";
String string3 = new String("abc");
System.out.println(string3.equals(string));//true
System.out.println(string.equals(string1));//true
}
}
上述中的字符串也是一个对象,但是在比较时直接比较的是字符串内容是因为java.lang.String包中的String对这个方法进行了覆盖重写,
具体可以自行看源码