Artikel ini terutama mengatur pertanyaan wawancara Java umum untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
1. Perbedaan antara tidur dan tunggu di java
① Kedua metode ini berasal dari kelas yang berbeda, tidur berasal dari kelas utas, dan tunggu berasal dari kelas objek.
Tidur adalah metode class statis dari utas. Siapa pun yang menyebutnya tidur. Bahkan jika metode tidur B dipanggil dalam utas A, itu sebenarnya masih akan tidur. Untuk membuat utas B tidur, Anda harus menelepon tidur dalam kode b.
② Kunci: Yang paling penting adalah bahwa metode tidur tidak melepaskan kunci, sementara metode tunggu melepaskan kunci, sehingga utas lain dapat menggunakan blok atau metode kontrol sinkron.
Tidur tidak mentransfer sumber daya sistem; Tunggu adalah untuk memasuki kumpulan utas menunggu untuk menunggu, mentransfer sumber daya sistem, dan utas lainnya dapat menempati CPU. Secara umum, tunggu tidak akan menambah batas waktu, karena jika utas tunggu berjalan dalam sumber daya yang tidak mencukupi, tidak ada gunanya keluar lagi. Anda harus menunggu utas lain untuk menelepon Notify/NotifyAll untuk membangunkan semua utas di kolam penunggu sebelum memasuki antrian siap dan menunggu OS mengalokasikan sumber daya sistem. Tidur (milidetik) dapat ditentukan untuk secara otomatis membangunkannya. Jika waktunya kurang dari waktu, Anda hanya dapat memanggil interrupt () untuk memaksa interupsi.
Fungsi thread.sleep (0) adalah untuk "memicu sistem operasi untuk bersaing ulang CPU sekali lagi".
③ Lingkup Penggunaan: Tunggu, beri tahu dan beri tahu semua hanya dapat digunakan dalam metode kontrol sinkronisasi atau blok kontrol sinkronisasi, sementara tidur dapat digunakan di mana saja.
disinkronkan (x) {x.notify () // atau tunggu ()}2. Perbedaan antara hashmap dan hashtable di java
① Alasan Historis: Hashtable diberikan kepada Kelas Diktonary Lama. HashMap adalah implementasi antarmuka peta yang diperkenalkan oleh Java 1.2.
② hashmap memungkinkan pasangan nilai kunci kosong, sedangkan hashtable tidak
③ Sinkronisasi hashtable, sedangkan hashmap asinkron lebih efisien daripada hashtable
3. Harap jelaskan perbedaan antara lemparan dan lemparan secara singkat dalam pengecualian
① Throw mewakili suatu tindakan, yang berarti pengecualian dilemparkan; Lemparan mewakili suatu keadaan, yang berarti bahwa metode ini mungkin memiliki pengecualian yang dilemparkan ② lemparan digunakan dalam implementasi metode, sedangkan lemparan digunakan dalam deklarasi metode ③ lemparan hanya dapat digunakan untuk melempar satu pengecualian, sedangkan lemparan dapat melempar beberapa pengecualian
4. Perbedaan antara overflow memori dan kebocoran memori
Memori overflow dari memori mengacu pada fakta bahwa ketika suatu program berlaku untuk memori, tidak ada ruang memori yang cukup untuk digunakan, dan di luar memori muncul; Misalnya, jika bilangan bulat diterapkan tetapi dapat menghemat lama, itu adalah overflow memori.
Kebocoran memori memori mengacu pada ketidakmampuan program untuk membebaskan ruang memori yang telah diterapkan setelah melamar memori. Kerusakan kebocoran memori dapat diabaikan, tetapi konsekuensi dari akumulasi kebocoran memori sangat serius. Tidak peduli berapa banyak ingatannya, itu akan ditempati cepat atau lambat.
Kebocoran memori pada akhirnya akan menyebabkan keluar dari memori!
Memori overflow berarti bahwa memori yang Anda perlukan untuk mengalokasikan melebihi apa yang dapat diberikan sistem, dan sistem tidak dapat memenuhi kebutuhan, sehingga terjadi luapan.
Kebocoran memori adalah saat Anda berlaku untuk sistem untuk mengalokasikan memori untuk digunakan (baru), tetapi setelah digunakan, itu tidak kembali (hapus). Akibatnya, Anda tidak dapat lagi mengakses memori yang Anda terapkan (mungkin Anda kehilangan alamatnya), dan sistem tidak dapat mengalokasikannya ke program yang diperlukan lagi. Jika Anda menggunakan semua metode untuk mengisi piring, Anda hanya dapat memegang 4 buah. Jika Anda mengisi 5, Anda akan jatuh ke tanah dan Anda tidak bisa memakannya. Ini meluap! Misalnya, jika tumpukan penuh, itu pasti akan menyebabkan ruang meluap ketika tumpukan penuh, yang disebut overflow. Jika tumpukan kosong, itu juga akan menyebabkan ruang luapan ketika tumpukan kosong, yang disebut underflow. Ini berarti bahwa memori yang dialokasikan tidak cukup untuk meletakkan urutan item data, yang disebut memori overflow.
Klasifikasi dengan cara yang terjadi, kebocoran memori dapat dibagi menjadi 4 kategori:
① Sering bocor memori. Kode yang terjadi dengan kebocoran memori akan dieksekusi beberapa kali, dan setiap kali dieksekusi, itu akan menyebabkan sepotong memori bocor.
② Kebocoran memori sesekali. Kode yang terjadi dengan kebocoran memori hanya akan terjadi di lingkungan atau operasi tertentu. Reguler dan sesekali relatif. Untuk lingkungan tertentu, kesempatan mungkin menjadi sering. Oleh karena itu, lingkungan pengujian dan metode pengujian sangat penting untuk mendeteksi kebocoran memori.
③ Kebocoran memori satu kali. Kode yang terjadi dengan kebocoran memori hanya akan dieksekusi sekali, atau karena cacat algoritmik, selalu hanya ada satu bagian dari kebocoran memori. Misalnya, memori dialokasikan dalam konstruktor kelas, tetapi memori tidak dilepaskan dalam destruktor, sehingga bocor memori hanya terjadi sekali.
④ Kebocoran memori implisit. Program terus mengalokasikan memori selama operasi, tetapi tidak melepaskan memori sampai selesai. Sebenarnya, tidak ada bocor memori di sini karena program akhirnya membebaskan semua memori yang diminta. Tetapi untuk program server, dibutuhkan beberapa hari, minggu, atau bahkan berbulan -bulan untuk dijalankan, dan tidak membebaskan memori dalam waktu juga dapat menyebabkan akhir dari melelahkan semua memori dalam sistem. Jadi, kami menyebut jenis bocor memori ini sebagai kebocoran memori implisit.
Dari perspektif pengguna yang menggunakan program, bocor memori sendiri tidak akan menyebabkan kerusakan. Sebagai pengguna biasa, Anda tidak dapat merasakan keberadaan bocor memori sama sekali. Yang benar -benar berbahaya adalah akumulasi kebocoran memori, yang pada akhirnya akan mengkonsumsi semua memori dalam sistem. Dari perspektif ini, kebocoran memori satu kali tidak berbahaya karena tidak menumpuk, sementara kebocoran memori implisit sangat berbahaya karena mereka lebih sulit dideteksi daripada kebocoran memori yang sering dan sesekali.
5. Perbedaan antara String, StringBuffer dan StringBuilder
①Variabel dan tidak berubah
Kelas String menggunakan array karakter untuk menyimpan string, sebagai berikut: karena ada pengubah "akhir", Anda dapat mengetahui bahwa objek string tidak dapat diubah.
nilai arang akhir pribadi [];
Baik StringBuilder dan StringBuffer diwarisi dari kelas AbstractStringBuilder. Dalam AbstractStringBuilder, array karakter digunakan untuk menyimpan string. Sebagai berikut, dapat dilihat bahwa kedua objek dapat berubah.
nilai char [];
② Apakah itu multi-threaded dan aman
Objek dalam string tidak dapat diubah, sehingga dapat dipahami sebagai konstanta, yang jelas-jelas aman.
AbstractStringBuilder adalah kelas induk publik dari StringBuilder dan StringBuffer, yang mendefinisikan beberapa operasi dasar string, seperti ExpandCapacity, Append, Insert, IndexOF dan Metode Publik lainnya.
StringBuffer memiliki kunci sinkronisasi pada metode ini atau kunci sinkronisasi pada metode yang dipanggil, jadi ini aman. Lihat kode sumber berikut:
StringBuffer Reverse yang disinkronkan publik () {super.reverse (); kembalikan ini; } public int indexOf (string str) {return indexof (str, 0); // Ada Metode Int Int Sinkronisasi Publik (String Str String, int FromIndex)} StringBuilder tidak menambahkan kunci sinkronisasi ke metode ini, jadi itu tidak aman.
③StringBuilder dan StringBuffer kesamaan
StringBuilder dan StringBuffer memiliki kelas orang tua publik AbstractStringBuilder (kelas abstrak).
Salah satu perbedaan antara kelas abstrak dan antarmuka adalah bahwa beberapa metode publik subkelas dapat didefinisikan dalam kelas abstrak. Subkelas hanya perlu menambahkan fungsi baru dan tidak perlu mengulangi metode yang ada; sementara antarmuka hanya mendefinisikan metode dan konstanta.
Metode StringBuilder dan StringBuffer akan memanggil metode publik di AbstractStringBuilder, seperti Super.Append (...). Hanya saja StringBuffer akan menambahkan kata kunci yang disinkronkan ke metode dan melakukan sinkronisasi.
Akhirnya, jika program tidak multithreaded, maka menggunakan StringBuilder lebih efisien daripada StringBuffer.
6. Perbedaan antara array dan daftar tertaut
Keduanya milik struktur data
Dari struktur logis:
① Array harus menentukan panjang tetap (jumlah elemen) di muka, dan tidak dapat beradaptasi dengan peningkatan dinamis dan penurunan data. Ketika data meningkat, jumlah elemen dapat melebihi yang semula ditentukan; Ketika data berkurang, limbah memori akan disebabkan; Array dapat diakses secara langsung sesuai dengan subskrip.
② Daftar yang ditautkan disimpan secara dinamis dan dialokasikan, yang dapat beradaptasi dengan peningkatan dinamis dan penurunan data, dan dapat dengan mudah memasukkan dan menghapus item data. (Saat memasukkan dan menghapus item data dalam array, Anda perlu memindahkan item data lainnya, yang sangat rumit) Daftar yang ditautkan harus menemukan elemen berikutnya sesuai dengan pointer berikutnya.
Dari penyimpanan memori:
① (statis) Array mengalokasikan ruang dari tumpukan, yang nyaman dan cepat untuk pemrogram, tetapi memiliki sedikit kebebasan.
② Daftar yang ditautkan mengalokasikan ruang dari tumpukan, yang memiliki banyak kebebasan tetapi lebih merepotkan untuk melamar manajemen.
Dari perbandingan di atas, kita dapat melihat bahwa jika Anda perlu mengakses data dengan cepat dan jarang atau tidak menyisipkan dan menghapus elemen, Anda harus menggunakan array; Sebaliknya, jika Anda perlu memasukkan dan menghapus elemen sering, Anda perlu menggunakan struktur data daftar yang ditautkan.
7. Perbedaan antara ArrayList dan LinkedList
①ArrayList mengimplementasikan struktur data berdasarkan array dinamis, dan LinkedList didasarkan pada struktur data berdasarkan daftar tertaut.
② Untuk akses acak untuk mendapatkan dan mengatur, ArrayList terasa lebih baik daripada LinkedList karena LinkedList perlu memindahkan pointer.
③Untuk penambahan dan operasi penghapusan menambah dan menghapus, LinedList memiliki keuntungan yang relatif karena ArrayList perlu memindahkan data.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.