一、缓存角度
在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.5501https://blog.csdn.net/rnnf_yyds/article/details/140599511?spm=1001.2014.3001.5501所以,字符串存在于池中我就去取,不在就另开,这样大大节省空间。
二、安全性
2.1 信息安全
在后端实体类中通常有很多成员变量是String类型,这个时候,如果我们的String是可变的,那么比如像:密码,姓名,地址这样的信息就会被修改,那么这样的信息也就没有安全可言。
2.2 线程安全
当多个线程访问,能够确保字符串是安全的,线程安全就是要保证多个共享变量不被修改。当某个线程更改了值,那么会在字符串池中创建一个新的字符串,而不是修改相同的值,所以在并发环境下,字符串是线程安全的。
三、哈希键值对
当String被用作HashMap或HashSet等集合的键时,由于其不可变特性,一旦放入集合中,其哈希值就不会改变,保证了集合操作的正确性和高效性。(hashCode方法在String类中被重写,在第一次调用期间计算和缓存散列,并返回相同的值)