关于Java字符串常量池

这是关于Java字符串常量池。 在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。 我听说Java Strings将存储在一个常量池中,它们不会被VM重新启动或加载String Quits的ClassLoader破坏。

如果是这种情况,我的密码将存储在字符串池中。 我非常关心这个问题。 有没有其他方法来摧毁这些文字或我能做的任何其他事情。

请在此建议,

此致,Sunny。

这里有几个不同的问题。 首先,术语“常量池”是指字符串和数字文字的类文件的非常特定的部分,或者是从驻留在JVM中的这部分类文件生成的数据结构。 密码不会存储在此处,除非它们是类文件的一部分。

但是,一些String对象确实通过String internment在整个程序中存储和共享。 任何字符串文字都会自动实现,就像调用intern()方法的任何字符串一样。 据我所知,虽然没有其他字符串以这种方式存储,所以除非你自动实习自己输入密码的字符串,否则我认为你不必担心这一点。

另一个要注意的问题是,如果您不希望密码驻​​留在内存中,您可能需要注意垃圾收集,因为不再引用的String仍可能在内存中。 类似地,如果您使用某些字符串方法(如子字符串)共享字符串之间的支持表示,则可以在使用完毕后保留完整的密码字符串。

如果你担心的是其他Java代码能够看到已被实习但仍然存在于内存中的旧密码,那么你不必担心。 没有办法迭代或查看实习字符串池的元素,或者破解打开字符串以查看其支持数组。

这仅适用于您调用intern()方法的String文字和字符串。 想一想:如果它应用于所有字符串,那么在例如处理具有不同(String)值的请求参数的servlet应用程序中,您将很快耗尽内存。

老兄,使用字符串缓冲区来获取密码并进行(大概)字符串类型的操作。

StringBuffer将字符串存储为char [], 可以将其删除。 或者被覆盖或者你有什么。 Say StringBuffer.delete(0,StringBuffer.length());

或者只是将db密码作为char []并直接使用它 – 但我认为StringBuffer方式(假设您使用String方法创建了所有代码)将是一个更容易的飞跃。