Java中String,StringBuilder和StringBuffer类学习

一点点学习,加深下理解.

1.今天来理解一下字符串String类型.

首先,String不是基本类型,是一个Class,是引用类型.
看一看,String类型的定义:
public final class String implements java.io.Serializable,Comparable<String>,CharSequence
{
private final char value[]; //字符数组,用来存储字符
private final int offset;   //存储首个字符的索引
private final int count;    //字符个数.

//构造函数
//.....
public String(){
this.offset = 0 ;
this.count=0;
this.value=new char[0];
}
//...
public String(String original)
{
int size=original.count;
char[] originalValue=original.value;
char[] v;
if(originalValue.length>size){
int off=orginal.offset;
v=Arrays.copyOfRange(originalValue,off,off+size);
}else{
v=originalValue;
}
this.offset=0;
this.count=size;
this.value=v;
}
//...
public String(char value[])
{
int size=value.length;
this.offset=0;
this.count=size;
this.value=Arrays.copyOf(value,size);
}

//...
public int length(){
return count;
}
//...
public boolean isEmpty(){
return count==0;
}
//...
public char charAt(int index)
{
if(index<0 || index>=count){
throw new StringIndexOutOfBoundsException(index);
}
return value[index+offset];
}
//...


}
从上面的定义大概可以看出,String类型,其实跟C语言处理差不多,C语言中是没有字符串的概念,都是用字符数组来存储表示字符串.
并且这个字符数组被设计成了final,也就是说只能进行一次赋值,如果要对字符串进行改变.恐怕的另行他法.
例如:对字符串进行拼接,裁剪等修改操作,都是会另外生成字符串.

2.可变字符串,StringBuilder和StringBuffer

首先,看一下两个类的定义
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable,CharSequence
{
//...
public StringBuilder()
{
super(16);
}
//...
public StringBuilder(String str)
{
super(str.length+16);
append(str);
}
//...
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
   }
}

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable,CharSequence
{
//...
public StringBuffer()
{
super(16);
}

//...
public StringBuffer(String str)
{
super(str.length+16);
append(str);
}
//...
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
       return this;
   }
}
从上面可以初步看出来:
1.StringBuilder和StringBuffer继承自同一父类AbstractStringBuilder,
2.StringBuilder不保证线程安全,而StringBuffer保存线程安全(关键方法用synchronized关键字修饰)

而从AbstractStringBuilder的定义来看,上述两个可变字符串类型,也是用char[]来实现的.但是没有用final来修饰.
abstract class AbstractStringBuilder implements Appendable,CharSequence
{
char value[];
int count;

AbstractStringBuilder(int capacity)
{
value=new char[capacity];
}

public int length(){
return count;
}

public int capacity(){
renturn value.length;
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值