1. Metode Equals digunakan untuk membandingkan apakah konten objek sama (ditimpa nanti)
2. Metode kode hash hanya digunakan dalam koleksi
3. Ketika metode yang sama ditimpa, apakah objek perbandingannya sama akan dibandingkan melalui metode Equals yang ditimpa (menilai apakah konten objeknya sama).
4. Saat memasukkan objek ke dalam koleksi, pertama -tama tentukan apakah nilai kode hashcy dari objek yang akan ditempatkan sama dengan nilai kode hashcode dari setiap elemen dalam koleksi. Jika tidak sama, masukkan objek ke dalam koleksi secara langsung. Jika nilai kode hash sama, maka gunakan metode Equals untuk menentukan apakah objek yang akan ditempatkan sama dengan objek apa pun dalam koleksi. Jika penilaian yang sama tidak sama, masukkan elemen langsung ke dalam koleksi, jika tidak itu tidak akan ditempatkan.
5. Metode Equals menggunakan apakah alamat memori objek sama untuk menentukan apakah objeknya sama.
Karena mereka adalah dua objek baru, alamat memori objek tidak sama, jadi Stu1.Equals (Stu2) salah.
6. Threads A dan B harus mendapatkan kunci objek O. Dengan asumsi bahwa A memperoleh kunci objek O, B akan menunggu A untuk melepaskan kunci O. Jika disinkronkan digunakan, jika A tidak dilepaskan, B akan menunggu untuk melanjutkan dan tidak dapat terganggu. Jika Reentrantlock digunakan, jika A tidak dilepaskan, B dapat mengganggu penantian setelah menunggu waktu yang cukup lama dan melakukan hal -hal lain.
Reentrantlock memperoleh kunci dalam tiga cara:
a) kunci (), jika kunci diperoleh, segera kembali. Jika utas lain menahan kunci, utas saat ini akan tetap dalam keadaan tidak aktif sampai kunci diperoleh.
b) trylock (), jika kunci diperoleh, itu akan segera mengembalikan true, dan jika utas lain memegang kunci, itu akan segera mengembalikan false;
c) Trylock (waktu lama, unit timeunit), jika kunci diperoleh, itu akan segera mengembalikan true. Jika utas lain menahan kunci, itu akan menunggu waktu parameter yang diberikan.
Selama proses penantian, jika kunci diperoleh, ia kembali benar, dan jika waktu tunggu, ia kembali salah;
D) Lockinterrictly: Jika kunci diperoleh, segera kembali. Jika kunci tidak diperoleh, utas saat ini dalam keadaan tidak aktif sampai atau terkunci.
Atau utas saat ini terganggu oleh utas lain
Sinkronisasi diimplementasikan di level JVM. Kunci yang disinkronkan tidak hanya dapat dipantau melalui beberapa alat pemantauan, tetapi pengecualian juga dapat terjadi selama eksekusi kode.
JVM akan secara otomatis melepaskan kunci, tetapi tidak mungkin untuk menggunakan kunci. Kunci diimplementasikan melalui kode. Untuk memastikan bahwa kunci akan dirilis, buka kunci () harus ditempatkan di akhirnya {}
Ketika kompetisi sumber daya tidak terlalu ganas, kinerja disinkronkan lebih baik daripada reetrantlock. Namun, ketika kompetisi sumber daya sangat sengit, kinerja disinkronkan akan berkurang sebesar puluhan kali, tetapi kinerja reetrantlock dapat tetap normal;
Di JDK, kelas -kelas berikut ini terutama digunakan untuk mengimplementasikan mekanisme refleksi Java, yang semuanya terletak di paket java.lang.reflect:
Kelas: mewakili kelas.
Kelas Lapangan: Variabel anggota yang mewakili kelas (variabel anggota juga disebut atribut kelas).
Kelas Metode: Metode yang mewakili kelas.
Kelas konstruktor: mewakili metode konstruktor kelas.
Kelas Array: Menyediakan metode statis untuk membuat array dan mengakses elemen array secara dinamis.
Berikut adalah beberapa contoh untuk melihat aplikasi sebenarnya dari API refleksi:
1. Dapatkan variabel anggota, metode anggota, antarmuka, superclasses, metode konstruktor, dll. Melalui kelas kelas
Metode getClass () didefinisikan dalam kelas java.lang.Object, jadi untuk objek Java apa pun, jenis objek dapat diperoleh melalui metode ini. Kelas kelas adalah kelas inti dalam API refleksi, dan memiliki metode berikut
getName (): Dapatkan nama lengkap kelas.
getFields (): Dapatkan properti dari jenis publik kelas.
getDecledFields (): Dapatkan semua properti kelas.
getMethods (): Metode untuk mendapatkan jenis publik dari kelas.
getDeclaredMethods (): Dapatkan semua metode kelas.
getMethod (nama string, class [] parameterTypes): Mendapat metode tertentu dari kelas, parameter nama menentukan nama metode, parameter ParameterTypes menentukan jenis parameter dari metode ini.
getConstructors (): Dapatkan konstruktor jenis publik kelas.
getConstructor (class [] parameterTypes): Mendapatkan konstruktor spesifik kelas. ParameterTypes parameter menentukan jenis parameter konstruktor.
newInstance (): Buat objek kelas ini melalui konstruktor kelas tanpa parameter.
Langkah -langkah untuk menulis reflektor Java:
1) Anda harus terlebih dahulu mendapatkan objek kelas dari suatu kelas
Misalnya:
Kelas C1 = test.class; Class c2 = class.forname ("com.reflection.test"); Kelas C3 = tes baru (). GetClass (); 2) Kemudian panggil metode dalam objek kelas secara terpisah untuk mendapatkan properti/metode/konstruktor kelas
Catatan: Jika Anda ingin mendapatkan metode/properti/konstruktor di kelas secara normal, Anda harus fokus pada kelas refleksi berikut
Bidang
Konstruktor
Metode
<servlet-mapping> <servlet-name> </servlet-name> <rerl-pattern> </rucs-pola> </servlet-mapping> untuk (string elementa: str) {system.out.print (elementA + "); } Daftar <String> Daftar = ArrayList baru <string> (); untuk (int i = 0; i <str.length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} Set <string> set = hashset baru <string> (); untuk (int i = 0; i <str.length; i ++) {set.add (str [i]); }Musim semi memiliki enam transaksi dan lima tingkat isolasi
Kategori 1: inte pendek int panjang
Kategori 2: Mengapung Ganda
Kategori ketiga: Boolean logis (hanya memiliki dua nilai yang dapat dianggap benar salah)
Kategori 4: karakter karakter
Metode di kelas modifikasi akhir
Fungsi: Ini dapat diwariskan, tetapi tidak dapat ditulis ulang setelah warisan.
Kelas Modifikasi Akhir
Fungsi: Kelas tidak dapat diwariskan.
Ketika final memodifikasi tipe dasar, nilainya tetap tidak berubah. Jenis referensi menunjukkan bahwa alamatnya tetap tidak berubah. Yaitu, ketika baru, alamatnya tidak dapat dipindahkan.
Anda tahu atribut modifikasi akhir
Persiapan sudah dikompilasi. Pertama kirimkan SQL ke database untuk preprocessing, dan kemudian masukkan ke dalam cache. Lain kali Anda menemukan bahwa ada hal yang sama, Anda tidak perlu mengkompilasinya. Efisiensi eksekusi tinggi, ada petunjuk sintaks untuk memfasilitasi pemeriksaan, dan parameternya dinamis, mencegah injeksi SQL karena pemeriksaan sintaksis
Pilih * dari tbname = 'zck' dan passwd = 'atau' 1 '=' 1 ';
Pernyataan tidak dikompilasi, dan membutuhkan pemeriksaan manual untuk kesalahan sintaksis, yang hardcoded
Hashmap memungkinkan null sebagai kunci atau nilai entri, sedangkan hashtable tidak
Letakkan metode
HashMap akan melakukan pemrosesan khusus pada kunci nilai nol, selalu masukkan ke dalam posisi tabel [0]. Letakkan prosesnya adalah untuk menghitung hash terlebih dahulu dan kemudian menghitung nilai indeks melalui hash dan tabel.length, dan kemudian letakkan kunci pada posisi tabel [indeks]. Ketika elemen -elemen lain sudah ada di tabel [indeks], daftar tertaut akan dibentuk pada posisi [indeks] tabel, dan elemen yang baru ditambahkan akan ditempatkan pada tabel [indeks], dan elemen asli akan ditautkan melalui entri berikutnya. Dengan cara ini, masalah konflik hash diselesaikan dalam bentuk daftar yang ditautkan. Ketika jumlah elemen mencapai nilai kritis (faktor kapaktik*), kapasitas akan diperluas, dan panjang array tabel menjadi tabel. Panjang*2
Dapatkan metode
Demikian pula, ketika kuncinya adalah nol, pemrosesan khusus akan dilakukan, dan elemen dengan kunci adalah nol ditemukan pada daftar tabel yang ditautkan [0].
Proses GET adalah untuk menghitung hash terlebih dahulu dan kemudian menghitung nilai indeks melalui hash dan tabel. Panjangnya, kemudian beralih melalui daftar yang ditautkan pada tabel [indeks] sampai kunci ditemukan, dan kemudian mengembalikan implementasi hash yang mendasari hash dan hashtable keduanya adalah array + link Struktur yang ditautkan untuk menghitung hash terlebih dahulu. Indeks, yang merupakan subskrip dari array tabel, dihitung berdasarkan hash dan tabel.length, dihitung, dan operasi yang sesuai dilakukan.
Sebagian besar indeks didasarkan pada b-tree
Masalah keamanan utas servlet terutama disebabkan oleh variabel instan, jadi variabel instance harus dihindari dalam servlets.
Jika desain aplikasi tidak dapat menghindari menggunakan variabel instan, maka sinkronisasi digunakan untuk melindungi variabel instan yang akan digunakan, tetapi untuk kinerja sistem yang optimal, jalur kode dengan ketersediaan minimal harus disinkronkan.
Tulis pola singleton
public static long recursive(int n) {if (n <= 0)return 0;if (n == 1)return 1;return recursive(n - 1) + recursive(n - 2);}public static long loop(int n) {if (n <= 0)return 0;if (n == 1)return 1;long fib1 = 0;long fib2 = 1;long sum = 0;for (int i = 2; i <= n; i ++) {sum = fib1+fib2; fib1 = fib2; fib2 = sum;} jumlah pengembalian;} Hashtable adalah kelas yang aman. Ini menggunakan sinkronisasi untuk mengunci seluruh tabel hash untuk mencapai keamanan utas, yaitu, mengunci seluruh tabel setiap saat dan membiarkan utas menempati itu. ConcurrenthashMap memungkinkan beberapa operasi modifikasi dilakukan secara bersamaan, dan kuncinya adalah penggunaan teknologi pemisahan kunci. Ini menggunakan beberapa kunci untuk mengontrol modifikasi ke berbagai bagian tabel hash.
ConcurrenthashMap menggunakan segmen (segmen) untuk mewakili bagian yang berbeda ini. Setiap segmen sebenarnya adalah hashtable kecil, dan mereka memiliki kunci sendiri. Selama beberapa operasi modifikasi terjadi pada segmen yang berbeda, mereka dapat dilakukan secara bersamaan.
Beberapa metode perlu melintasi segmen, seperti size () dan containsValue (). Mereka mungkin perlu mengunci seluruh tabel, bukan hanya segmen tertentu. Ini membutuhkan penguncian semua segmen secara berurutan. Setelah operasi selesai, kunci semua segmen dirilis secara berurutan. "Secara rangka" sangat penting di sini, jika tidak ada kemungkinan kebuntuan yang tinggi. Di ConcurrenthashMap, array segmen bersifat final, dan variabel anggotanya sebenarnya final. Namun, cukup menyatakan array sebagai final tidak menjamin bahwa anggota array adalah final, yang membutuhkan jaminan implementasi.
Ini memastikan bahwa tidak ada kebuntuan, karena urutan di mana kunci diperoleh diperbaiki
① threadlocal ② disinkronkan () ③ tunggu () dan beri tahu () ④ volatile
Threadlocal
ThreadLocal memastikan bahwa utas yang berbeda memiliki contoh yang berbeda, dan utas yang sama harus memiliki instance yang sama, yaitu, setiap utas menggunakan variabel memberikan salinan nilai variabel. Setiap utas dapat secara mandiri mengubah salinannya sendiri, daripada bertentangan dengan salinan utas lainnya.
Keuntungan: Menyediakan objek bersama yang aman-aman
Perbedaan dari mekanisme sinkronisasi lainnya: mekanisme sinkronisasi adalah untuk menyinkronkan akses bersamaan ke sumber daya yang sama dengan banyak utas, dan untuk berkomunikasi antara beberapa utas;
Threadlocal adalah berbagi data yang diisolasi dari banyak utas, dan pada dasarnya tidak berbagi sumber daya antara banyak utas. Ini tentu saja tidak memerlukan banyak utas untuk disinkronkan.
tidak stabil
Variabel anggota yang dimodifikasi yang mudah menguap dipaksa untuk membaca ulang nilai variabel anggota dari memori bersama setiap kali diakses oleh utas. Dan,
Ketika variabel anggota berubah, utas dipaksa untuk menulis nilai perubahan kembali ke memori bersama.
Keuntungan: Dengan cara ini, kapan saja, dua utas yang berbeda selalu melihat nilai yang sama dari variabel anggota tertentu.
Alasan: Spesifikasi Bahasa Java menyatakan bahwa untuk mendapatkan kecepatan terbaik, utas diizinkan untuk menyimpan salinan pribadi dari variabel anggota bersama.
Dan itu hanya dibandingkan dengan nilai asli dari variabel anggota bersama ketika utas masuk atau meninggalkan blok kode sinkron.
Dengan cara ini, ketika banyak utas berinteraksi dengan suatu objek pada saat yang sama, perlu untuk memperhatikan memungkinkan utas untuk mendapatkan perubahan dalam variabel anggota bersama secara tepat waktu.
Kata kunci yang mudah menguap meminta VM: untuk variabel anggota ini, ia tidak dapat menyimpan salinan pribadinya, tetapi harus secara langsung berinteraksi dengan variabel anggota bersama.
Kiat Penggunaan: Gunakan volatile pada variabel anggota yang diakses oleh dua atau lebih utas.
Tidak perlu digunakan ketika variabel yang akan diakses sudah ada di blok kode yang disinkronkan atau konstan.
Untuk meningkatkan efisiensi, utas menyalin variabel anggota (seperti a) (seperti b), dan akses ke A di utas sebenarnya mengakses B. Sinkronisasi A dan B hanya dilakukan dalam tindakan tertentu, sehingga ada situasi di mana A dan B tidak konsisten. Volatile digunakan untuk menghindari situasi ini.
Volatile memberi tahu JVM bahwa variabel yang dimodifikasi tidak menyimpan salinan dan secara langsung mengakses yang ada di memori utama (lebih baik digunakan ketika ada banyak operasi yang dibaca; komunikasi diperlukan di antara utas, tetapi artikel ini tidak dapat melakukannya)
Variabel volatil memiliki sifat visibilitas yang disinkronkan, tetapi tidak memiliki sifat atom.
Ini berarti bahwa utas dapat secara otomatis menemukan nilai terbaru dari variabel volatil. Variabel volatil dapat digunakan untuk memberikan keamanan utas, tetapi hanya dapat diterapkan pada serangkaian kasus penggunaan yang sangat terbatas: tidak ada kendala antara beberapa variabel atau antara nilai variabel saat ini dan nilai yang dimodifikasi.
Anda hanya dapat menggunakan variabel yang mudah menguap alih -alih kunci dalam kasus terbatas. Untuk membuat variabel variabel yang variabel keamanan benang ideal, dua kondisi berikut harus dipenuhi pada saat yang sama:
Operasi tulis ke variabel tidak tergantung pada nilai saat ini; Variabel tidak termasuk dalam invarian dengan variabel lain.
sleep () vs wait ()
Sleep adalah kelas utas (utas), yang menyebabkan utas ini menjeda eksekusi untuk waktu yang ditentukan dan mengirim peluang eksekusi ke utas lain, tetapi status pemantauan tetap dan secara otomatis akan dilanjutkan setelah itu. Memanggil tidur tidak akan melepaskan kunci objek.
Tunggu adalah metode kelas objek. Memanggil metode tunggu pada objek ini menyebabkan utas melepaskan kunci objek dan memasukkan kunci pool menunggu menunggu objek ini. Hanya setelah mengeluarkan metode notify (atau notifyall) untuk objek ini, utas ini memasuki kumpulan kunci objek dan bersiap untuk mendapatkan kunci objek dan memasuki status berjalan. ;
http://www.yjbys.com/news/202750.html
Program klien perlu mendapatkan peran kontainer tertentu terlebih dahulu, dan kemudian memperoleh peran iterator spesifik melalui peran wadah spesifik.
Iterator it = new arraylist.iterator ();
1) Mengakses isi objek kontainer tanpa mengekspos representasi internalnya.
2) Mendukung beberapa traversal objek kontainer.
3) Menyediakan antarmuka terpadu (iterasi polimorfik) untuk melintasi struktur wadah yang berbeda.
Gunakan kata kunci baru} → konstruktor dipanggil
Gunakan metode newinstance kelas kelas} → konstruktor dipanggil
Gunakan metode newinstance dari kelas konstruktor} → fungsi konstruktor dipanggil
Menggunakan metode klon} → tidak ada konstruktor yang dipanggil
Menggunakan Deserialization} → Tidak ada konstruktor yang disebut
Karyawan emp2 = (karyawan) class.forname ("com.employee"). Newinstance (); atau
Karyawan emp2 = emplass.class.newInstance (); konstruktor konstruktor = usaha.class.getConstructor (); Karyawan emp3 = konstruktor.newinstance ();
Menggunakan metode klon, kita harus terlebih dahulu mengimplementasikan antarmuka yang dapat dikloning dan mengimplementasikan metode klon yang ditentukan olehnya
Karyawan emp4 = (karyawan) emp3.clone ();
Ketika program dimulai, itu tidak memuat semua file kelas yang akan digunakan oleh program sekaligus. Sebaliknya, secara dinamis memuat file kelas tertentu ke dalam memori melalui mekanisme pemuatan kelas Java (ClassLoader) sesuai dengan kebutuhan program. Oleh karena itu, hanya setelah file kelas dimuat ke dalam memori dapat dirujuk oleh kelas lain. Oleh karena itu, ClassLoader digunakan untuk secara dinamis memuat file kelas ke dalam memori.
Bootstrap ClassLoader: disebut startup class loader, ini adalah loader kelas atas di Java Class Loading Hierarchy, yang bertanggung jawab untuk memuat pustaka kelas inti di JDK, seperti: Rt.Jar, sumber daya, Charset. Java_home/jre/lib/ext/secara default.
App ClassLoader: disebut loader kelas sistem, yang bertanggung jawab untuk memuat semua guci dan file kelas di direktori ClassPath aplikasi.
Karena ini dapat menghindari pemuatan berulang, ketika ayah telah memuat kelas, tidak perlu bagi classloader anak untuk memuatnya lagi.
Mempertimbangkan faktor keamanan, mari kita bayangkan bahwa jika kita tidak menggunakan mode delegasi ini, kita dapat secara dinamis mengganti jenis yang ditentukan dalam Java Core API kapan saja, yang akan menimbulkan risiko keamanan yang sangat besar. Metode delegasi induk dapat menghindari situasi ini, karena string sudah dimuat oleh boot class loader (bootstrcp classloader) saat startup, sehingga classloader yang ditentukan pengguna tidak akan pernah dapat memuat string yang ditulis dengan sendirinya, kecuali jika Anda mengubah algoritma default dari kelas pencarian ClassLoader di JDK.
1. Permintaan permintaan klien objek permintaan, permintaan ini akan berisi parameter dari permintaan GET/POST, dan hanya dapat memahami kebutuhan pelanggan dan kemudian merespons.
2. Informasi yang relevan tentang objek respons menanggapi permintaan pelanggan
3. Objek sesi mengacu pada sesi antara klien dan server, mulai dari aplikasi web dari klien ke server sampai klien terputus dari server.
4. Objek Out adalah instance dari kelas JSpwriter dan merupakan objek yang umum digunakan untuk mengeluarkan konten ke klien.
5. Objek halaman menunjuk ke halaman JSP saat ini itu sendiri, yang sedikit seperti penunjuk ini di kelas. Ini adalah contoh dari kelas java.lang.object
6. Objek aplikasi mewujudkan berbagi data antara pengguna dan dapat menyimpan variabel global. Dimulai dengan startup server sampai server dimatikan
7. Objek pengecualian adalah objek pengecualian. Ketika pengecualian terjadi selama proses berjalan, objek ini dihasilkan.
8. Objek PageContext menyediakan akses ke semua objek dan ruang nama di halaman JSP
9. Objek konfigurasi digunakan oleh mesin JSP untuk meneruskan informasi padanya ketika servlet diinisialisasi.
js memiliki fungsi isnan (val) // jika itu angka, ia mengembalikan false
Ada penguraian xmldom, penguraian saksofon, dan parsing stax
Xmldom: (xmldocumentObjectModel) Kinerja sangat memburuk saat memproses file besar. Masalah ini disebabkan oleh struktur pohon DOM, yang menempati banyak memori, dan DOM harus memuat seluruh dokumen ke dalam memori sebelum mem -parsing file, yang cocok untuk akses acak ke XML;
Sax: (Simpleadiforxml) Tidak seperti DOM, SAX adalah metode parsing XML yang digerakkan oleh peristiwa. Ini membaca file XML secara berurutan dan tidak mengharuskan seluruh file untuk dimuat sekaligus. Saat menghadapi acara seperti awal file, akhir dokumen, atau awal tag dan akhir tag, itu memicu acara di mana pengguna memproses file XML dengan menulis kode pemrosesan dalam acara callback -nya, cocok untuk akses berurutan ke XML;
Stax: Perbedaan antara (streamingapiforxml) dan metode lain adalah bahwa aplikasi dapat menangani XML sebagai aliran acara, yang lebih baik daripada metode lain dalam hal kinerja dan ketersediaan;
thread.getState ()
Di atas adalah pertanyaan wawancara Java yang disusun oleh editor untuk Anda. Saya harap mereka akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas Anda tepat waktu!