String,StringBuffer与StringBuilder的区别研究(一)

先来看看String 类,该类实际是一个char类型的数组,String 的所有方法,都是在操作这个数组,看下面代码段:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    private final char value[];
    private final int offset;
    private final int count;
    private int hash; 
    private static final long serialVersionUID = -6849794470754667710L;

明白了这个,就算我们不看全部代码,都可以想象出String的所有操作都是围绕char数组做文章,更要命的是char数组被设置为fianal为不可改变的(注意:设置为final后,数组的内容还是可变的,但不能指向其他数组),。


所以,每次对字符串多次赋值的时候,String类都会产生一个新对象,原来的对象就丢在等垃圾回收了,所以String是比较花费性能的。

而StringBuffer与StringBuilder就不一样了,它们有一个父类AbstractStringBuilder,其中定义的数组为可变数组,还可以预先分配内存,如下代码:

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char value[];
    int count;
    AbstractStringBuilder() {
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

StringBuffer类与StringBuffer类以及其父类之后明天再详细分析,我们先来看看String常用的有哪些方法,先保证会用,再研究原理以及区别:

String:

length()返回char[]数组长度
isEmpty()数组长度是否等于0
charAt(int index)char[]数组的第index个字符(0为下标)
getChars()获取String 的char[]数组
equals()如果非同一对象,则对两个字符串数组逐一比较,如果有不同就返回FALSE
getBytes()将char数组转为Byte数组
contentEquals(CharSequence cs)内容是否相同
 equalsIgnoreCase(String anotherString):忽略大小写,判断两个字符串是否相同
 compareTo(String anotherString) :判断两字字符串从第X个字符就不同
regionMatches(int toffset, String other, int ooffset,int len)比较两个字符串是否相同,从第X位开始比较,比较LEN位
startsWith(String prefix, int toffset):开始toffset位是否与prefix相同,内部实际在比较数组的第toffset位
startsWith(String prefix)比较prefix字符串是否与源字符串相同,即从第一个字符开始比较,等价于startsWith(prefix, 0)
endsWith(String suffix):比较后面字符串是否相同

 indexOf(int ch):判断在CHAR数组的第X位
lastIndexOf()最后一个字符串匹配的位置
substring(int beginIndex, int endIndex)截取字符串
  public CharSequence subSequence(int beginIndex, int endIndex) :同样是截取字符串
concat()连接两个字符串,实际在内部合并两个字符串数组
replace(char oldChar, char newChar):替换字符
matches()是否符合正则表达式
contains()是否包含该字符串
 public String[] split(String regex):根据某个字符分割为多个字符串

toLowerCase():转为小写字母
toUpperCase():转为大写字母
trim()去掉空格
toCharArray()复制一遍字符串里的数组
format():调用Formater类进行格式化
public native String intern();//虚拟机内部方法,String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用,该方法主要用于提高性能,特别是大量字符串的情况。即调用常量池


这个常量池要注意一下,知道常量池后,对一下代码就不会迷惑了。

String a ="123";

String b ="123"

System.out.println(a==b);//结果为true,即指向同一个对象。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值