Java言語では、Stringは不変のクラスであり、定数文字列プールに格納されるため、文字列の共有が実現され、メモリコストが削減されます。
このため、あるString
タイプの文字列が作成されると、この文字列は、ガベージコレクタによってリサイクルされるまで定数プールに存在します。
したがって、この文字列(パスワードなど)が使用されなくなった場合でも、一定期間メモリに存在します(ガベージコレクターのみがこのコンテンツを再利用し、プログラマーが直接リサイクルする方法はありません)。文字列)。現時点ではmemory dump
、アクセス許可(メモリダンプ)を持つプログラムがこの文字列にアクセスし、機密データを公開する可能性があります。これは非常に大きなセキュリティリスクです。
文字配列が使用されている場合、プログラムがこのデータを使用しなくなると、プログラマは文字配列の内容を空に設定できます。この時点では、このデータはメモリに存在しません。上記の分析から、String
文字配列を使用する場合と比較して、プログラマーはデータのライフサイクルをより適切に制御できるため、セキュリティが強化されることがわかります。
古いことわざにあるように、なぜString
不変のクラスとString
オブジェクトを再割り当てできるのですか?
実際、再割り当ての過程で、元のオブジェクトの内容は変更されませんが、新しいオブジェクトが再作成され、ポインターは新しいアドレスを指します。
最初はそのようなString s = "hello"
実行s += " world"
、このs
時点でhello world
の文字列のポイント、hello
そしてhello world
同時にメモリに存在します。