Forpersonaluseonlyinstudyandresearch;mercialuse螁下面是几个常见例子的比较分析和理解:肈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转载请标明出处.