下面是几个常见例子的比较分析和理解:finalStringBuffera=newStringBuffer("111");finalStringBufferb=newStringBuffer("222");a=b;//此句编译不通过finalStringBuffera=newStringBuffer("111");("222");//编译通过分析:final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指 向的对象 的变化,final是不负责的。Stringa="ab";Stringbb="b";Stringb="a"+bb;==b));//result=false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a"+bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。Stringa="ab";finalStringbb="b";Stringb="a"+bb;==b));//result=true 分析:和[3]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。所以此时的"a"+bb和"a"+"b"效果是一样的。故上面程序的结果为true。Stringa="ab";finalStringbb=getBB();Stringb="a"+bb;==b));//result=falseprivatestaticStringgetBB(){return"b";} 分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面程序的结果为false。通过上面4个例子可以得出得知:Strings="a"+"b"+"c";就等价于Strings="abc";Stringa="a";Stringb="b";Stringc="c";Strings=a+b+c; 这个就不一样了,最终结果等于:StringBuffertemp=newStringBuffer();(a).append(b).append(c);Strings=(); 由上面的分析结果,可就不难推断出String采用连接运算符(+)效率低下原因分析,形如这样的代码:lassTest{publicstaticvoidmain(Stringargs[]){Strings=null;for(inti=0;i<100;i++){s+="a";}}} 每做一次+就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,然后append字符串,如此循环直至结束。如果我们直接采用StringBuilder对象进行append的话,我们可以节省N-1次创建和销毁对象的时间。所以对于在循环中要进行字符串连
String 常量池问题的几个例子 来自淘豆网m.daumloan.com转载请标明出处.