基本介绍:
String是Java中的一个类,用于表示和操作字符串。它是不可变的,一旦创建就不能被修改。
一、String字符串特点
1. 不可变性:String对象一旦被创建就是不可变的,也就是说,一旦一个String对象被赋值,它的值就不能被改变。
2. 创建String对象:有多种方式可以创建String对象,包括使用双引号创建字面量形式的字符串,使用new关键字创建String对象,以及通过字符串连接操作符"+"来创建。
3. 字符串连接:在Java中,可以使用加号"+"来连接字符串,也可以使用`concat()`方法进行字符串连接。
4. 字符串常量池:为了提高内存利用率,Java对字符串常量池进行了优化。当创建一个字符串时,如果常量池中已经存在相同内容的字符串,则返回常量池中的对象引用,从而节省内存。
5. 字符串操作:String类提供了丰富的方法来操作字符串,比如获取字符串长度、提取子串、查找子串位置、大小写转换、字符串比较等等。
6. 不可变性的优点:String的不可变性带来了很多好处,包括安全性、线程安全、缓存哈希值等。由于字符串不可变,所以可以被安全地共享。
7. 字符串的比较:在Java中,字符串的比较需要使用`equals()`方法,而不是使用"=="运算符。这是因为"=="比较的是对象的引用,而`equals()`方法比较的是对象的值。
二、字符串的比较
1、equals()方法【比较字符串对象的内容】
String str1 = "Hello";
String str2 = "Hello";
boolean isEqual = str1.equals(str2); // true
2.‘==’运算符【比较字符串对象的引用】
以代码为例来进行讨论:
package String01;
/**
* @Author: 东方.911
* @Description:
* @Date Created in 2024-01-26 15:41
* @Modified By:
*/
public class StringDemo01 {
public static void main(String[] args) {
String str1="abc";
String str2="123";
System.out.println(str1==str2);//false
String str3=new String("abc");
String str4=new String("abc");
System.out.println(str1==str3);//false
System.out.println(str3==str4);//false
System.out.println("----------");
String str5="abc";
System.out.println(str1==str5);//true
}
}
解释:
1. `String str1="abc";` 和 `String str2="123";`:在Java中,使用双引号声明的字符串常量会被放入字符串常量池中。
2. `System.out.println(str1==str2);`:这里比较的是str1和str2的引用地址是否相同。因为"abc"和"123"是两个不同的字符串常量,所以他们在内存中的引用地址也是不同的,所以输出结果为false。
3. `String str3=new String("abc");` 和 `String str4=new String("abc");`:使用`new`关键字创建的字符串对象会在堆内存中开辟新的空间存放。即使内容相同,它们指向的内存地址也是不同的。
4. `System.out.println(str1==str3);`:这里比较的是str1和str3的引用地址,因为str3是通过`new`关键字创建的,所以它指向的内存地址与str1不同,所以输出结果为false。
5. `System.out.println(str3==str4);`:同理,str3和str4都是通过`new`关键字创建的,所以它们指向的内存地址是不同的,输出结果为false。
6. `String str5="abc";`:由于"abc"已经存在于字符串常量池中,所以str5指向的是常量池中的"abc",与str1指向的是同一块内存地址,所以输出结果为true。
三、String字符串的内存分配机制【涉及到常量池和堆内存】
1.字符串字面量形式创建
当使用双引号创建字符串字面量时,Java会首先检查常量池中是否存在相同内容的字符串。如果存在,则直接返回常量池中的字符串对象的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。例如:
String str1 = "Hello"; // 创建字符串"Hello"
String str2 = "Hello"; // 直接使用常量池中的字符串对象
2.使用new关键字创建
当使用new关键字创建String对象时,会在堆内存中创建一个新的字符串对象,并将其内容初始化为指定的字符串。同时,在常量池中也会创建一个拷贝,以便共享和优化。例如:
String str3 = new String("Hello"); // 在堆内存中创建新的字符串对象
3.字符串的共享和优化
由于字符串的不可变性,Java为了节省内存和提高性能,对字符串进行了共享和优化处理。
(1)对于字符串字面量形式创建的字符串,如果常量池中已存在相同内容的字符串,则直接返回常量池中的字符串对象的引用,实现字符串的共享。
(2)对于使用new关键字创建的字符串,即使内容相同,它们在堆内存中的地址是不同的。但为了优化内存使用,Java会在常量池中创建一个拷贝,以便共享。