1.String类是public、final修饰的。
在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法。
查看源码得知,String类其实是通过char数组来保存字符串的。
对所有的String对象操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。
也就是说进行这些操作后,最原始的字符串并没有被改变,String类是不可变类。
如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串,因此频繁操作String效率会很低。
对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。
1 package com.rong.se; 2 3 public class UseString { 4 5 /** 6 * String操作 7 * @author 容杰龙 8 */ 9 public static void main(String[] args) { 10 String string="rong-jie-long"; 11 //String重载很多构造方法,不列举。。。 12 String str=new String("abc well"); 13 14 char ch = str.charAt(0); 15 System.out.println(ch); 16 int codePointAt = str.codePointAt(1); 17 System.out.println(codePointAt); 18 int codePointBefore = str.codePointBefore(1); 19 System.out.println(codePointBefore); 20 //相等返回0 比较大小 21 int compareTo = str.compareTo("abc well"); 22 System.out.println(compareTo); 23 int compareToIgnoreCase = str.compareToIgnoreCase("ABC WELL"); 24 System.out.println(compareToIgnoreCase); 25 //类似+ 26 String concat = str.concat(string); 27 System.out.println(concat); 28 //以什么开始 29 boolean endsWith = str.endsWith("ll"); 30 System.out.println(endsWith); 31 boolean startsWith = str.startsWith("abc"); 32 System.out.println(startsWith); 33 //包括索引位置为5的字符 34 String substring = string.substring(5); 35 System.out.println(substring); 36 String[] split = string.split("-"); 37 for (String string2 : split) { 38 System.out.println(string2); 39 } 40 //限制最多分成几段 41 String[] split2 = string.split("-", 3); 42 for (String string2 : split2) { 43 System.out.println(string2); 44 } 45 //比较是否相等,区分大小写 46 boolean equals = str.equals(string); 47 System.out.println(equals); 48 //比较是否相等,不区分大小写 49 boolean equalsIgnoreCase = str.equalsIgnoreCase(string); 50 System.out.println(equalsIgnoreCase); 51 int length = str.length(); 52 System.out.println(length); 53 // 。。。。。。。。。。。。。。。。。。 54 } 55 56 }
2.StringBuilder不支持并发操作,线程不安全的,不适合多线程中使用,但其在单线程中的性能比StringBuffer高,是可变类,
任何对它所指代的字符串的改变都不会产生新的对象。
1 package com.rong.se; 2 3 public class TestStringBuilder { 4 5 public static void main(String[] args) { 6 //创建StringBuilder对象 7 StringBuilder sb=new StringBuilder(); 8 StringBuilder stringBuilder=new StringBuilder("abcdefg"); 9 sb.append(123); 10 sb.append("hhh"); 11 sb.append(3.14159265354); 12 System.out.println(sb.toString()); 13 ////////////////////////////// 14 System.out.println(sb.charAt(3)); 15 //可变类, 操作后仍然是同一个对象,只是内容不一样 16 sb.delete(0, 10);//左闭右开,可返回对象,同一个对象 17 System.out.println(sb); 18 //删除索引位置字符,可返回对象,同一个对象 19 StringBuilder deleteCharAt = sb.deleteCharAt(0); 20 System.out.println(sb); 21 //true,同一个对象 22 boolean b = sb.equals(deleteCharAt); 23 System.out.println(b); 24 //获取字符串首次出现的索引位置 25 int indexOf = sb.indexOf("53"); 26 System.out.println(indexOf); 27 //从索引位置第几个开始插入字符串,可插入多种类型数据 28 sb.insert(3, "www"); 29 sb.insert(3, 123.123); 30 System.out.println(sb.toString()); 31 int lastIndexOf = sb.lastIndexOf("12", 6); 32 System.out.println(lastIndexOf); 33 System.out.println(sb.length()); 34 //替换。左闭右开原则。 35 StringBuilder replace = sb.replace(0, 3, "r"); 36 System.out.println(replace); 37 //反转 38 sb.reverse(); 39 System.out.println(sb); 40 // 从索引位置第n个起(包含n),截取字符串,生成新的字符串!!! 41 String substring = sb.substring(10); 42 System.out.println(substring); 43 //转成String 44 String string = sb.toString(); 45 System.out.println(string); 46 47 48 } 49 50 }
3.StringBuffer则是可变类,是线程安全的,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuffer的操作与StringBuilder操作类似,基本相同。略。。。。。。
总结:
可变与不可变、线程安全与不安全、执行效率
String直接相加字符串,效率很高,因为在编译器便确定了它的值,形如"a"+"b"+"c"; 的字符串相加,在编译期间便被优化;对于间接相加(包含字符串引用),形如s1+s2+s3; 效率要比直接相加低,因为在编译器不会对引用变量进行优化
String、StringBuilder、StringBuffer三者的执行效率:StringBuilder > StringBuffer > String(相对而言)
当字符串相加操作或者改动较少的情况下:String
当字符串相加操作较多的情况下:StringBuilder
当程序采用了多线程:StringBuffer