String StringBuffer StringBuilder

  • String类

String类是java.lang包下的类,他是封装char[ ]的类,他不是基本类型,但却是使用最为普遍的类之一。

String实现了三个接口 序列化java.io.Serializable,比较Comparable<String>,和数组可读序列Comparable<String>
他是一个final类,
               
               该类常用方法

String str = new String();

        str.charAt(i);//获取第i的字符

        str.length();//获取该串的长度

        str.substring(beginIndex, endIndex);截取从beginIndexendIndex(不包括第endIndex个字符)的字符串,并返回

        str.substring(beginIndex);//截取从beginIndex到末尾的字符串,并返回

        str.endsWith(suffix);//判断是否是一suffix字符串结尾,是为true,否为false

        str.startsWith(prefix);//判断是否是一prefix字符串开始,是为true,否为false

        str.compareTo(anotherString);//是根据ASCII的大小来比较,str>anotherString返回正数,相等为0,小于为负数

        str.contains(s);//判断str是否包含s字符串。是为true,否为false

        str.getBytes();//str转化成byte[]数组

        str.isEmpty();//判断是否为空

        str.indexOf(str1);//返回str中包含str1的位置,若包含返回第一个的位置,不包含怎返回-1.

        str.lastIndexOf(ch);//返回str中包含str1的位置,若包含返回最后一个的位置,不包含怎返回-1.

        str.equals(anObject);//该方法重写了,比较两个字符串是否相等

        str.replace(oldChar, newChar);//newCharchar类型)代替oldCharchar类型)

        str.split(regex);//regex字符串分割str字符串

        str.toLowerCase();//变小写

        str.toUpperCase();//变大写

        str.join(delimiter, elements);//拼凑

                 str.toCharArray();//str字符串变成char[]
 
  • StringBuffer 和StringBuilder

这两个类都是继承AbstractStringBuilder,两个类的扩容机制都是一样的,若用一个字符串初始化,封装char[]的长度为16+str.length(),扩容是2*原来长度+2;

由于StringBuffer 使用了同步,每一次都要判断锁,所以他是线程安全的,但效率要比StringBuilder低很多。

方法都很简单。

                     StringBuffer和StringBuilder的区别

1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,

2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,

而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 

3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全

而StringBuffer则每次都需要判断锁,效率相对更低

实现原理

 StringBuffer类继承自AbstractStringBuilder抽象类,实现Serializable序列化接口和CharSequence接口。

http://images2015.cnblogs.com/blog/519570/201703/519570-20170313134458260-563552692.png

AbstractStringBuilder抽象类实现Appendabel,CharSequence接口。

 StringBuffer初始化及扩容机制

1.StringBuffer()的初始容量可以容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增加。StringBuffer对象可以通过length()方法获取实体中存放的字符序列长度,通过capacity()方法来获取当前实体的实际容量。

2.StringBuffer(int size)可以指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增加。以便存放所增加的字符。

3.StringBuffer(String s)可以指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增加,以便存放所增加的字符。

扩容算法:

使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;

 

再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容

尝试将新容量扩为大小变成2倍+2   if 判断一下 容量如果不够,直接扩充到需要的容量大小。

http://images2015.cnblogs.com/blog/519570/201703/519570-20170313140333260-22062519.pnghttp://images2015.cnblogs.com/blog/519570/201703/519570-20170313140926620-722555980.png

JVM StringBuffer实现

 JVM内部采用了StringBuffer来连接字符串了,那么我们自己就不用用StringBuffer,直接用”+“就行了吧!“。是么?当然不是了。俗话说”存在既有它的理由”,让我们继续看后面的循环对应的字节码。

因为每次执行“+”操作时jvm都要new一个StringBuffer对象来处理字符串的连接,这在涉及很多的字符串连接操作时开销会很大。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值