一:String类
【常用构造方式】
public static void main(String[] args) {
// 使用常量串构造
String s1 = "hello bit";
System.out.println(s1);
// 直接newString对象
String s2 = new String("hello bit");
System.out.println(s1);
// 使用字符数组进行构造
char[] array = {'h','e','l','l','o','b','i','t'};
String s3 = new String(array);
System.out.println(s1);
}
【图解】
【注意】
1)字符串的字符使用unicode编码,一个字符占2个字节
2)String是final类,不能被其它类继承
3)String是引用类型,内部并不存储字符串本身,字符串具体的内容存储在对象中,而字符串引用类型变量存储的是对象的地址。
public static void main(String[] args) {
// s1和s2引用的是不同对象 s1和s3引用的是同一对象
String s1 = new String("hello");
String s2 = new String("world");
String s3 = s1;
}
一道测试题:
public class Test2 {
public static void main(String[] args) {
String s1="hap";
String s2="java";
String s4="java";
String s3=new String("java");
System.out.println(s2==s3);//F s3创建了一个新对象
System.out.println(s2==s4);//T s2和s4都指向常量池中的“Java”
System.out.println(s2.equals(s3));// T 比较的是内容,都为“java"
System.out.println(s1==s2);//F 是常量池中不同的两个
}
【常见方法】
- equals比较内容是否相同,区分大小写
- equalsIgnoreCase忽略大小写判断内容是否相同
- length获取字符串的长度,字符的个数
- indexof获取字符在字符串对象中第一次出现的索引,索引从0开始,找不到则返回-1
- lastindexof获取最后一次出现的索引,找不到则返回-1
- substring截取指定范围的子串
- compareTo比较2个字符串的大小,前大返回正数,后大返回负数,相等返回0
- toCharArray转为字符
- toUpperCase/toLowewrCase
- concat拼接字符
- replace替换字符串中的字符
- split分割字符串(在对字符串进行分割时,如有特殊字符需要加入转义符\\ )
- format格式字符串
- toCharArray转换为字符数组
String s="happy";
char[] chs=s.toCharArray();
for(int i=0;i<chs.length;i++){
System.out.print(chs[i]+" ");
}
二:StringBuffer类
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuffer和StringBuilder类。
【对比】
1)String保存的是字符串常量,里面的值不能修改,每次更新实际更新的是地址,效率低
private final char value[ ];
2)StringBuffer保存的是字符串常量,里面的值可以更改,每次更新的实际是内容,效率高
char[ ] value;
【构造器的使用】
1)创建一个大小为16的char[ ],用于存放字符内容
StringBuffer stringBuffer = new StringBuffer();
2)通过构造器指定char[ ]大小
StringBuffer stringBuffer = new StringBuffer(100);
3)通过给一个String创建StringBuffer,char[ ]的大小就是str.length+16;
StringBuffer hello = new StringBuffer("hello");
【常用方法】
1)增:append
2)删:delect
3)改:repleace
4)查:indexOf (找第一次出现的索引,找不到返回-1)
5)插:insert
6)长度:length
三:StringBuilder类
【对比】
1)String:不可变字符序列,效率低,但复用率高
2)StringBuffer:可变字符序列,效率较高,线程安全
3)StringBuilder:可变字符序列,效率最高,线程不安全
String,StringBuffer,StringBuilder非常类似,均代表可变序列,且方法一样
效率:StringBuider>StringBuffer>String
【使用原则】
1)如果字符串存在大量修改,则一般用StringBuffer或StringBuilder
2)如果存在大量修改且在单线程——StringBuilder
3)如果存在大量修改且在多线程——StringBuffer
4)修改很少并被多个对象引用——String