String的创建方式?什么情况下会用到字符串池

String的创建方式?什么情况下会用到字符串池

使用自面值

String str = "Hello Dazui";

使用双引号包含起来的就是字符串字面值,这种方式会自动在字符串池中创建字符串对象。

使用构造方法创建

String str = new String("Hello Dazui");

使用这种方式会自动在堆内存创建一个新的字符串对象

使用字符串连接操作符

String str = "Hello"+"Dazui";

使用字符串连接符会自动在字符串池创建一个新的字符串对象,其内容为Hello Dazui,不会为Hello 和Dazui创建,因为这是编译器优化,这么做的目的是提高性能和减少内存消耗。

字符串池

字符串吃是一个特殊的存储区域,用来存储字符串自面值,主要有以下特点。

​ 当我们使用过字符串字面值创建字符串的时候,JVM首先会检查字符串池是否存在相同内容的字符串,如果存在就返回引用如果不存在就创建一个新的字符串对象添加到池里面。

​ 字符池主要的作用是节省内存,相同内容是字符串在内存中只有一份拷贝,所以不同的字符串变量可以共享同一份内存,而不会占用额外的内存。

​ 字符串池在Java中默认是开启的,然后我们也可以使用intern方法手动将字符串添加到池子中。例如

String str = new String("hello").intern();

​ 字符串池中的字符串对象是不可变的, 一旦创建就不能修改,如果我们对字符串执行修改操作则将创建一个新的字符串对象,这么做的原因是保证安全性、性能、和设计考虑。

​ **安全性:**字符串是我们日常开发比较常用的数据类型之一, 经常用于存储敏感信息。如果字符串是可变的那么就可以在任何地方都可以修改字符串的内容,可能导致潜在的安全漏洞,通过字符串不可变,可以保证他们在创建后不会被意外或者恶意的修改。

性能:因为我们字符串池的不可变性可以保证我们多个字符串可以安全的共享。多个字符串变量可以引用相同的字符串对象。无需担心修改会影响其他引用,提高了内存利用率。不可变性还可以让我们HashCode在创建的时候计算出来并且缓存。从而加快了hash表的操作,例如使用String作为hashmap的key。

设计简单: 不可变性简化了字符串的设计和使用,我们可以放心的床底字符串,而不用担心它在其他地方的被修改。这种的设计方法更容易理解和维护。

你可能感兴趣的:(服务器,运维)