String、StringBuffer、StringBuilder

String类:底层使用char[]

常量对象:字符串常量对象是用双引号括起的字符序列

字符串的字符使用Unicode字符编码,一个字符占两个字节

String类较常用构造方法:

  • String  s1 = new String();
  • String  s2 = new String(String original);
  • String  s3 = new String(char[] a);
  • String  s4 =  new String(char[] a,int startIndex,int count)

String str  = “abc”; 与 String str1 = new String(“abc”); 的区别?

前者引用指向字符串常量池,后者引用指向堆空间新开辟的对象。

StringBuffer类:

java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。

l  很多方法与String相同,但StingBuffer是可变长度的

StringBuilder类:

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样

  • String:不可变字符序列
  • StringBuffer可变字符序列、效率低、线程安全
  • StringBuilder(JDK1.5)可变字符序列、效率高、线程不安全

String使用陷阱:

 string s="a"; //创建了一个字符串
 s=s+"b"; //
实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能

@Test
    public void test3() {
        String text = "";
        long startTime = 0L;
        long endTime = 0L;
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间:" + (endTime - startTime));

    }
StringBuffer的执行时间:10
StringBuilder的执行时间:4
String的执行时间:1091
原文地址:https://www.cnblogs.com/pjlhf/p/8667938.html