java(一) string,stringbuffer,stringbulder简析

 首先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,速度快。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值