好久、好久、好久没有写博客了。自从上个公司离职后,觉得我的博客习惯被打破了,自己的自控能力还是好弱。
今天来简单介绍一个比较基础的问题,因为有人可能会搞混,或者不是很明确,简单说一下,并且用到实战中。
String
String 应该是我们平时在开发中用到最多一个变量了叭,举个例子:
private String m_spos;
或者
private String m_spos = "";
--我们还需要知道,这个情况下,底层做了哪些操作:
new 对象,大家应该都很不陌生,String是一个不可变的变量,我们在代码中可能还会这样写道:
String a = "a";
String b = "b";
String c = "c";
c = c + a;
c = c+b;
老玩家应该会注意到,为什么不用StringBuffer; 其实这样的问题我曾经也有过疑问,StringBuffer有什么优势吗?
这里我们先声明一下对String这样操作之后,底层做了什么:
String c = "c"; 相当于new了一个 c 对象,
c = c + a; 相当于又new了一个c对象,然后将以前的值覆盖掉。
c = c+b; (同上)
下面来说StringBuffer吧
StringBuffer
StringBuffer也简单说一下平时的使用:
StringBuffer sb = new StringBuilder();
sb.append(“a”);
sb.append(“b”);
sb.append(“c”);
sb.toStriing();//得到我们最终需要的字符串
简单说一下做了什么工作吧:
StringBuffer sb = new StringBuilder(); 新建一个对象
sb.append(“a”); 拼接内容,对象地址并不做改变。
sb.append(“b”);(同上)
sb.append(“c”);(同上)
说到这里,大概知道谁的性能要好一些了叭。
再来说一下,StringBuilder
StringBuilder
其实StringBuilder与StringBuffer是一样的,这里要贴出一点StringBuilder与StringBuffer的源码对比,用来区分StringBuilder与StringBuffer的区别。
StringBuilder
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
StringBuffer
/**
* @since JDK1.0.2
*/
@Override
public synchronized StringBuffer reverse() {
toStringCache = null;
super.reverse();
return this;
}
最后我们来总结一下,
String 每次拼接都会改变对象值,并且要新建一个对象
StringBuffer 不改变地址值,并且拼接字符串,线程安全(拥有锁:synchronized)
StringBuilder 不改变地址值,并且拼接字符串,线程不安全。
注:不了解同步锁的同学自行百度,补基础,根据业务需要选择不同的类。会有意想不到的收获
网友评论