求索

Make it work, make it right, make it fast and make it open。
posts - 8, comments - 11, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

String pool

Posted on 2005-07-15 09:31 Java求索 阅读(1145) 评论(1)  编辑  收藏 所属分类: Java
今天写代码涉及到大量的String操作,突然间想起一些关于String与其它class的不同之处,我是我以前在一篇文章上看到的,具体出处实在记不得了,现在加上一点儿自己的理解记录下来,以作备忘。

String的特殊之处就是它可以像int等简单类型一样,使用“=”来生成一个Object,而不必用new这个关键字,为什么呢?先来看下面的代码:
import junit.framework.TestCase;

public class TestStringPool extends TestCase {

    
private String string1;
    
private String string2;

    
protected void setUp() {
        string1 
= "abc";
        string2 
= "abc";
    }


    
public void testStringPool() {
        assertTrue(string1 
== string2);
    }


    
public void testNewString() {
        string1 
= new String("abc");
        string2 
= new String("abc");
        assertFalse(
"The objects don't use the 
            string pool", string1 == string2);
    }

}

这里用到了JUnit,用来测试String pool

第一个测试,说明两个String是同一个Object,(==就是用来比较objectreference)。而第二个测试则说明两个String Object不同。

众所周知,JavaString不可改变的字符串对象。为了提高效率,JavaString类提供了串池(String pool)。正如大家所看到的那样,在第一个test中就使用了串池。当你重新声明一个String型变量为abc时,将使用串池里原来的那个abc,而不重新分配内存,也就是说,string2string1将会指向同一块内存。所以结果为true。在第二个test case中使用了普通对象的声明方式,系统将会为string1string2各分配一块内存。所以结果为false

 结论:我们比较两个String的值,最好用equals()方法,而最好不要使用==。这就避免了一些不必要的麻烦。另外,声明String的时候,最好用=,这样就可以体现String pool的作用了。


评论

# re: String pool  回复  更多评论   

2005-07-15 12:19 by emu
>>我们比较两个String的值,最好用equals()方法,而最好不要使用==

结论是对的,但是跟string pool没什么关系。

>>另外,声明String的时候,最好用=,这样就可以体现String pool的作用了。

结论也是对的,但是这样做不是为了体现String pool的作用而是避免重复创建对象。

只有注册用户登录后才能发表评论。


网站导航: