在Java中封装了三个字符串类,分别为String、StringBuffer、StringBilder。
一、String类
String类是一个final类,其具有不可变性使用String类拼接字符串时应该注意:
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
只要其中有一个是变量,结果就在堆中
如果拼接的结果调用 intern() 方法,返回值就在常量池中
String类比较常用,其构造方法如下:
方法声明 |
功能描述 |
String() |
创建一个内容为空的字符串 |
String(String value) |
根据指定的字符串内容创建对象 |
String(char[] value) |
根据指定的字符数组创建对象 |
String(byte[] bytes) |
根据指定的字节数组创建对象 |
由于String类比较常用,也可以直接定义字符串常量:String str="abc";
String类的常用方法有:
方法声明 |
功能描述 |
int indexOf(int ch) |
返回指定字符ch在字符串中第一次出现位置的索引 |
int lastIndexOf(int ch) |
返回指定字符ch在字符串中最后一次出现位置的索引 |
int indexOf(String str) |
返回指定子字符串str在字符串第一次出现位置的索引 |
int lastIndexOf(String str) |
返回指定子字符串str在此字符串中最后一次出现位置的索引 |
char charAt(int index) |
返回字符串中index位置上的字符,其中index的取值范围是0~(字符串长度-1) |
Boolean endsWith(String suffix) |
判断此字符串是否以指定的字符串结尾 |
int length() |
返回此字符串的长度 |
boolean equals(Object anObject) |
将此字符串与指定的字符串比较 |
boolean isEmpty() |
判断字符串长度是否为0,如果为0则返回true,反之则返回flase |
boolean startsWith(String prefix) |
判断此字符串是否以指定的字符串开始 |
boolean contains(CharSequence cs) |
判断此字符串中是否包含指定的字符序列 |
String toLowerCase() |
使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() |
使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) |
将int变量i转换成字符串 |
char[] toCharArray() |
将此字符串转换为一个字符数组 |
String replace(CharSequence oldstr, CharSequence newstr) |
返回一个新的字符串,它是通过用 newstr替换此字符串中出现的所有 oldstr得到的 |
String[] split(String regex) |
根据参数regex将原来的字符串分割为若干个子字符串 |
String substring(int beginIndex) |
返回一个新字符串,它包含从指定的beginIndex处开始,直到此字符串末尾的所有字符 |
String substring(int beginIndex, int endIndex) |
返回一个新字符串,它包含从指定的beginIndex处开始,直到索引endIndex-1处的所有字符 |
String trim() |
返回一个新字符串,它去除了原字符串首尾的空格 |
String类的练习题:
1.模拟一个trim方法,去除字符串两端的空格
@Test /** * 模拟一个trim方法,去除字符串两端的空格 */ public void test1(){ String s=" 1 23 "; String s1=s.replaceFirst(" ",""); char[] chars=s1.toCharArray(); char[] chars1=new char[chars.length-1]; for(int i=0;i<chars.length-1;i++){ chars1[i]=chars[i]; } String s2=new String(chars1); System.out.println(s); System.out.println(s2); }
运行结果为:
1 23
1 23
2. 将一个字符串进行反转。将字符串中指定部分进行反转。比如 “ab cdef g” 反
转为 ”ab fedc g”
@Test /** * 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反 * 转为”abfedcg” */ public void test2(){ String str="abcdefg"; String substr="bcd"; int index=str.indexOf(substr); char[] chars=str.toCharArray(); for(int i=index,k=0;i<(index+substr.length())/2;i++,k++){ char ch=chars[i]; chars[i]=chars[index+substr.length()-1-k]; chars[index+substr.length()-1-k]=ch; } String str1=new String(chars); System.out.println(str); System.out.println(substr); System.out.println(str1); }
运行结果为:
abcdefg
bcd
adcbefg
3. 获取一个字符串在另一个字符串中出现的次数
@Test /** * 获取一个字符串在另一个字符串中出现的次数 */ public void test3(){ String str="uibufangqijuiayubufw"; String substr="buf"; int count=0; int index=0; while(str.indexOf(substr,index)>=0){ count++; index=str.indexOf(substr,index)+1; } System.out.println(count); }
运行结果:2
4. 对字符串字符进行自然排序
@Test /** * 对字符串中字符进行自然顺序排序 */ public void test5(){ String s="908762"; char[] chars=s.toCharArray(); for(int i=0;i<chars.length;i++){ for(int j=0;j<chars.length-i-1;j++){ if(chars[j+1]<chars[j]){ char temp=chars[j+1]; chars[j+1]=chars[j]; chars[j]=temp; } } } String s1=new String(chars); System.out.println(s1); }
运行结果:026789
5. 获取两个字符串中最大相同子串。比如:
str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"
@Test /** * 获取两个字符串中最大相同子串。比如: * str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm" */ public void test6(){ String str1="abcwerthellobyuiodef"; String str2="cvhellobnm"; String str; String max=str1.length()>=str2.length()?str1:str2; String min=str1.length()<str2.length()?str1:str2; for (int i = 0; i <min.length(); i++) { for(int x=0,y=min.length()-i;y<min.length();y++,x++){ str=str2.substring(x,y); if(max.indexOf(str)>0){ System.out.println(str); return; } } } }
运行结果:hellob
二、StringBuffer类
StringBuffer类与String类用法相似,但是StringBuffer类具有可变性,并且在实例化对象时必须使用构造函数:
StringBuffer():初始容量为16的字符串缓冲区
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容
在StringBuffer类中有扩充了几个方法:
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
三、StringBuilder类
StringBuilder类与StringBuffer相似,均是可变的字符序列,其提供的方法几乎也是一样的
四、总结
String:不可变的字符序列
StringBuffer:可变字符序列,效率低,线程安全
StringBuilder:可变字符序列,效率高,线程不安全
注意:作为参数传递时,方法内部String类不会改变其值,StringBuffer和StringBuilder会改变!