1. String类概述
String类代表字符串。Java中的所有字符串字面值(如”abc")都作为此类的实例实现。
字符串特点:
- 字符串是常量,他们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。
- 因为String对象是不可变的,所以可以共享。
- 字符串效果上相当于是char[]字符数组,当时底层原理是byte[]字节数组。
创建字符串的常见3+1种方法:
三种构造方法:
- public String():创建一个空白字符串,不含有任何内容。
- public String(char[] array):根据字符数组的内容,来创建对应的字符串。
- public String(byte[] array):根据字节数组的内容,来创建对应的字符串。
一种直接创建:
- String str = "Hello"; // 右边直接用双引号
public static void main(String[] args) {
// 使用空参构造
String str1 = new String(); // 小括号留空,说明字符串什么内容都没有。
System.out.println("第1个字符串:" + str1);
// 根据字符数组创建字符串
char[] charArray = { 'A', 'B', 'C' };
String str2 = new String(charArray);
System.out.println("第2个字符串:" + str2);
// 根据字节数组创建字符串
byte[] byteArray = { 97, 98, 99 };
String str3 = new String(byteArray);
System.out.println("第3个字符串:" + str3);
// 直接创建
String str4 = "Hello";
System.out.println("第4个字符串:" + str4);
}
2. 字符串常量池
-
字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能
-
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化
-
为字符串开辟一个字符串常量池,类似于缓存区
-
创建字符串常量时,首先坚持字符串常量池是否存在该字符串
-
存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中
-
-
实现的基础
-
实现该优化的基础是因为字符串是不可变的,可以不用担心数据冲突进行共享
-
运行时实例创建的全局字符串常量池中有一个表,总是为池中每个唯一的字符串对象维护一个引用,这就意味着它们一直引用着字符串常量池中的对象,所以,在常量池中的这些字符串不会被垃圾收集器回收
-
(以上解释来自 https://segmentfault.com/a/1190000009888357)
public static void main(String[] args){
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a','b','c'};
String str3 = new String(charArray);
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // false
}
- 对于引用类型来说, == 进行的是地址值的比较。
- 双引号直接写的字符串在常量池当中,new 产生的字符串不再池当中。
3. String 方法摘要