三种字符串类:String,StringBuilder,StringBuffer
String类
1. 常用构造器
构造器 | |
public String(char value[]) | |
public String(char value[],int offset,int count) |
2. 常用方法
方法 | 功能 |
public char charAt(int index) | a.charAt[i]类似于C中a[i] |
public char[] toCharArray() | |
public String subString(int begin,int end) | |
public boolean equals(Object o) | |
public int length() | |
public String trim() | 将前导和后继空格或缩进(不可见字符)去掉 |
3. String对象的不可变性
存在代码如下
String a="abab"; String b= "ab"+"ab"; System.out.println(a==b); b="ab"; String c=b+"ab"; System.out.println(a==c);
结果为true false,原因是Java中每一个String对象都是不可变的。JVM在堆内存中为String对象开辟了一个空间叫做字符串常量池,每个已创建的String对象都会放在这个内存空间中,很显然String c指向的字符串常量和String a指向的字符串常量的地址是不同的,因此输出false。那么 之前比较String a和String b为什么又输出true了呢?,因为Java为了节省内存空间,在两个字符串常量进行连接时会检查池中是否已经存在该目标字符串,如果存在,就直接返回该串的指针。
4. String对象不好的地方
前面说过,String对象是不变的,因此一旦存在大量的String拼接等变化时,String的效率将会变得很低
StringBuilder类
1. 常用构造器
构造器 | |
public StringBuilder(String str) | |
public StringBuilder(int capacity) | 指定容量为capacity个字符 |
public StringBuilder() | 默认容量为16个字符 |
2. 常用方法
方法 | 功能 |
public StringBuilder append(String str) | 可以不设返回,简写可为a.append(b) ,也可写成a=a+b,同时,StringBuilder只能与String拼接 |
public StringBuilder insert(int offset,String str) | |
public StringBuilder delete(int start,int end) | |
public StringBuilder reverse() | |
public String toString |
3. StringBuilder的优缺点
相对于String对象,在于增删查改方面,StringBuilder效率好多了,但StringBuilder并没有对增删查改方法进行同步,因此StringBuilder类并不是线程安全的,在多线程操作时会出现问题。
StringBuffer类
相对于StringBuilder,StringBuffer增加了线程安全机制,方法实现了同步。不过构造器和方法跟StringBuilder基本一样,这里就不再记录~
不过相较于StringBuilder类,StringBuffer由于实现了同步,可能效率上要比StringBuilder要低一点,不过也很有限。
对于同一个程序,两者跑完58组数据的时间相差也就100ms左右