1. Pengantar String, Analisis Kode Sumber Metode Umum
2. Analisis Konstanta String Konstanta
Metode umum
sama
memangkas
mengganti
concat
membelah
Startswith dan endswith
Substring
Touppercase () dan tolowercase ()
compareto
Pengantar String
Kelas string dimodifikasi berdasarkan final, yang berarti bahwa objek string adalah program yang tidak dapat diubah, dan bersamaan lebih suka diubah. Kelas string mengimplementasikan antarmuka yang dapat diserializable, sebanding, dan berbarukan.
Mulailah dengan sepotong kode:
public void stringTest () {string a = "a"+"b" +1; String b = "ab1"; System.out.println (a == b);}Tebak apa hasilnya? Jika kesimpulan Anda benar. Oke, mari kita punya kode lain:
public void stringTest () {string a = string baru ("ab1"); String b = "ab1"; System.out.println (a == b);}Apa hasilnya? Jawaban yang benar salah.
Mari kita lihat bagaimana kode yang disusun oleh kompiler
// kode pertama void stringTest () {string a = "ab1"; String b = "ab1"; System.out.println (a == b);} // kode kedua void stringTest () {string a1 = string baru ("ab1"); String b = "ab1"; System.out.println (a1 == b);}Dengan kata lain, bagian pertama dari kode telah dioptimalkan selama periode kompilasi karena kompiler menemukan bahwa efek dari "A"+"B" +1 dan "AB1" adalah sama, dan keduanya terdiri dari Immutables. Tapi mengapa ingatan mereka sama? Jika Anda masih tertarik dengan ini, mari kita lihat beberapa kode sumber penting dari kelas string.
Kode Sumber
1. Atribut String
Kelas string berisi array char abadi untuk menyimpan string, dan hash variabel int digunakan untuk menyimpan nilai hash yang dihitung.
/** Nilainya digunakan untuk penyimpanan karakter. */nilai arang akhir pribadi [];/** cache kode hash untuk string*/private int hash; // default ke 0/** Gunakan serialversionuid dari JDK 1.0.2 untuk interoperabilitas*/private static final long serialversionuid = -6849794470754667710l;
2. String Constructor
// Konstruktor tanpa parameter umumnya tidak berguna, karena nilai adalah string publik yang tidak dapat diubah () {this.value = char baru [0];} // parameternya adalah string tipe public string (string asli) {this.value = original.value; this.hash = original.hash;} // Parameternya adalah array char, gunakan kelas array dalam paket java.utils untuk menyalin string publik (nilai char []) {this.value = arrays.copyof (nilai, nilai panjang);} // Mulailah dari posisi offset di format bytes, encode panjang byte (longsnic (longsne dari format copypen dari format copypen dari bytes dari byte, encode longing (longing longsne dari format copyne dari inpingne dari bytes array, encode byteed); bytes [], int offset, int int, string charsetName) melempar UnsportedEncodingException {if (charsetName == null) Lempar nullpointerException baru ("charsetName"); checkbounds (byte, offset, panjang); this.value = stringCoding.decode (charsetName, byte, offset, length);} // panggil string publik (byte byte [], int offset, int length, string charsetname) string publik (} byte, 0, charsetname, 0, charsetname, charset.3. Metode Umum String
1. Sama
boolean sama (objek anobject) public boolean sama (objek anobject) {// Jika referensi adalah objek yang sama, kembalikan true if (this == anObject) {return true; } // Jika data string tipe tidak string, kembalikan false if (anobject instanceof string) {string anotherstring = (string) anObject; int n = value.length; // Jika panjang array char tidak sama, kembalikan false if (n == anotherstring.value.length) {char v1 [] = nilai; char v2 [] = anotherstring.value; int i = 0; // menilai dari karakter tunggal kembali ke depan, jika ada ketidaksetaraan, kembalikan false sementara (n--! = 0) {if (v1 [i]! = V2 [i]) mengembalikan false; i ++; } // Setiap karakter sama, return return true true; }} return false;}String e1 = "baik"; string e2 = "baik setiap hari"; e1.equals (e2); // Kembalikan salah
1 Pertama, tentukan apakah objek yang sama dirujuk ==, yaitu, tentukan apakah alamat memori dari dua referensi adalah sama. Jika sama, itu akan kembali secara langsung.
2 akan menentukan apakah jenisnya sama dan apakah mereka adalah tipe data yang sama
3 Jika jenis yang sama digunakan, panjang array karakter yang dikonversi adalah sama.
4 Bandingkan apakah masing -masing karakter sama dari belakang ke depan
Pesanan penilaian =》 1. Alamat memori 2. Jenis data 3. Panjang array karakter 4. Perbandingan karakter tunggal
2. Compareto
int compareTo (string anotherstring) public int compareTo (string anotherstring) {// panjang string objek sendiri len1 int len1 = value.length; // Panjang string objek yang dibandingkan len2 = anotherstring.value.length; // Nilai minimum panjang dua string lim int lim = math.min (len1, len2); char v1 [] = nilai; char v2 [] = anotherstring.value; int k = 0; // Dari karakter pertama dari nilai ke lim panjang minimum, jika karakter tidak sama, kembali sendiri (karakter di mana objek tidak sama - karakter yang dibandingkan) sedangkan (k <lim) {char c1 = v1 [k]; char c2 = v2 [k]; if (c1! = c2) {return c1 - c2; } k ++; } // Jika bagian depan semuanya sama, return (panjangnya sendiri - panjang objek yang dibandingkan) return len1 - len2;}String co1 = "hello"; string co2 = "hello"; string co3 = "halo kamu"; System.out.println (co1.compareto (CO2)); // 0system.out.println (co1.compareto (co3)); // -4
Metode ini ditulis dengan cerdik, dan Anda dapat menilai ukuran karakter dari 0 terlebih dahulu.
Jika perbandingan antara kedua objek dapat membandingkan karakter masih sama, maka panjang objek yang dibandingkan dikembalikan secara langsung. Jika panjang dua string sama, maka pengembaliannya adalah 0, yang dengan cerdik menilai tiga situasi.
3.HashCode
int hashCode () public int hashCode () {int h = hash; // Jika hash belum dihitung dan string tidak kosong, maka perhitungan kode hash dilakukan jika (h == 0 && value.length> 0) {char val [] = nilai; // Proses Komputasi // S [0]*31^(n-1) + S [1]*31^(n-2) + ... + S [n-1] untuk (int i = 0; i <value.length; i ++) {h = 31*h + val [i]; } // hash penugasan hash = h; } return h;}String a = "toyou"; char val [] = a.tochararray (); char c1 = 't'; char c2 = 'a'; int f = c1; int e = C2; System.out.println (e); // 97 asystem.out.println (f); // 116 tsystem.out.println (31*val [0]); // 3596system.out.println (31*C1); // 3596 // perhitungan kode hashcode karena karakter char dapat secara otomatis dikonversi menjadi pembentukan int yang sesuai
Kelas string menimpa metode kode hash, dan metode kode hashcode dalam objek adalah panggilan asli.
Hash dari kelas string dihitung menggunakan polinomial. Kita dapat sepenuhnya mendapatkan hash yang sama melalui string yang berbeda. Oleh karena itu, kode hash dari dua objek string adalah sama, yang tidak berarti bahwa kedua stringnya sama.
Kode hash dari objek string yang sama harus sama, tetapi kode hash adalah sama, tidak harus objek yang sama
4.Startswith
boolean startswith (awalan string, int toffset) public boolean startswith (awalan string, int toffset) {char ta [] = nilai; int ke = toffset; char pa [] = prefix.value; int po = 0; int pc = prefix.value.length; // Catatan: Toffset mungkin dekat -1 >>> 1. // Jika alamat awal kurang dari 0 atau (alamat awal + panjang objek yang dibandingkan) lebih besar dari panjang objek sendiri, return false if ((toffset <0) || (toffset> value.length - pc)) {return false; } // Bandingkan dari ujung objek yang dibandingkan sementara (--pc> = 0) {if (ta [ke ++]! = Pa [po ++]) {return false; }} return true;} public boolean startswith (prefix string) {return startswith (prefix, 0);} public boolean endswith (string suffix) {return startswith (sufiks, value.length - sufix.value.length);} String d = "www.58fxp.com"; System.out.println (D.Startswith ("www")); // true system.out.println (d.endswith ("com")); // BENARPerbandingan awal dan akhir adalah metode umum. Misalnya, ketika menilai apakah suatu string berasal dari protokol HTTP, atau awalnya menilai apakah file adalah file MP3, Anda dapat menggunakan metode ini untuk membandingkan.
5.Concat
String concat (string str) Public String concat (string str) {int OtherLen = str.length (); // Jika string yang ditambahkan kosong, kembalikan objek itu sendiri jika (OtherLen == 0) {kembalikan ini; } int len = value.length; char buf [] = arrays.copyof (nilai, len + lainnya); str.getchars (buf, len); mengembalikan string baru (buf, true);} String cat = "banyak"; String newcat = cat.concat ("ya"); // banyak yaMetode CONCAT juga merupakan salah satu metode yang umum digunakan. Pertama -tama menentukan apakah string yang ditambahkan kosong untuk memutuskan apakah akan membuat objek baru.
1 Jika panjang karakter yang disambung adalah 0, kembali langsung ke objek karakter asli
2 Karakter yang disambung tidak kosong dan mengembalikan objek karakter baru
Tentukan panjang karakter untuk menghasilkan objek baru
6. Ubah
String REPLACE (char oldChar, char newChar) ganti string publik (char oldChar, char newChar) {// Bandingkan nilai lama dan baru terlebih dahulu jika (oldChar! = NewChar) {int len = value.length; int i = -1; char [] val = nilai; / * hindari getfield opcode */ // Temukan posisi di mana nilai lama pertama kali muncul sementara (++ i <len) {if (val [i] == oldchar) {break; }} // Dari posisi itu, sampai akhir, ganti nilai lama yang muncul dengan nilai baru jika (i <len) {char buf [] = char baru [len]; untuk (int j = 0; j <i; j ++) {buf [j] = val [j]; } while (i <len) {char c = val [i]; buf [i] = (c == oldchar)? NewChar: C; i ++; } mengembalikan string baru (buf, true); }} kembalikan ini;} String r1 = "bagaimana kabarmu"; String r2 = r1.replace ("do", "is"); system.out.println (r2); // Bagaimana kabarmuMetode ini juga memiliki beberapa kepintaran, seperti mencari tahu di mana nilai lama muncul di awal, yang menghemat beberapa waktu perbandingan.
Metode ganti (string oldstr, string newstr) dinilai dengan ekspresi reguler.
7.trim
String trim () public string trim () {int len = value.length; int st = 0; char [] val = nilai; / * hindari getfield opcode */ // Temukan posisi tanpa spasi di depan string while ((st <len) && (val [st] <= '')) {st ++; } // Temukan posisi tanpa spasi di akhir string while ((st <len) && (val [len-1] <= '')) {len--; } // Jika tidak ada spasi di depan dan sesudahnya, kembalikan string itu sendiri ((st> 0) || (len <value.length))? substring (st, len): this;} String t1 = "public void"; // satu ruang di depan dan sesudah System.out.println ("T1:"+T1.Length ()); // 13 dengan string panjang ruang T2 = t1.trim (); System.out.println ("T2:"+t2.length ()); // 11 Lepaskan spasi System.out.println (T2);8.Intern
String Intern () Public Native String Intern ();
String dd = string baru ("bb"). Magang ();Metode NERTER adalah panggilan asli, dan fungsinya adalah untuk menemukan objek dengan nilai yang sama melalui metode Equals di kumpulan konstan di area metode.
Jika tidak ditemukan, buka ruang di kolam konstan untuk menyimpan string dan mengembalikan referensi ke string yang sesuai. Jika tidak, langsung kembalikan referensi ke objek string sudah ada di kumpulan konstan.
Anda juga dapat memaksa objek karakter yang dibuat untuk metode baru untuk melihat apakah kumpulan konstan sudah ada.
Masukkan kode kedua dalam pendahuluan
// string a = string baru ("ab1"); // ubah ke string a = string baru ("ab1"). Magang ();Hasilnya benar, karena alamat yang ditunjuk oleh A berasal dari kumpulan konstan, dan konstanta string yang ditunjuk oleh B akan memanggil metode ini secara default, sehingga A dan B keduanya menunjuk ke ruang alamat yang sama.
int hash32 () private transient int hash32 = 0; int hash32 () {int h = hash32; if (0 == h) {// balapan data yang tidak berbahaya di hash32 di sini. h = sun.misc.hashing.murmur3_32 (hashing_seed, value, 0, value.length); // Pastikan hasilnya bukan nol untuk menghindari penghitungan ulang h = (0! = H)? h: 1; hash32 = h; } return h;}Dalam JDK1.7, ketika kelas string digunakan sebagai kunci, kelas pengumpulan terkait hash tidak lagi menggunakan metode kode hash untuk diskrit data, tetapi menggunakan metode HASH32.
Metode ini menggunakan waktu sistem saat ini, alamat kelas string, alamat kelas sistem, dll. Sebagai faktor untuk menghitung benih hash. Melalui benih hash, nilai int 32-bit diperoleh melalui benih hash.
public int length() { return value.length;}public String toString() { return this;}public boolean isEmpty() { return value.length == 0;}public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } nilai pengembalian [indeks];}Di atas adalah beberapa metode umum sederhana.
Meringkaskan
Objek string adalah tipe yang tidak dapat diubah. Metode string dengan pengembalian tipe pengembalian setiap kali objek string baru dikembalikan, kecuali untuk kondisi spesifik tertentu dari beberapa metode untuk mengembalikan dirinya sendiri.
Tiga cara untuk membandingkan objek string:
== Perbandingan Memori: Langsung membandingkan nilai memori yang ditunjukkan oleh dua referensi, yang akurat, ringkas, dan langsung.
sama dengan perbandingan nilai string: Bandingkan apakah nilai literal dari dua objek yang direferensikan sama.
Perbandingan numerikalisasi string hashcode: numerikalisasi string. Dua kode hash yang dirujuk adalah sama, dan ingatan tidak dijamin sama, dan nilai -nilai literalnya tidak dijamin sama.
Ide Desain Kolam Konstan String
1. Niat asli dari desain kolam konstanta string
Setiap string adalah objek string, dan string akan sering digunakan dalam pengembangan sistem. Jika dibuat dan dihancurkan seperti benda -benda lain, itu akan sangat mempengaruhi kinerja program.
Untuk meningkatkan kinerja dan mengurangi overhead memori, JVM mengoptimalkan saat instantiating string.
Kolam konstanta string dibuka untuk string, mirip dengan area cache
Saat membuat konstanta string, pertama -tama tentukan apakah kumpulan string konstan ada.
String mengembalikan instance yang direferensikan, tidak ada, instantiate string, dan letakkan di kolam.
Sadari dasar -dasarnya
Dasar untuk mengimplementasikan optimasi ini adalah bahwa setiap konstanta string adalah konstanta yang dimodifikasi akhir, sehingga tidak perlu khawatir tentang konflik data di kumpulan konstan.
Ada tabel di kumpulan konstan string global yang dibuat oleh instance runtime, yang selalu mempertahankan referensi untuk setiap objek string unik di kumpulan, yang berarti bahwa mereka selalu merujuk pada objek di kumpulan string konstan, sehingga string ini di kumpulan konstan tidak akan dikumpulkan oleh pengumpul sampah.
Tumpukan, tumpukan, area metode
Memahami Kolam Konstan String, Pertama Lihat Area Metode Tumpukan
tumpukan
Apa yang disimpan adalah objek, masing -masing objek berisi kelas yang sesuai
JVM hanya memiliki satu area tumpukan dan dibagikan oleh semua utas. Tidak ada tipe dasar dan referensi objek dalam tumpukan, tetapi hanya objek itu sendiri
Objek dikumpulkan oleh pengumpul sampah, sehingga ukuran dan siklus hidup tidak perlu ditentukan
Tumpukan
Setiap utas berisi area tumpukan, yang hanya menyimpan objek tipe data dasar dan referensi objek khusus.
Data (tipe primitif dan referensi objek) di setiap tumpukan bersifat pribadi
Tumpukan dibagi menjadi tiga bagian: area variabel tipe dasar, konteks lingkungan eksekusi, dan area instruksi operasi (menyimpan instruksi operasi)
Ukuran data dan siklus hidup sudah pasti, dan ketika tidak ada referensi yang menunjuk ke data ini, data akan hilang.
Area metode
Zona statis, seperti tumpukan, dibagikan oleh semua utas
Area metode berisi elemen yang selalu unik di seluruh program, seperti variabel kelas dan statis;
Pool String Konstan
Kolam konstan string ada di area metode
Kode: Metode Stack Area Menyimpan String
String str1 = "abc"; string str2 = "abc"; string str3 = "abc"; string str4 = string baru ("abc"); string str5 = string baru ("abc");Pertanyaan wawancara
String str4 = string baru ("ABC") Berapa banyak objek yang dibuat?
Split: str4 =, string baru (), "ABC"
Anda dapat membuat objek baru melalui metode baru. Metode baru ini menciptakan objek instantiated dan tidak akan pergi ke kumpulan konstan untuk menemukan apakah sudah ada. Selama baru, objek baru akan dipakai.
"ABC" setiap string adalah objek string. Jika tidak ada di kolam konstan, objek baru akan dibuat dan dimasukkan ke dalam kolam konstan. Jika tidak, referensi objek akan dikembalikan.
Tetapkan Alamat Objek ke STR4 dan Buat Referensi
Jadi, jika tidak ada "ABC" secara literal di kumpulan konstan, buat dua objek, jika tidak buat satu objek, dan buat referensi
String str1 = string baru ("a"+"b"); Berapa banyak objek yang akan dibuat? String str2 = string baru ("ABC") + "ABC"; Berapa banyak objek yang akan dibuat?
Analisis komprehensif di atas dari kode sumber string Java dan string constant pool adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.