java中对于String类的理解
2011-08-09 15:13
281 查看
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的文档,前者解释为:指示其他某个对象是否与此对象“相等”。后者解释为:将此字符串与指定的对象比较。当且仅当该参数不为
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”字符串对象。
以前对应这两个方法是很混淆,比如
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”字符串对象。
相关文章推荐
- day 1:对Java的初步认识(对于环境变量的理解等)
- java中对于多态的理解(自己总结版)
- 深入理解java String类
- 对于Java泄露的理解与解决过程
- Java中String类的intern()方法深入理解。
- Java中对于main函数的理解
- 黑马程序员——对于java语言的理解
- 初学java,对于MVC模式的理解
- Java中String类的一些理解
- Java 基础(9)—— 对于 堆、栈、方法区的简单理解
- 新手对于java集合的理解
- 对于Java转型的一些个人理解
- 对于java中运算符‘%’的理解
- 对于Java监听器的理解
- Java中对于callback的理解
- java中的对于多态的理解
- java中关于栈、堆、常量池介绍和关于String类的理解
- 对于Java静态内部类的理解
- 对于java中接口的作用与理解
- Java对于静态的理解