java中的字符串POOL

Java具有字符串池,因为字符串类的对象是不可变的。

但我的问题是 –

制作String POOL需要什么?

为什么字符串类没有像其他类一样保存自己的值?

内部JVM是否需要一些字符串,或者这是性能优势。 如果有,怎么样?

可以使用池,因为字符串是不可变的。 但是String的不变性还没有仅仅因为这个池而决定。 不变性还有许多其他好处。 顺便说一下, Double也是不可变的,没有双打池。

对字符串池的需求是减少保存程序使用的所有字符串文字(以及实习的字符串)所需的内存,因为这些文字在程序的许多地方很有可能被多次使用。 您只需要对相同的String进行数千次引用,而不是拥有相同String字符串的数千个副本,这样可以减少内存使用量。

请注意,String类与其他类没有区别:它拥有自己的char数组。 但是,当调用substring时,它也可以与其他String实例共享它。

请参阅以下链接:

关于Java的字符串池的问题

关于Java String Pool的一些查询

关于Java字符串常量池

而且,你会得到你的答案。

在一句话中,答案是to use JVM memory cleaverly

当我们编译器看到必须创建一个新的字符串文字时,它首先检查池是否有相同的字符串,如果发现没有创建新的字符串文字,则引用现有的字符串。

使字符串成为不可变的好处是安全function。 参见下文

为什么String在Java中变得不可变?

虽然,性能也是一个原因(假设您已经知道维护内部字符串池,以确保多次使用相同的String对象而不必多次创建/重新声明它),但主要原因为什么String在Java中是不可变的是’安全’。 惊讶吗? 让我们明白为什么。

假设您需要打开一个安全文件,要求用户进行身份validation。 假设有两个用户名为“user1”和“user2”,他们分别拥有自己的密码文件“password1”和“password2”。 显然’user2’不应该访问’password1’文件。

我们知道Java中的文件名是使用字符串指定的。 即使您创建了一个“文件”对象,也只能将该文件的名称作为字符串传递,并将该字符串作为其成员之一保存在File对象中。

如果String是可变的,’user1’可能已经使用他的凭据登录,然后在JVM实际放置本机OS系统之前,以某种方式可以设法将其密码文件名(String对象)的名称从’password1’更改为’password2’打电话打开文件。 这将允许’user1’打开user2的密码文件。 可以理解,这会导致Java中存在严重的安全漏洞。 我知道有很多’可以在这里,但你肯定会同意它会打开一扇门,允许开发人员有意或无意地搞乱许多资源的安全性。

由于Strings是不可变的,JVM可以确保相应File对象的文件名实例成员将继续指向相同的未更改的“filename”String对象。 无论如何,作为File类中的’final’的’filename’实例成员可以不被修改为指向指定除预期文件之外的任何其他文件的任何其他String对象(即,用于创建File对象的文件)。