浏览 2669 次
锁定老帖子 主题:彻底理解Java中的String类
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-23
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之。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |