String字符串

基本介绍:
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会在常量池中创建一个拷贝,以便共享。

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方.911

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值