论坛首页 入门技术论坛

彻底理解Java中的String类

浏览 2669 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-23  
对String类的理解网上有很多的资料,个人觉得很多都是错误的,错误的解释危害性更大。所以为了解释清楚,就来看代码,代码运行出的结果才是最具有说服力的。说明:以下都是个人的理解,欢迎指正。

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,这是一个什么东西呢,我理解是它是堆(heap)上特殊的一个空间(我叫它特殊堆)。注意它也是在堆上。

2、产生String类型的对象有两种方法,那么这两种方法有什么区别呢?我的理解是String str = “abc”是先用equals方法(String类覆盖了equals方法)判断这个特殊堆(String pool)是否有abc,有则将原来在栈中指向abc的引用赋值给str,否则就在这个特殊堆(String pool)上创建一个abc对象。String str2 = new String("abc")则是在普通堆上创建abc对象。所以str和str2是指向不同的对象,它们是不同的。

3、String有个intern()方法,这个方法是个本地方法,当用String str2 = new String("abc")来创建对象时,它相当于告诉JVM,我这个abc对象是放在特殊堆(String pool)上的。所以第三个打印结果是相等的。

4、需要注意的一点:String是final类,它是恒定类,一旦创建就无法改变,所以用intern()方法是重新在String pool中创建了一个新的对象。

5、String类有一个伴随类StringBuffer,需要了解它们之间的区别请google之。
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics