JAVA--StringBuffer,StringBuffer与String

JAVA这三个字符串相关的类有什么异同,此篇会予以说明.

StringBuilder

可变字符串类型.

特点:

  1. 没有重写Object类的equals()
  2. 重写了toString();
  3. 提供的多数方法都有返回值.即return this; (返回同一个地址).
  4. final修饰,意味着没有子类且不能被继承.

构造方法:

  1. StringBuilder():构造了一个空的字符串生成器,初始容量16字节.
  2. StringBuilder(String str):创建一个指定字符串的StringBuilder对象.

常用方法

  1. int length():返回有效字符的长度.
  2. StringBuilder append(Type a):将参数a追加到StringBuilder对象里.返回此对象.
  3. StringBuilder insert(int index,Type a):将a插入到对象的下标index处.
  4. StringBuilder delete(int start,int end):删除对象中部分字符,从start开始删除到end,范围[start,end),包前不包后
  5. StringBuilder replace(int start,int end,String str):使用str替换,从start到end.

以上内容的示例代码如下:

public class Tests  {
    public static void main(String[] args) {
        StringBuilder cache;
        String str=new String("String");
        /*构造器可以传入一个字符串对象*/
        StringBuilder sBuilder1=new StringBuilder(str);
        /*也可以直接传入字符串*/
        StringBuilder sBuilder2=new StringBuilder("StringBuilder");
        /*返回长度(int length())*/
        System.out.println("sBuilder2的长度:"+sBuilder2.length());
        /*拼接方法 StringBuffer append(Type a)*/
        cache=sBuilder1.append("Builder");
        System.out.println("拼接后的字符串sBuffer1:"+cache);
        /*插入方法 StringBuffer insert(int index,Type a) */
        cache=sBuilder1.insert(0,"这是");
        System.out.println("插入字符串后的字符串sBuilder1:"+cache);
        /*删除方法 StringBuffer delete(int start,int end)*/
        /*注意,该方法删除的区间为[start<=删除的区间<end]*/
        cache=cache.delete(0,2);
        System.out.println("删除方法后的字符串:"+cache);
        /*替换方法 StringBuffer(int start,int end,String str)*/
        /*替换的区间同上*/
        cache=cache.replace(6,13,"Buffer");
        System.out.println("替换方法后的字符串:"+cache);
    }
}

运行结果:

sBuilder2的长度:13
拼接后的字符串sBuffer1:StringBuilder
插入字符串后的字符串sBuilder1:这是StringBuilder
删除方法后的字符串:StringBuilder
替换方法后的字符串:StringBuffer

StringBuffer

此类与StringBuilder的用法一模一样.

但是线程安全性StringBuffer大于StringBuilder.

执行效率上StringBuilder大于StringBuffer.

测试两种类型的效率:分别追加5000万个字符.

两者的运行效率对比代码:

public class Tests  {
    public static void main(String[] args) {
       StringBuilder stringBuilder=new StringBuilder("1");
       StringBuffer stringBuffer=new StringBuffer("1");

       /*记录StringBuilder开始操作的时间*/
       long timeBuilderStart=System.currentTimeMillis();
        for (int i = 0; i < 50000000; i++) {
            stringBuilder.append(i);
        }
       long timeBuilderEnd=System.currentTimeMillis();
        /*计算StringBuilder完成操作所需的时间*/
       long timeBuilder=timeBuilderEnd-timeBuilderStart;
       /*记录StringBuffer开始操作的时间*/
        long timeBufferStart=System.currentTimeMillis();
        for (int i = 0; i < 50000000; i++) {
            stringBuffer.append(i);
        }
        long timeBufferEnd=System.currentTimeMillis();
        /*计算StringBuffer完成操作所需的时间,单位毫秒*/
        long timeBuffer=timeBufferEnd-timeBufferStart;
        System.out.println("StringBuilder完成操作所需的时间:"+timeBuilder+"毫秒");
        System.out.println("StringBuffer完成操作所需的时间:"+timeBuffer+"毫秒");
    }
}

执行结果:

StringBuilder完成操作所需的时间:1914毫秒
StringBuffer完成操作所需的时间:2682毫秒

可以看到在量极大的时候有明显的速度差距.

值得一提的是,跑这段代码的时候,java.exe占用了多达1GB~2.5GB的内存.... 

最高时占用内存2636104KB,合2.51GB...

String

底层是字符数组(char[])及其对数组的操作.

特点:

  1. 不可变的字符串,即对象内容不能更改.
  2. final修饰的类型.
  3. 字符索引从0开始.
  4. 重写了Object类的equals()与toString().
  5. 默认使用Unicode编码,任意字符都占用两个字节.

