一、String类
需要注意的是:
1)字符串的底层实现都是字符数组,缺陷就是长度固定。在字符串常量定义后,它的内容不可改变。
2) 所有使用“”定义的内容,本质上都是String类的匿名对象,保存在堆上。
1、两种对象实例化方式:
直接赋值 :String str = "hello world";
构造法:String str = new String("hello world") ;
问题:String类中两种对象实例化的区别?
1)直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2)构造方法:开辟两块堆内存空间,其中一块成为垃圾空间,字符串对象不会自动保存到对象池中,可以使用
intern()方法手动入池。
请看代码示例:
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("hello world");
System.out.println(str1 == str2); //false
String str3 = new String("hello world").intern();
System.out.println(str1 == str3); //true
//其中 == 号比较的是二者的地址
}
现象分析:字符串对象str1存放在字符串对象池,而str2在堆上并没有入池,所以两者不相等;字符串对象str3通过intern()方法手动入池,此时发现“hello world”对象已存在,因此不再重复放入,而是直接引用。
2、字符串比较(重要):
1)equals() 返回值true/false
2)equalsIgnoreCase() 返回值true/false
3)compareTo() 返回值:相等返回0,小于返回值小于0,大于返回值大于0
问题:String类中使用 "== "与 equals() 的区别?
1)"==":进行数值比较,比较的是两个字符串对象的内存地址数值,而不是字符串的内容。
2)equals():字符串内容的比较。
3、字符数组和字符串的相互转化(重要):
1)public String(char value[]) 构造方法,将字符数组中的所有内容转化为字符串
2)public String(char value[],int offset,int count) 构造方法,将字符数组中的部分内容转化为字符串
3)public char charAt(int index) 取得指定索引位置的字符
4)public char[] toCharArray() 将字符串转化为字符数组返回
public static void main(String[] args) {
String str = "hello world";
//字符串转化为字符数组
char[] charArray = str.toCharArray();
for (char i:charArray) {
System.out.println(i);
}
//字符数组转字符串
System.out.println(new String(charArray));
System.out.println(new String(charArray,0,5));
}
4、字符串拆分(重要):
将一个完整的字符串,按照指定的分隔符划分为若干个子字符串。
public static void main(String[] args) {
String str1 = "Jack:25|Marry:20";
String[] strArr = str1.split("\\|");
for (int i = 0; i < strArr.length; i++) {
String[] temp = strArr[i].split(":");
System.out.println(temp[0]+" = "+temp[1]);
}
}
//结果:
// Jack = 25
// Marry = 20
5、字符串相关操作方法(方法比较多只罗列部分常用的):
1)字节与字符串:public string(byte bytes[]) 构造方法,字节数组变为字符串
2)字符串查找:contains()、indexOf()
3)字符串截取:substring()
4)去掉字符串前后空格:trim()
5)字符串大小写转换:toUpperCase()、toLowerCase()
6)字符串连接:concat()
7)字符串长度:Length()
8)字符串是否为空串:isEmpty() 注意判断的不是null,而是长度为0
二、StringBuffer类
由于String类字符串不可更改特性,因此提供了方便字符串修改的StringBuffer类。
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
1) String变为StringBuffer:利用StringBuffer的构造方法或append()方法
2) StringBuffer变为String:调用toString()方法。
1、连接:append()
2、反转:reverse()
public class Demo {
public static void main(String[] args) {
//连接
StringBuffer str = new StringBuffer();
str.append("hello").append("world");
System.out.println(str);
//反转
System.out.println(str.reverse());
}
}
//结果:
// helloworld
// dlrowolleh
3、删除指定范围的数据:delete(int start, int end)
4、插入数据:insert(int offset, 各种数据类型 b)
问题:String 、StringBuffer 、StringBuilder的区别和联系
1)StringBuffer 有线程安全关键字 synchronized,在多线程情况下使用,而 StringBuilder 和 String 都没有,在单线程情况下使用。
2)在拼接上:String每次都会产生新的空间,而 StringBuffer 和 StringBuilder 调用 append() 方法,不会产生新的空间
3)对于 String 的拼接,底层被优化为 StringBuilder.append()拼接,结果将会调用 StringBuilder 的 toString()输出。