类 String
字符串(String)对象一旦创建,其内容不能再被修改 (read-only)
类 StringBuffer
StringBuffer 对象的内容是可以被修改的
除了字符的长度之外,还有容量的概念
通过动态改变容量的大小,加速字符管理
这段话是什么意思?
字符串(String)对象一旦创建,其内容不能再被修改 (read-only)
类 StringBuffer
StringBuffer 对象的内容是可以被修改的
除了字符的长度之外,还有容量的概念
通过动态改变容量的大小,加速字符管理
这段话是什么意思?
str = str + "bbb";看似乎变了,可是在内存里 "aaaa" 还是存在着.他是不变的.
变的是在内存里又重新划分了个区域存放 "aaaabbb" ,然后 str 指向 "aaaabbb".
StringBuffer sb = new StringBuffer("aaaa");
sb.append("bbb");这个先在内存里划分了快区域存放 "aaaa" , 当 sb.append("bbb"); 时, "aaaa" 变成了 "aaaabbb"
String str = "aaa";
str = str + "bbb";
str = str + "ccc";
str = str + "ddd";这个时候内存(堆)里存放着 "aaa" , "aaabbb" , "aaabbbccc" , "aaabbbcccddd"; StringBuffer sb = new StringBuffer("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");这个呢内存(堆)里只存放着最终的结果: "aaabbbcccddd" .
就耗掉的内存来说 StringBuffer 小多了。所以当字符串经常变化时推荐使用 StringBuffer
boolean也是不可变的?好像编程经常用到boolean变量被改变的情况。
Java会创建一个新的String对象来保存结果,就是"abczqw",但原来的String对象"abc"并没有改变
str = str + "bbb";内存里存在三块区域“aaaa”、“bbb”、“aaabbb” 直到jvm
/**
* The <code>String</code> class represents character strings. All
* string literals in Java programs, such as <code>"abc"</code>, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created.
当你改变这个变量的值后,JVM在堆中会建立一个新的对象,同时把栈里的句柄指向新的对象。就这个意思。
最重要的是,旧的对象此时是不被清除的。。所以你频繁改变变量的值时,会产生很多垃圾对象,解决办法就是用stringbuffer。