构造器:

  1. String():创建一个空字符序列的字符串对象.
  2. String(byte[] bs):将传入的byte数组按平台默认字符集解码.
  3. String(byte[] bs,Charset charset):将传入的byte数组按照指定字符集(charset)解码.
  4. String(char[] ch):将传入的char数组转换为字符串.
  5. String(String str):指定一个字符串字面量,创建一个字符串对象.

常用方法

1.int length():返回字符串对象的字符个数.

2.char chatrAt(int index):返回此字符序列中指定索引处的字符.

3.String concat(String str):将指定字符串拼接至本字符串末尾,返回新对象.

4.boolean startsWith(String prefix)与endsWith(String suffix):检查该字符串是否以prefix为前缀,suffix为后缀.

5.byte[] getBytes():将此字符串按照默认字符集编码为默认字节序列,返回此数组.

6.int indexOf(int ch/String str):返回该字符/字符串在此字符串第一次出现的位置.

7.int indexOf(int ch/String str,int fromIndex):返回该字符/字符串从该下标之后第一次出现的位置.

    如果返回-1,说明ch/str不存在于查找的序列中.

8. int lastIndexOf(int ch);
9.int lastIndexOf(String str)  
10.int lastIndexOf(int ch,int endIndex)
11.int lastIndexOf(String str,int endIndex)
 
8-11均是查找字符/子字符串在此字符序列中最后一次出现的位置,找不到返回-1.

12.String substring(int beginIndex),substring(int beginIndex,int endIndex):从beginIndex开始截取.截取至endIndex.区间[beginIndex,endIndex).

13.char[] toCharArray():字符串转换为字符数组.字符串中的字母转换为大写(toUperCase)或小写(toLowerCase),返回值为String.

14.String trim():去掉此字符序列前后的空格.

15.static String valueOf(Type v):任意参数v变为字符串对象.

16.equals(Object obj):比较两个字符串的内容是否相同.

equals()与==的区别:equals是比较内容是否相同,==比较是否是同一个对象.String类中重写了equals().

下面给出上面大部分方法的示例代码:

import java.util.Arrays;

public class Tests  {
    public static void main(String[] args) {
        String str1=new String("String");
        /*返回字符串中字符的个数int length()*/
        System.out.println("str1的长度:"+str1.length());
        /*返回指定索引处的字符 char charAt(int index)*/
        System.out.println("str1的第三个字符为:"+str1.charAt(2));
        /*指定字符串拼接 String concat(String str)*/
         String str2="字符串";
        System.out.println("将str2拼接至str1后:"+str1.concat(str2));
        /*检查是否以此为前缀,boolean startsWith(String prefix)*/
        /*此处以开始作为示例*/
        boolean f=str1.startsWith("s");
        System.out.println("str1是否以"+"s"+"为第一个字母:"+f);
        /*编码为默认字符集的字节序列 byte[] getBytes()*/
        byte[] strBytes=str1.getBytes();
        System.out.println("编码为字符集字符序列:"+Arrays.toString(strBytes));
        /*某个字符第一次出现的位置 int indexOf(String str)*/
        System.out.println("字符i第一次出现的位置:"+str1.indexOf("i"));
        /*截取方法 String subString(int beginIndex,int endIndex)*/
        System.out.println("截取字符串ing:"+str1.substring(3,6));
        /*转换为字符数组 char[] toCharArray()*/
        char[] strArray=str1.toCharArray();
        System.out.println("转换为char数组的str1:"+Arrays.toString(strArray));
        /*去掉前后空格的方法 String trim()*/
        String spaceStr=" String ";
        System.out.println("去掉前后空格之前的spaceStr:"+spaceStr);
        System.out.println("去掉前后空格的spaceStr:"+spaceStr.trim());
        /*任意数据变为字符串对象 String valueOf(Type v)*/
        /*因为是静态方法所以要用类名调取*/
        int num=10;
        System.out.println("num转换为字符串对象:"+String.valueOf(num));
        /*String类中已经重写的equals方法 boolean equals()*/
        String str3=new String("String");
        System.out.println("str1与str3:"+str1.equals(str3));
    }
}

执行结果:

str1的长度:6
str1的第三个字符为:r
将str2拼接至str1后:String字符串
str1是否以s为第一个字母:false
编码为字符集字符序列:[83, 116, 114, 105, 110, 103]
字符i第一次出现的位置:3
截取字符串ing:ing
转换为char数组的str1:[S, t, r, i, n, g]
去掉前后空格之前的spaceStr: String 
去掉前后空格的spaceStr:String
num转换为字符串对象:10
str1与str3:true

猜你喜欢

转载自blog.csdn.net/bujiujie8/article/details/81805357
今日推荐