java中pool_Java中的字符串POOL

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

但我的问题仍然存在-

制作String POOL有什么需要?

为什么字符串类不像其他类那样保留其自己的值?

JVM内部是需要一些字符串还是这是性能优势。 如果是,怎么办?

想想如果您想自己创建一个不可变的类该怎么办。

好吧,我的问题是-java中还有很多其他不可变的类,那么为什么Java设计人员决定创建String Pool。 它是提高性能的一项功能,还是Java Design的需要?

因为字符串是不可变的,所以可能有一个池。但是String的不可变性并不是仅由于此池而决定的。不变性还有许多其他好处。顺便说一句,Double也是不可变的,并且没有双打池。

对String池的需求是减少保存程序使用的所有String文字(和插入的String)所需的内存,因为这些文字在程序的很多地方都有很多次被使用的机会。您不必拥有数千个相同String文字的副本,而只需拥有数千个引用相同的String,这可以减少内存使用。

请注意,String类与其他类没有什么不同:它拥有自己的char数组。但是,当调用子字符串时,它也可能与其他String实例共享它。

Double也是一成不变的,没有Doubles Nice池。.:)谢谢

"程序生成的字符串文字"是什么意思?您是在说JVM在内部生成许多相似的String,即使该应用程序无法使用文本并且没有显式创建许多String对象也是如此?

不,我的意思恰恰相反:如果200个类在其代码中使用字符串文字"",则仅创建一个实例,将其存储在字符串池中,并由所有类共享。

请参考以下链接:

关于Javas字符串池的问题

有关Java字符串池的一些查询

关于Java字符串常量池

并且,您将得到答案。

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

将字符串设置为不可变的好处在于安全性功能。参见下文

为什么在Java中将String设置为不可变的?

但是,性能也是一个原因(假设您已经知道要维护内部String池,以确保多次使用同一String对象而不必多次创建/回收它),但这是主要原因为什么在Java中将String设置为不可变的原因是"安全性"。惊讶吗让我们了解为什么。

假设您需要打开一个安全文件,该文件要求用户进行身份验证。假设有两个用户名为" user1"和" user2",它们分别具有自己的密码文件" password1"和" password2"。显然," user2"不能访问" password1"文件。

众所周知,Java中的文件名是使用字符串指定的。即使创建了"文件"对象,您也只能将文件名作为字符串传递,并且该字符串作为其成员之一保留在文件对象内。

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

由于字符串是不可变的,因此JVM可以确保相应File对象的文件名实例成员将始终指向相同的不变" filename" String对象。无论如何,"文件名"实例成员是File类中的"最终"成员,不能修改为指向任何其他String对象,该String对象指定了除目标文件(即用于创建File对象的文件)之外的任何其他文件。

这并不是真正的安全原因。如果字符串在Java中是可变的,则File类仅需要将带有文件名的字符串复制到新的String对象中。它只是不需要复制的一项性能功能(对于程序员来说,他们不能忘记所需的复制的便利功能)。

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

实际上,编译器与此无关。文字放在类文件中,并在加载类时由池解析。

因此,您的意思是,如果找到匹配项,池中的字符串将不会被引用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值