如何理解String的不可变性

目录

一、缓存角度

二、安全性

2.1 信息安全

2.2 线程安全

三、哈希键值对


一、缓存角度

在Java中对于字符串的处理,是利用字符串池去存储Java中的字符串,在字符串池中,俩个内容相同的字符串变量,可以从池中指向同一个对象,这样就节省了空间资源。

public class Main {
    public static void main(String[] args) {

        String str1 ="abcd";
        String str2 =str1;
        System.out.println(str1);
        System.out.println(str2);

    }
}

在上述代码中,我们能看到的是str1是赋值给了str2,实际上都指向的是池中的同一个对象。

我们在下述debug中能看到,byte数组存的都是一样的ASCLLl码值。

如果str1的内容被修改了,那么必然导致str2的内容也会变动,所以在String类中,所有关于修改字符串的方法其实本质上是new的新对象。

具体可以看这篇可变性的讲解:https://blog.csdn.net/rnnf_yyds/article/details/140599511?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/rnnf_yyds/article/details/140599511?spm=1001.2014.3001.5501所以,字符串存在于池中我就去取,不在就另开,这样大大节省空间。

二、安全性

2.1 信息安全

在后端实体类中通常有很多成员变量是String类型,这个时候,如果我们的String是可变的,那么比如像:密码,姓名,地址这样的信息就会被修改,那么这样的信息也就没有安全可言。

2.2 线程安全

当多个线程访问,能够确保字符串是安全的,线程安全就是要保证多个共享变量不被修改。当某个线程更改了值,那么会在字符串池中创建一个新的字符串,而不是修改相同的值,所以在并发环境下,字符串是线程安全的。

三、哈希键值对

当String被用作HashMap或HashSet等集合的键时,由于其不可变特性,一旦放入集合中,其哈希值就不会改变,保证了集合操作的正确性和高效性。(hashCode方法在String类中被重写,在第一次调用期间计算和缓存散列,并返回相同的值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值