对于一些敏感的数据(例如密码),为什么使用字符数组存储比使用String更安全?

在Java语言中,String是不可变类,它被存储在常量字符串池中,从而实现了字符串的共享,减少了内存的开支。

正因为如此,一旦一个String类型的字符串被创建出来,这个字符串就会存在于常量池中,直到被垃圾回收器回收为止。
因此,即使这个字符串(比如密码)不再被使用,它仍然会在内存中存在一段时间(只有垃圾回收器才会回收这块内容,程序员没有办法直接回收字符串)。此时有权限访问memory dump(存储器转储)的程序都可能会访问到这个字符串,从而把敏感的数据暴露出去,这是一个非常大的安全隐患。
如果使用字符数组,那么一旦程序不再使用这个数据,程序员就可以把字符数组的内容设置为空,此时这个数据在内存中就不存在了。从以上分析可以看出,与使用String相比,使用字符数组,程序员对数据的生命周期有更好的控制,从而可以增强安全性。

老话重提,为什么String是不可变类,String对象还可以被重新赋值?
其实,在重新赋值的过程中,变的不是原来对象的内容,而是重新创建了新的对象,并将指针指向了新的地址。
比如最开始String s = "hello"执行s += " world"后,s 指向了hello world字符串,此时,hellohello world是同时存在于内存中的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿条秋裤到处跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值