String表示字符串类型,属于引用数据类型
不可变的好处
1.便于实现字符串池(String Pool)
不同的字符串引用都可以指向池中的同一个字符串。这种设计可以大大减少内存消耗,提高程序的运行效率。
2.避免安全问题
在数据库连接或网络通信中,用户名、密码等敏感信息以字符串形式传输,如果字符串可变,可能会有人利用这一特性改变字符串的值,从而造成安全漏洞。
3.使多线程安全
多个线程可以同时共享同一个字符串实例,而不需要进行同步操作,这简化了多线程环境下的编程,避免了因线程安全问题而导致的并发问题。
4.加快字符串处理速度
因为字符串是不可变的,所以在创建时其哈希值被缓存,不需要重新计算。这使字符串非常适合作为Map集合的键,从而加快了字符串的处理速度。
String StringBuffer StringBuilder的区别
1.可变性
- String是不可变的,一旦创建就不能修改其内容。再次对一个String类型赋值时,并不是对原来堆中的实例对象进行重新赋值,而是生成一个新的实例对象。
- StringBuffer和StringBuilder都是可变的,可以修改其内容。
2.线程安全性
- StringBuffer的公开方法都被synchronized修饰,确保了线程安全,适合多线程环境下的操作。
- StringBuilder没有方法进行synchronized修饰,因此认为线程是不安全的,适合单线程环境下的操作。
3.使用场景
- String用于表示不可变的字符串常量。
- StringBuffer用于多线程环境中操作字符串的情况。
- StringBuilder用于单线程环境下进行大量操作字符串的情况。
String Pool
String Pool 为字符串常量池,存在于堆空间中,是堆空间中专门开辟出的一块空间用于存放字符串常量池
String Pool是一个固定大小的HashTable结构,由链表+数组形式组成
好处:
- 节省内存:相同内容的字符串只会被存储一次
- 提高性能:字符串的比较和查找可以通过引用比较进行,不是通过逐个字符进行比较