package com.Hanjiangxue.javase.stringbuffer;
//实际字符串中频繁的拼接会有什么问题?
//字符串是不可变的,每一次拼接都会产生新字符串,这样占用大量的方法区内存,造成内存空间的浪费。
public class StringBufferTest01 {
public static void main(String[] args) {
String s = "";
//这样做会给字符串常量池带来很大的空间浪费。
for(int i = 0;i < 100;i++){
s += i;
}
}
}
package com.Hanjiangxue.javase.stringbuffer;
public class StringBufferTest02 {
public static void main(String[] args) {
//创建一个初始化容量为16个byte[] 数组。(字符串缓冲区对象)
StringBuffer sb = new StringBuffer();
//往StringBuffer里面放实际上是放入一个byte数组中
//append追加
//append在追加的时候,如果满了会自动扩容。
sb.append("a");
sb.append("b");
sb.append(3949);
//如何优化StringBuffer的性能:在创建StringBuffer的时候尽可能给定一个初始化容量,最好减少底层数组的自动扩容。
//预估一下,给定一个合适的初始化容量。
StringBuffer sb1 = new StringBuffer(100);
sb1.append("hifno");
}
}
package com.Hanjiangxue.javase.stringbuffer;
//java.lang.StringBuilder
//StringBufferh和StringBuilder的区别:
//StringBuffer中方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行时安全的。
//StringBuilder中方法都没有sycnhronized关键字修饰,表示StringBuilder在多线程环境下运行时不安全的。
//StringBuffer是线程安全的。
//StringBuilder是非线程安全的。
public class StringBufferTest03 {
public static void main(String[] args) {
//使用StringBuilder也可以进行字符串扩容。
StringBuilder sb = new StringBuilder();
sb.append(10);
sb.append("jwef");
}
}
package com.Hanjiangxue.javase.stringbuffer;
//面试题:String为什么不可变?
//String类中有一个byte[]数组,这个byte[]数组采用了final装饰,因为引用一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可指向
//其他对象,所以String不可变。
//StringBuilder、StringBuffer为什么可变呢?
//StringBuffer、StringBuilder内部实际上是一个byte[]数组,这个byte[]数组没有被final修饰,StringBuffer、StringBuilder的初始化容量为16,
//当存满了之后就会进行扩容,底层调用了数组拷贝的方法System.arraycopy(),所以StringBuilder、StringBuffer适用于频繁的拼接。
public class StringBuffer04 {
public static void main(String[] args) {
//字符串不可变是字符串字面量在方法区常量池创建了就不可变了。
}
}
网友评论