------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、 定义
1、三者的特征
String字符串常量,字符串对象一旦被初始化就不会被改变。
StringBuffer字符串变量(线程安全)底层是char[], 数组初始化的时候就定下了大小, 如果不断的append 肯定有超过数组大小的时候,我们是不是定义一个超大容量的数组,太浪费空间了。就像ArrayList 的实现,采用动态扩展,每次 append 首先检查容量,容量不够就先扩展,然后复制原数组的内容到扩展以后的数组中。
StringBuilder字符串变量(非线程安全),除了线程不同步以外,其他功能与StringBuffer一致。
2、API说明
查看 API 会发现,String、StringBuffer、StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关,但是其处理机制不同。
String:是不可改变的量,也就是创建后就不能在修改了。
StringBuffer:是一个可变字符串序列,它与 String 一样,在内存中保存的都是一个有序的字符串序列(char 类型的数组),不同点是 StringBuffer 对象的值都是可变的。
StringBuilder:与 StringBuffer 类基本相同,都是可变字符换字符串序列,不同点是 StringBuffer 是线程安全的,StringBuilder 是线程不安全的。
注意:开发中一般使用StringBuilder,因为StringBuilder执行效率高,需要线程安全可以自行加锁。
升级三因素:
1、提高效率
2、简化书写
3、提高安全性。
二、 使用场景
1、使用 String 类的场景:在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算。
2、使用 StringBuffer 类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用 StringBuffer。
3、使用 StringBuilder 类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用 StringBuilder。
三、 常用方法
1、获取
int length(); 获取字符串中字符的个数(长度);
char charAt(int index); 根据位置获取字符;
int indexOf(int ch); 根据字符获取在字符串中的位置;
从指定位置开始查找ch第一次出现的位置:
int indexOf(int ch,int fromIndex);
int indexOf(String str);
int indexOf(String str,int fromIndex);
根据字符串获取在字符串中第一次出现的位置。
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
获取字符串中的一部分字符串,也叫子串。
String substring(int beginIndex,int endIndex);
String substring(int beginIndex);
示例:
public classStringMethodDemo{
public static void main(String[] args){
StringMethodDemo();
}
public static void StringMethodDemo(){
String s = "abcdae";
int a = s.length();//获取字符串长度
char b =s.char charAt(2);//获取2角标字符
int c = s.int indexOf(‘c’); //获取’c’在字符串中的位置
System.out.println( "substring:" +s.substring(2));//从2角标位置开始获取字符串部分
System.out.println( "substring:" +s.substring(2,4));//获取角标2-4间的子字符串,包含头不包含尾
}
}
2、 转换\修改
将字符串变成字符串数组(字符串的切割)
String[] split(String regex);涉及到正则表达式。
将字符串变成字符数组
char[] toCharArray();
将字符串变成字节数组
char[] getBytes();
将字符串中的字母转成大小写
String toUpperCase();大写
StringtoLowerCase();小写
将字符串中的内容进行替换
String replace(char oldCh,char newCh);
String replace(String s1,String s2);
示例:
public classStringMethodDemo{
public static void main(String[] args){
StringMethodDemo();
}
public static void StringMethodDemo(){
String s1 = "java";
String s2 = s1.replace( 'a','o' );//将S1中’a’字符替换为’o’
String s3 = s1.replace( 'q','o' );// 将S1中’q’字符替换为’o’,s1中没有q字符,未替换
System.out.println(s2);
System.out.println(s3);
System.out.println(s1 == s3);//S1与S3引用的是同一个对象,结果为turn
}
}
在StringBuffer中添加元素
StringBuffer append(data);
StringBuffer insert(index,data);
在StringBuffer中删除元素
StringBuffer delete(int start,int end);包含头,不包含尾。
StringBufferdeleteCharAt(int index):删除指定位置的元素。
3、 判断
两个字符串内容是否相同呢?
boolean equals(Object obj);
boolean equalsIgnoreCase(String str);忽略大小写比较字符串内容。
字符串中是否包含指定字符串
boolean contains(String str);
字符串是否以指定字符串开头,是否以指定字符串结尾
boolean startsWith(String str);
boolean endsWith(String str);
int compareTo(String str); 如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。
练习:
子串”nba”在整串中出现的次数 "nbaernbatynbauinbaopnba"
思路:
i. 找的子串是否存在,如果存在获取其出现的位置,这个可以使用indexOf完成。
ii. 如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置+子串的长度。
iii. 以此类推,通过循环完成查找,如果找不到就是-1,并且每次找到用计数器记录。
代码:
public classStringTest{
public static void main(String[] args){
String str ="nbaernbatynbauinbaopnba";
String key = "nba";
int count = getKeyStringCount(str,key);
System.out.println( "count = " +count);
}
public static int getKeyStringCount(String str,String key){
//1、定义计数器
int count = 0;
//2、定义变量记录key出现的位置
int index = 0;
while((index = str.indexOf(key)) != -1) //如果包含,则继续
{
//从找到的子串位置后一位开始获取
str = str.substring(index + key.length());
count++;
}
return count;
}
}