1.创建String对象的两种方式及区别:
1)String a = "abc";(采用字面值方式赋值):查找String Pool中是否存在"abc"这个对象,如果不存在,则在String Pool中创建一个"abc"对象,然后将String Pool中的这个"abc"对象的地址返回回来,这样a会指向String Pool中的这个"abc"字符串对象;如果存在,则不创建任何对象,直接将String Pool中的这个"abc"对象返回来,赋给a。
2)String b = new String("abc");首先在StringPool中查找有没有"abc"这个对象,如果有,则不在String Pool中再去创建"abc"这个对象,直接在堆中创建一个"abc"字符串对象,然后将堆中的这个"abc"对象返回来,使得b指向了堆中创建的"abc"对象;如果Sting Pool中没有,则先在String Pool中创建一个"abc"字符串对象,再去堆中创建一个"abc"字符串对象,最后返回堆中创建的对象。
2.String类重写了equals方法,其比较的是字符串的内容,代码如下
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (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;
}
}
3."=="比较的是两个对象在内存中的地址,即两个对象引用是否指向同一个对象。
观察你的代码,你的意图是用判定a、b两个对象引用的equals和==关系。根据第一种字符串对象创建方式可得,均返回true。 |