Anda mungkin mendengar soalan sedemikian dalam temu bual untuk jawatan Java Junior. Tetapi kawan saya ditanya perkara ini semasa temuduga untuk jawatan Ketua Teknikal.
Kedua-duanya
String
dan tatasusunan aksara boleh digunakan untuk menyimpan data teks. Tetapi secara sedar memilih satu atau yang lain untuk tugas tertentu adalah sukar jika anda belum menghadapi situasi yang sama. Walau bagaimanapun, seperti yang dinyatakan oleh rakan saya, sebarang soalan yang berkaitan dengan
String
, biasanya melibatkan sifat istimewa rentetan yang dipanggil kebolehubah (
Immutable
), dan dia mengambil kesempatan daripada ini dalam temu bual. Jadi, mari kita lihat beberapa sebab mengapa anda perlu menggunakan
char []
, dan bukan , untuk menyimpan kata laluan anda
String
.
Sebab 1. Rentetan tidak boleh diubah
Memandangkan rentetan tidak boleh diubah dalam Java, kata laluan teks biasa anda akan tersedia dalam ingatan sehingga pengumpul sampah mengosongkannya. Dan kerana
String
ia digunakan
String pool
untuk penggunaan berulang, terdapat kebarangkalian yang agak tinggi bahawa kata laluan akan kekal dalam ingatan untuk masa yang lama, yang tidak selamat sama sekali.
Java String pool ialah kolam atau set objek (string) yang terletak di tempat khas - heap. String dalam Java adalah salah satu jenis data yang paling biasa. Ini bukan jenis primitif, tetapi objek, kerana ia sangat intensif sumber. Jadi, untuk menyimpan rentetan empat aksara, anda perlu memperuntukkan 56 bait memori. Inilah sebabnya mengapa rentetan, seperti objek lain, disimpan pada timbunan. |
Sesiapa sahaja yang mempunyai akses kepada longgokan memori boleh mencari kata laluan dalam teks biasa, yang merupakan sebab yang baik untuk menggunakan kata laluan yang disulitkan dan bukannya teks biasa. Kerana rentetan tidak boleh diubah, kandungannya tidak boleh diubah. Sebarang perubahan akan mencipta baris baharu. Tetapi dalam kes
char []
, anda boleh menggantikan mana-mana elemennya dengan sifar atau aksara kosong. Oleh itu, menyimpan kata laluan dalam susunan aksara jelas mengurangkan risiko pemintasan kata laluan.
Sebab 2. Cadangan penulis
Java sendiri (baik, melalui penciptanya, sudah tentu) mengesyorkan menggunakan kaedah
getPassword ()
daripada kelas
JPasswordField
yang mengembalikan
char []
. Anda juga boleh mencuba kaedah yang tidak digunakan lagi
getText ()
. Mengapa tidak mengikut cadangan pengarang bahasa?
Sebab 3. Cetak
Dengan jenis
String
sentiasa ada bahaya bahawa teks yang disimpan dalam rentetan akan dicetak dalam fail log atau dalam konsol. Pada masa yang sama, jika anda menggunakan
Array
, anda tidak akan mencetak kandungan tatasusunan, tetapi hanya lokasinya dalam ingatan. Sudah tentu, ini bukan sebab yang serius, tetapi ia juga masuk akal.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
Sudah tentu, menggunakan
char []
Java untuk menyimpan kata laluan itu sendiri bukanlah ubat mujarab. Anda perlu mengambil langkah berjaga-jaga keselamatan, seperti bekerja dengan cincang dan menyulitkan kata laluan daripada menyimpannya dalam teks biasa. Dan, sudah tentu, padamkannya daripada ingatan serta-merta selepas prosedur pengesahan.
Berdasarkan bahan dari Javarevisited
GO TO FULL VERSION