Java技能树之“字符串”
讲起Java中的字符串,一定少不了String,StringBuffer, StringBuilder这三个类,那么废话少说,就围绕他们三个开始讲起Java中的字符串吧。
一、背景。
这篇文章主要介绍了String、StringBuffer、StringBuilder的区别详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。
二、区别(两张图一清二楚)。
String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
可以看出来,再次给s赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,并且指向“def”这个字符串,s则指向最新生成的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。
StringBuffer 代码片段:
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 代码片段:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
String、StringBuffer、StringBuilder比较。
三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
String实现了三个接口:Serializable、Comparable<String>、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
执行速度由快到慢:StringBuilder > StringBuffer > String
代码实现:
StringBuffer是一个容器,长度可变,可以直接操作字符串,用toString方法变为字符串
1.存储
1)append(); //将指定数据加在容器末尾,返回值也是StringBuffer
eg:
StringBuffer sb = new StringBuffer(//可以加str);
StringBuffer sb1=ab.append(数据) //数据可以任何基本数据类型
注:此时sb == sb1他们是同一对象,意思是可以不用新建sb1直接 sb.append(数据) 使用时之后接使用sb
2)insert();// 插入
sb.insert(index ,数据);
2.删除
sb.delete(start ,end); //删除start到end的字符内容
//注意:这里的所有包含index的操作都是含头不含尾的
sb.deleteCharAt(index);//删除指定位置的字符
//清空StringBuffer缓冲区
sb=new StringBuffer();
sb.delete(0,sb.length());
3.获取
char c = sb.charAt(index);//获取index上的字符
int i = sb.indexOf(char)://获取char字符出现的第一次位置
//与 String 中的获取方法一致参考前面
4.修改 String类中无次操作方法
sb =sb.replace(start,end,string)//将从start开始到end的字符串替换为string;
sb.setCharAr(index ,char);//将index位置的字符变为新的char
5.反转 sb.reverse();//将sb倒序
6. getChars(int srcBegin,int srcEnd,char[] ch,int chBegin)
//将StringBuffer缓冲区中的指定数据存储到指定数组中
- 点赞
- 收藏
- 关注作者
评论(0)