Test实例
public class Test {
public static void main(String[] args) {
String s = "This is a string";
String s1 = "This is a string";
String s2 = s;
System.out.println(s.equals(s1));// true
System.out.println(s == s1);// true
System.out.println("---------------------------");
System.out.println(s.equals(s2));// true
System.out.println(s == s2);// true
System.out.println("---------------------------");
String s3 = new String("This is a string");
String s4 = new String("This is a string");
System.out.println(s1 == s3);// false
System.out.println(s1.equals(s3));// true
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
System.out.println("---------------------------");
StringBuffer str = new StringBuffer("This is aStringBuffer");
StringBuffer str1 = new StringBuffer("This is aStringBuffer");
StringBuffer str2 = str;
System.out.println(str == str1);// false
System.out.println(str.equals(str1));// false
System.out.println("---------------------------");
System.out.println(str == str2);// true
System.out.println(str.equals(str2));// true
System.out.println("---------------------------"); }
}
String 指向静态内存区域
public final class String extends Object implementsSerializable, Comparable ;
StringBuffer 指向动态内存区域
public final class StringBuffer extends Object implementsSerializable
不用new产生的String对象实际上是建立在常量池(内存中的一块区域)的,是属于编译器常量,即在所在类编译的时候就分配好了内存,随class文件一起载入,当另一个内容一样的字符串建立时,编译器并不会去再分配内存,而是先在常量池中找与该字符串匹配的对象,如果找到则指向找到的对象,如果找不到,再在常量池中分配内存;
String testStr = "aaa"; // 分配一块内存区域 相当于String testStr = newString("aaa");
testStr = "bbb"; // 相当于重新分配一块内存 testStr = new String("bbb");
testStr = "aaa" + "bbb"; // testStr = new String("aaa") + newString("bbb");
用new产生的String对象则属于执行期对象,它只有在程序执行中才去建立对象分配内存,因此每此new一个对象就会分配一块内存。
String对象在做为引数传递的是值,而StringBuffer则传递的是引用。
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的;
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。
Object类的equals()方法:
public boolean equals(Object obj){
return (this == obj);
}
此处equals()方法同==。
String类中重写Object类的equals()方法:
public boolean equals(ObjectanObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
StringanotherString = (String)anObject;
int n= count;
if (n== anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if(v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}