String 是一个比较特殊的类,说他是常量我也不知道是否合适,但String的确有这样的特点。
从内存分配上来看,String a="123"; 内存开辟了空间存放"123"字符串
执行a=a+"4"; 大家都知道这个时候打印a得到的结果是"1234",但其实内存上并不是在123后面加上4的,而是重新开辟空间存放字符串"1234",前面的"123"字符串依旧存在于内存中(只是没有东西可以引用到他,在将来某个时刻被java虚拟机回收掉。)
同理,String a="1"+"2"+"3"这样的操作,会开辟3个内存空间存放"1"、"12"、"123"字符串,但最终只返回"123"的内存地址给变量。
执行大量的String拼接时的效率是非常低的,就是因为不断的开辟内存空间。
至于String s1=new String("bdj");后面能否再赋值,当然是可以的。原理是他并非像变量一样修改内存的值,而是重新开辟一块内存,创建新的对象。
对比一下变量就更清楚了,int i=0; 开辟内存空间赋值0。i=1;在内存中找到i,将1写入。