对String类的理解网上有很多的资料,个人觉得很多都是错误的,错误的解释危害性更大。所以为了解释清楚,就来看代码,代码运行出的结果才是最具有说服力的。说明:以下都是个人的理解,欢迎指正。
运行结果:
看看运行结果后,给出我自己的理解说明:
1、String有一个所谓的String pool,这是一个什么东西呢,我理解是它是[color=red]堆(heap)上特殊的一个空间[/color](我叫它[color=red]特殊堆[/color])。注意它也是在堆上。
2、产生String类型的对象有两种方法,那么这两种方法有什么区别呢?我的理解是String str = “abc”是先用equals方法(String类覆盖了equals方法)判断这个特殊堆(String pool)是否有abc,有则将原来在栈中指向abc的引用赋值给str,否则就在这个特殊堆(String pool)上创建一个abc对象。String str2 = new String("abc")则是在[color=red]普通堆[/color]上创建abc对象。所以str和str2是指向不同的对象,它们是不同的。
3、String有个intern()方法,这个方法是个本地方法,当用String str2 = new String("abc")来创建对象时,它相当于告诉JVM,我这个abc对象是放在[color=red]特殊堆(String pool)[/color]上的。所以第三个打印结果是相等的。
4、需要注意的一点:String是final类,它是恒定类,一旦创建就无法改变,所以用intern()方法是重新在String pool中创建了一个新的对象。
5、String类有一个伴随类StringBuffer,需要了解它们之间的区别请google之。
public class StringTest {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
if (str1 == str2) {
System.out.println("str1 == str2");
} else {
System.out.println("str1 != str2");
}
String str3 = "abc";
if (str2 == str3) {
System.out.println("str2 == str3");
} else {
System.out.println("str2 != str3");
}
str1 = str1.intern();
if (str1 == str2) {
System.out.println("str1 == str2");
} else {
System.out.println("str1 != str2");
}
String str4 = new String("abc");
str4 = str4.intern();
if (str1 == str4) {
System.out.println("str1 == str4");
} else {
System.out.println("str1 != str4");
}
}
}
运行结果:
str1 != str2
str2 == str3
str1 == str2
str1 == str4
看看运行结果后,给出我自己的理解说明:
1、String有一个所谓的String pool,这是一个什么东西呢,我理解是它是[color=red]堆(heap)上特殊的一个空间[/color](我叫它[color=red]特殊堆[/color])。注意它也是在堆上。
2、产生String类型的对象有两种方法,那么这两种方法有什么区别呢?我的理解是String str = “abc”是先用equals方法(String类覆盖了equals方法)判断这个特殊堆(String pool)是否有abc,有则将原来在栈中指向abc的引用赋值给str,否则就在这个特殊堆(String pool)上创建一个abc对象。String str2 = new String("abc")则是在[color=red]普通堆[/color]上创建abc对象。所以str和str2是指向不同的对象,它们是不同的。
3、String有个intern()方法,这个方法是个本地方法,当用String str2 = new String("abc")来创建对象时,它相当于告诉JVM,我这个abc对象是放在[color=red]特殊堆(String pool)[/color]上的。所以第三个打印结果是相等的。
4、需要注意的一点:String是final类,它是恒定类,一旦创建就无法改变,所以用intern()方法是重新在String pool中创建了一个新的对象。
5、String类有一个伴随类StringBuffer,需要了解它们之间的区别请google之。
2013

被折叠的 条评论
为什么被折叠?



