首先string是字符串常量,但是stringbuffer,stringbulder是字符串变量,当string初始化之后值是不可变的。
string在源码中的本质是一个char数组。
运行测试以下结果;
String str = "string" ; System.out.println(str.hashCode()); str = str + "Test"; System.out.println(str.hashCode()); String string = "string"; System.out.println(string.hashCode());
我们会发现str 前后的hashCode值不相等,我们知道虽然hashcode值相等对象并不一定相等,但是相等的对象hashcode的值一定
相同。所以前后的str 是两个对象。为什么呢? 当执行str =str +"Test" 系统实际上创建了一个新的str 对象 ,然后将旧的str对象
和“Test‘相加然后赋值给新的str对象,所以前后str对象不相同。
str和string hash code值相等的原因是因为,string再初始化时候先去栈中找是否存在”string“如果不存在就new String("string"),
如果存在就将str的地址指向string,等同于String string = str;
/* new StringBuilder()会创建一个大小为16的char数组 ,当有参数的时候,会加上参数的长度,参考stringBulder的源码 扩容机制为 旧容量*2+2 */ StringBuilder stringBuilder = new StringBuilder("string"); System.out.println(stringBuilder.hashCode()); stringBuilder.append("Test"); System.out.println(stringBuilder.hashCode());
因为stringbuffer是变量,所以stringbuffer的串联操作,对象没有发生改变。
运行效率问题:StringBuilder > StringBuffer > String
但是 string str = "string"+"Test";的效率是最高的等同于string str = "stringTest" 没有任何其他操作。
stringBuffer 和 stringBulder差别不大,主要是stringBulder线程是不安全的,stringBuffer线程是安全的,是在stringBulder的大多
方法上加了 synchronized关键字。单线程的情况下比较适用于stringbulder,速度快。