java中对于String类的理解

1.首先比较下String.equals()和Object.equals()两个方法。

以前对应这两个方法是很混淆,比如                   

                   Object obj1 = new Object();

                   Object obj2 = new Object();

 使用 obj1.equals(obj2)返回false;而

                   String str1 = new String("abc");

                   String str2 = new String("abc");

使用 str1.equals(str2)返回true,看到这样的结果很疑惑,然后查看了Object.equals和String.equals的源码。

Object.equals():

 public boolean equals(Object obj) {
return (this == obj);
    }

代码很简单,在看看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;
   }
}
return false;
    }

Object中定义的equals()方法它是判断调用equals()方法的引用与传进来的引用是否一致,即表示这两个引用是否指向的是同一个对象。对于Object类的equals()方法来说,它等价于==;对于String的equals方法来说他是判断当前字符串与传进来的字符串是否一致(源码中通过对字符串的每个字符进行比较)。对于String类型的相等性来判断,使用equals,不要使用==。

查看了jdk api的文档,前者解释为:指示其他某个对象是否与此对象“相等”。后者解释为:将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。

2.关于String的拼接
String s1 = "a";
String s2 = "b";
String s3 = s1+s2;
String是常量,它的对象一旦创建完毕就不能改变。当使用“+”拼接字符串的时候,会生产新的String对象,而不是想原来的String对象追加内容。
3.关于String s="abc"的理解
String  s="abc";首先会查找字符常量池中是否存在"abc"这个对象,如果不存在,则在常量池中创建一个"abc"的对象,并将常量池中"abc"对象的地址返回来,赋值给引用变量s,那么s就会指向常量池中的这个“abc”字符串对象。如果存在,就不用创建这个对象,直接将该对象的地址返回,赋值给引用变量s。
4.关于String s=new String("abc")的理解
首先会在常量池中查找是否有abc这个对象,如果用,直接在堆中创建一个“abc”字符串对象,然后将堆中的该字符串对象的地址返回,赋值给s引用,因此s对象指向了堆中创建的这个“abc”字符串对象。如果常量池中没有这个对象,则在常量池中创建一个“abc”的字符串对象,然后再再堆中创建一个"abc"对象,然后将堆中该字符串对象的地址返回,赋值给s引用,因此s对象指向了堆中创建的这个“abc”字符串对象。

              

你可能感兴趣的:(java)