String(String original)//创建一个String对象为original的拷贝
String(char[] value)//用一个字符数组创建一个String对象
String(char[] value,int offet,int count)//用一个字符数组从offset项开始的count个字符序列创建一个String对象
public char charAt(int index)//返回字符串中第index个字符
public int length()//返回字符串的长度
public int indexOf(String str)//返回字符串中出现str的第一个位置
public int indexOf(String str,int fromIndex)//返回字符串中从fromIndex开始出现str的第一个位置
public boolean equalIgnoreCase(String another)//比较字符串与another是否一样(忽略大小写)
public String replace(char oldChar,char newChar)//在字符串中用newChar字符替换oldChar字符
public boolean startWith(String prefix)//判断字符串是否以prefix字符串开头
public boolean endsWith(String suffix)//判断字符串是否以suffix字符串结尾
public String toUpperCase()//返回一个字符串为该字符串的大写形式
public String toLowerCase//返回一个字符串为该字符串的小写形式
public String subString (int beginIndex)//返回该字符串从beginIndex开始到结尾的子字符串
public String subString(int beginIndex,int endIndex)//返回该字符串从begin开始到endIndex结尾的字符串
public String trim()//返回将该字符串去掉开头和结尾空格后的字符串
public static String valueOf(...)//将基本类型数据转换为字符串
public String[] split(String regex)//将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。
StringBuffer()//创建一个不包含字符序列的“空”的StringBuffer对象
stringBuffer(String str)//创建一个StringBuffer对象,包含与String对象str相同的字符序列
public StringBuffer append(String str)//添加一个字符串
public StringBUffer append(StringBuffer sbuf)//添加StringBuffer字符串
public StringBuffer append(char[] str)//添加一个字符数组
public StringBuffer append(char[] str, int offset,int len)//添加一个字符数组的一部分
public StringBuffer append(double d)//把double类型转换成字符串添加到后面
public StringBuffer append(Object obj)//添加一个对象到StringBuffer
public StringBuffer insert(int offset,String str)//从offset位置插入
public StringBuffer insert(int ooset,double d)//把double的转换成字符串再插入进去
public int indexOf(String str)
public int indexOf(String str,int fromIndex)
public StringsubString(int start)
public String subString(int start,int end)
public int length()
和StringBuffer类似,常用方法也类似,这里不再赘述。
从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
String s = "abcd";
s = s + 1;
System.out.print(s); //result : abcd1
我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s,执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一个新的对象进行操作了,当然速度就快了。
举个的例子:
String str = “This is only a” + “ simple” + “ test”;
StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:
String str = “This is only a” + “ simple” + “test”;
其实就是:
String str = “This is only a simple test”;
所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,比如:
String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;
这时候JVM会规规矩矩的按照原来的方式去做。
线程安全 StringBuilder与 StringBuffer
StringBuffer:线程安全的
StringBuilder:线程非安全的
当我们在字符串缓冲去被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
总结:
如果要操作少量的数据用String
单线程操作字符串缓冲区下操作大量数据用StringBuilder
多线程操作字符串缓冲区下操作大量数据 用StringBuffer