STRING与STRINGBUFFER的区别中说到:String类提供了数值不可改变的字符串
但 为什么string 能进行加法运算?例如:String str="a"; str+="b";

解决方案 »

  1.   

    新手往往在这个问题上疑惑不已。举个例子吧。
    你有一个电视遥控器str,它控制电视机a。
    str+="b"后,产生了一台新的电视机叫ab,现在遥控器str控制ab。
    但是电视a还是存在的,只是你手上没有遥控器控制它而已。
    也就是说你已经取不到字符a了,但是它其实仍然在内存中。它不可改变。如果用StringBuffer.则经过以上操作后,电视机a就不存在了,只有新产生的电视机ab存在。
      

  2.   

    不是加法,字符串连接,方便编程而已。
    理论上直接用+连接字符串性能方面不太好,可以考虑使用StringBuild.append()方法。
    不过用+连接,代码更清晰一点,所以如果不是特别强调性能,也可以使用。
      

  3.   


    是字符串的连接,字符串的连接在某些地方是很有用的,比如计算sum=2+22+222+...,这种问题用字符串的连接解决起来很方便...
      

  4.   

    那不是加法jvm对String进行了特殊处理
      

  5.   

    String类提供了数值不可改变的字符串,这句话是什么意思?要是数值不可改变的话,那么String的内容在定义以后是不是就不能再改变了?
    但String str="a"; str+="b";str的内容和长度都在改变,好像矛盾哟!
      

  6.   

    String str="a"; str+="b";这个其实是先生成一个“ab”,然后又把“ab”赋值给str;
      

  7.   

    编个小程序测试一下
    public class TestString { /**
     * @param args
     */
    public static void main(String[] args) {
        String str = "a";
        System.out.println("str ="+"a的哈希码 "+str.hashCode());
        str += "b";
        System.out.println("str ="+"ab的哈希码 "+str.hashCode());       
            
            }
    }
    执行结果为
    str =a的哈希码 97
    str =ab的哈希码 3105
    由此可见他们是两个不同的字符串.
      

  8.   

    这个问题要从字符串的存储说起,比如普通字符串(String str = "Hello"),其中“Hello”存储在内存的一块区域中,而str可以看做一个指向那块内存的引用,当我们对字符串“Hello”进行修改的时候,并不是针对那一块内存进行修改,而是另外开辟一块新内存,把计算的结果存储到新开辟的内存空间中,所以说String类型的字符串是无法修改的。
    StringBuilder和StringBuffer也是指向内存中一个字符串的,但是针对StringBuilder和StringBuffer类型的字符串进行操作的时候,修改是针对这一块内存的,或在这一块内存高位与低位增加新字符,或将内存中的字符删除,内中算法用c的思维想~
    关于字符串,涉及到大量加减操作的最好用StringBuffer和StringBuilder,另外要分清:StringBuffer是线程安全的,而StringBuilder是非线程安全的,也就是说涉及到多个线程对同一个字符串操作的时候,用StringBuffer。
    另外关于字符串还有性能的考虑,这里就不深究了~~
      

  9.   

    +1  这个讲的很全面。。  使用+连接符后,将生成一个新的str字符串变量,原来的废弃了。如果要对一个字符串
    过多的添减操作,建议使用StringBuffer,它可以自由的在原来字符串上改动。当然还有StringBuilder,上面已经说的很详细,就不罗嗦了。
      

  10.   

    多个字符串连接时,一般用 String.concat(),以使用程序的执行效率显著提高。
    但是,在 【String currentURL = request.getServletPath().concat(”?”).concat(request.getQueryString());】中,如果:request.getQueryString()==null,就会出现:java.lang.NullPointerException错误,
    所以:如果不知道一个字符串是否会为null,而且不再乎字符串中会跟一个null,就不应该用这种方法,可以这样用:
    String currentURL = request.getServletPath().concat(”?”)+ request.getQueryString();字符串连接还可以用StringBuilder.append() 或 StringBuffer.append() 。
    StringBuilder 的实例用于多个线程是不安全的,它不保证同步,被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用,因为在大多数实现中,它比 StringBuffer 要快。 
      

  11.   

    LZ如果想研究为什么字符串可以+操作
    那么可以看看西家家实现string的+操作-----运算符重载
      

  12.   

    重载了+号运算符。 JAVA中不允许程序员重载运算符
      

  13.   

    String 是一个 Class, str 是String class 定义的一个object. String str="a"; str+="b" 不是加法运算,只是字符串连接而已。
      

  14.   

    jvm底层进行的运算符重载啦....
      

  15.   


    亲,你这个解释真好,你看看string的hashCode算法,真想一板砖拍死你
        public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;            for (int i = 0; i < len; i++) {
                    h = 31*h + val[off++];
                }
                hash = h;
            }
            return h;
        }