String
Java中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但Java一般使用String类作为字符串的标准格式,Java编译器把字符串值作为String对象;
String对象一旦创建就不能改变。如果需要进行大量的字符串修改操作,应该使用StringBuilder/StringBuffer类或者字符串数组,最终结果可以被转换成String对象;
StringBuffer:线程安全的可变字符序列;
一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容;
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组;
如果内存缓冲区溢出,则此容量自动增大;
StringBuilder:从JDK1.5开始,为StringBuffer类补充了一个单个线程使用的等价类,即StringBuffer;
与StringBuffer相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所有速度更快;
常用方法:
public int length()
public int capacity()
public StringBuffer append(String str)
public StringBuffer insert(int offset,String str)
public int indexOf(String str)
public int indexOf(String str,int fromIndex)
public int lastIndexOf(String str)
public StringBuffer reverse()
public String toString()
1 public class StringBuilderDemo{ 2 public static void main(String []args){ 3 //StringBuilder sb="abc";//无此声明方式 4 //StringBuilder sb=new StringBuilder();//默认16个字符大小的容量 5 //StringBuilder sb=new StringBuilder(100);//初始化容量大小的动态字符串 6 //StringBuilder sb=new StringBuilder("abc");
7
8 StringBuilder sb=new StringBuilder(); 9 sb.append("hello"); 10 sb.append(1); 11 sb.append(1.5); 12 sb.append(true); 13 System.out.println(sb.length()); 14 System.out.println(sb.capacity()); 15
16 sb.insert(5,"world"); 17 System.out.println(sb.toString()); 18 sb.replace(5,7,"el"); 19 System.out.println(sb.toString()); 20 System.out.println(sb.indexOf("el")); 21 System.out.println(sb.reverse()); 22 } 23 }
自定义一个自己的StringBuilder的类
案例介绍:自定义一个MyStringBuilder类来实现StringBuilder的功能;
案例设计:实现append方法追加字符串的功能;实现length方法统计字符的个数;实现capacity()方法获取容器大小;实现toString()方法,完成字符串的输出;
1 import java.util.Arrays; 2 public class MyStringBuilderDemo{ 3 public static void main(String []args){ 4 MyStringBuilder msb=new MyStringBuilder(); 5 msb.append("hello").append("java").append("12345678"); 6 System.out.println("字符个数:"+msb.length()); 7 System.out.println("总容量大小:"+msb.capacity()); 8 System.out.println("输出字符串:"+msb.toString()); 9 } 10 } 11
12 class MyStringBuilder{ 13 private char[] value;//字符数组
14 private int count=0;//字符数组中存放字符的个数
15 public MyStringBuilder(){ 16 value=new char[16]; 17 } 18 public MyStringBuilder(int capacity){ 19 value=new char[capacity]; 20 } 21 public MyStringBuilder(String str){ 22 value=new char[str.length()+16]; 23 } 24 //得到字符数组中存放的字符个数
25 public int length(){ 26 return count; 27 } 28 //返回容器的容量大小
29 public int capacity(){ 30 return value.length; 31 } 32 //实现字符串的添加(追加)
33 public MyStringBuilder append(String str){ 34 int len=str.length();//获取要添加的字符串的长度 35 //确保字符数组能放进去所添加的字符串
36 ensureCapacity(count+len); 37 //把要添加的字符串追加到新的指定数组的指定位置后
38 str.getChars(0,len,value,count); 39 count+=len;//元素的个数增加了len
40 return this; 41 } 42
43 private void ensureCapacity(int capacity){ 44 //数据超出容量大小
45 if(capacity-value.length>0){ 46 int newCapacity=value.length*2+2;//扩容后的新字符数组大小
47 value=Arrays.copyOf(value,newCapacity); 48 } 49 } 50 //把字符数组的字符转换成字符串格式
51 public String toString(){ 52 return new String(value,0,count); 53 } 54 }