不同创建 String 的方式的区别:String s1 = “abc“; String s2 = new String(“abc“);
程序员文章站
2024-03-22 17:28:46
...
简介
JVM 初始化时会维护9个对象池,会维护8个基本类型的包装类对象和String对象,新建时会先去对象池查看有没有对象,有取出没有新建。
查看区别
String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc";
String s4 = new String("abc");
// char value[]
System.out.println(s1 == s2); // false,引用不同,一个是单独创建的对象,一个是从对象池中取出对象
System.out.println(s1 == s3); // true,都是从对象池中拿对象
System.out.println(s2 == s4); // false,为两个单独创建的对象
-
String s1 = "abc";
是从对象池中取出对象,所以引用相同 -
String s2 = new String("abc");
是单独新建对象所以与其他 String 对象不同
其他
- Stirng 的
equals()
方法
实际上没有真正的 String ,而是 String在内部维护了一个 char 类型的数组private final char value[];
equals()
的源码
可以看到该方法实际上是把两个 String 对象的 char 数组进行遍历比较各个位数是否相同。public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }