String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?


String是字符串常量,StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的,StringBuilder是非线程安全的。具体来说String是一个不可变的对象,每次修改String对象实际上是创新新对象,并将引用指向新对象。效率很低。StringBuffer是可变的,即每次修改只是针对其本身,大部分情况下比String效率高,StringBuffer保证同步(synchronized),所以线程安全。StringBuilder没有实现同步,所以非线程安全。但效率应该比StringBuffer高。StringBuffer使用时最好指定容量,这样会比不指定容量快30%-40%,甚至比不指定容量的StringBuilder还快。

String中的常用方法

1求字符串某一位置字符
publicchar charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。

String str = new String("asdfzxc");

2获取角标

 Int indexOf(char c) 例如:String s=”Java”;    Inta=s.indexOf(a);

3判断

 1:字符串是否包含某个字符串

booleancontains(str)//判断源字符串是否包含str字符串并返回boolean值

                                   例如:Stringstr=”My love Java”;

                                         Booleanb=str.contains(love);

                                   结果:true

2:字符串是否有内容

  booleanisEmpty()                例如:booleanb=str.isEmpty();

3:字符串是否以指定内容开始

  booleanstartsWith(str)          例如:booleanb=str.startsWith(“My”);

4:字符串是否以指定内容结束

   booleanendsWith(str);          用法如上

5:判断内容是否相同

  boolean equals(str)      //String类重写了Object类中的equals方法,该方法用于判断字符串内容是否相同而非判断地址

                                  例如: Stringstr1=”Java”;

                                          Stringstr2=”love”;

                                          booleans=str1.equals(str2);

6:判断内容是否相同,并忽略大小写

  BooleanequalsIngoreCase(str)    用法同上


4提取子串
用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:
1)publicString substring(int beginIndex)
//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
2)publicString substring(int beginIndex, int endIndex)
//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回
1 String str1 = new String("asdfzxc"); 2 String str2 = str1.substring(2);
//str2 = "dfzxc" 3 String str3 = str1.substring(2,5);//str3 = "dfz"
5字符串比较
1)public int compareTo(StringanotherString)
//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(StringanotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(ObjectanotherObject)
//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。

6字符串中字符的大小写转换
1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串
1 String str = new String("asDF"); 2 String str1 = str.toLowerCase();//str1 =
"asdf" 3 String str2 = str.toUpperCase();//str2 = "ASDF"
7字符串中字符的替换
1)public String replace(char oldChar, charnewChar)
//用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
2)public String replaceFirst(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
3)public String replaceAll(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
1 String str = "asdzxcasd"; 2 String str1 = str.replace('a','g');//str1 =
"gsdzxcgsd" 3 String str2 = str.replace("asd","fgh");//str2 = "fghzxcfgh" 4
String str3 = str.replaceFirst("asd","fgh");//str3 = "fghzxcasd" 5 String str4
= str.replaceAll("asd","fgh");//str4 = "fghzxcfgh" 字符串分隔 String[] split(String
str)//将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回。 1 String str = "asd!qwe|zxc#"; 2
String[] str1 = str.split("!|#");//str1[0] = "asd";str1[1] = "qwe";str1[2] =
"zxc";
8字符串与基本类型的转换
1、字符串转换为基本类型
java.lang包中有Byte、Short、Integer、Float、Double类的调用方法:
1)public static byte parseByte(String s)
2)public static short parseShort(String s)
3)public static short parseInt(String s)

字符串基本类型时,如int short dobule字符串中的数据一定要是数字,否则会出现异常
4)publicstatic long parseLong(String s)
5)publicstatic float parseFloat(String s)
6)publicstatic double parseDouble(String s)
例如:
1 int n = Integer.parseInt("12"); 2 float f = Float.parseFloat("12.34"); 3
double d = Double.parseDouble("1.124");
9基本类型转换为字符串类型
String类中提供了String valueOf()放法,用作基本类型转换为字符串类型。
1)static String valueOf(char data[])
2)static String valueOf(char data[], intoffset, int count)
3)static String valueOf(boolean b)
4)static String valueOf(char c)
5)static String valueOf(int i)
6)static String valueOf(long l)
7)static String valueOf(float f)
8)static String valueOf(double d)
例如:
1 String s1 = String.valueOf(12); 2 String s1 = String.valueOf(12.34);
10和数组有关的方法

返回类型 方法名作用 byte[] getBytes() 将一个字符串转换成字节数组char[] toCharArray() 将一个字符串转换成字符数组
String[]split(String) 将一个字符串按照指定内容劈开

isEmpty:判断是否为空

public boolean isEmpty()

当且仅当 length() <https://blog.csdn.net/aa518189/article/details/79144103> 为 0
时返回 true。

 

 

StringBuffer的用法

StringBuffer的原理


StringBuffer继承了抽象类AbstractStringBuilder,在AbstractStringBuilder类中,有两个字段分别是char[]类型的value和int类型的count,也就是说,StringBuffer本质上是一个
字符数组:

 

S在使用StringBuffer 的时候,习惯性的像String一样把他初始化为了

[java] view plain <http://blog.csdn.net/jason0539/article/details/20899087>copy
<http://blog.csdn.net/jason0539/article/details/20899087>

StringBuffer result = null;  

结果警告:Null pointer access:The variable result can only be null at this location

运行后报错,才意识到StringBuffer和String还是有很多区别的,摆渡了些资料整理出来,共享。

以下部分转载自http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html 


StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

  所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

另外由于StringBuffer是线程安全的,
关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

1、StringBuffer对象的初始化

StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

例如:

StringBuffer s = new StringBuffer();

这样初始化出的StringBuffer对象是一个空的对象,就是我犯的错误。

如果需要创建带有内容的StringBuffer对象,则可以使用:

        StringBuffer s = new StringBuffer(“abc”);

这样初始化出的StringBuffer对象的内容就是字符串”abc”。

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

        StringBuffer s = “abc”;              //赋值类型不匹配

        StringBuffer s = (StringBuffer)”abc”;    //不存在继承关系,无法进行强转

StringBuffer对象和String对象之间的互转的代码如下:

        String s = “abc”;

        StringBuffer sb1 = newStringBuffer(“123”);

        StringBuffer sb2 = newStringBuffer(s);   //String转换为StringBuffer

        String s1 =sb1.toString();             //StringBuffer转换为String

        2、StringBuffer的常用方法

StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

a、append方法

        public StringBuffer append(boolean b)//在String中用+号连接字符串

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

                 StringBuffer sb = newStringBuffer(“abc”);

                  sb.append(true);

         则对象sb的值将变成”abctrue”。

使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

                  StringBuffer sb = new StringBuffer();

                  String user = “test”;

                  String pwd = “123”;

                  sb.append(“select * from userInfo where username=“)

                   .append(user)

                   .append(“ and pwd=”)

                   .append(pwd);

         这样对象sb的值就是字符串“select* from userInfo where username=test and pwd=123”。

这完全不是在一个层次上,希望各位谨记!大量字符串连接一定要用append
()方法,原因呢其实很简单,字符串连接每次都需要创建新的字符串对象来保存新串,这样。。。。。。你懂得!

b、deleteCharAt方法

        public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

        StringBuffer sb = new StringBuffer(“Test”);

        sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。

还存在一个功能类似的delete方法:

        public StringBuffer delete(int start,int end)

该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

        StringBuffer sb = new StringBuffer(“TestString”);

        sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

c、insert方法

        publicStringBuffer insert(int offset, boolean b)

       该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

                  StringBuffersb = new StringBuffer(“TestString”);

                 sb.insert(4,false);

该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

d、reverse方法

        publicStringBuffer reverse()

该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

        StringBuffer sb = new StringBuffer(“abc”);

        sb.reverse();

经过反转以后,对象sb中的内容将变为”cba”。

e、setCharAt方法

                           public void setCharAt(int index, char ch)

                            该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

                                    StringBuffer sb = new StringBuffer(“abc”);

                                    sb.setCharAt(1,’D’);

                            则对象sb的值将变成”aDc”。

f、trimToSize方法

         publicvoid trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

         总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

StringBuilder详解


StringBuilder和StringBuffer一样,都是继承自抽象类AbstractStringBuilder类,也是一个可变的字符序列。StringBuilder和StringBuffer非常相似,甚至有互相兼容的API,不过,StringBuilder不是线程安全的,这是和StringBuffer的主要区别。StringBuilder的层次结构如下:





StringBuilder类被设计成在不需要多线程安全的情况下替换StringBuffer类的。如果程序中不需要多线程安全,推荐使用StringBuilder类,因为没有了同步的操作而速度上比较快。

StringBuilder和StringBuffer一样,主要的操作有append和insert等。

2、StringBuilder原理

StringBuilder的原理和StringBuffer一样,不同之处在于StringBuilder不需要考虑线程安全。具体的原理参见另一篇
StringBuffer详解 <http://blog.csdn.net/u012877472/article/details/50808554>。

 

3、常用方法

StringBuilder的常用方法和StringBuffer的一样。列出如下: