JavaRush /Blog Jawa /Random-JV /Inti Jawa. Pitakonan wawancara, part 2
Andrey
tingkat

Inti Jawa. Pitakonan wawancara, part 2

Diterbitake ing grup
Kanggo sing pisanan krungu tembung Jawa Inti, iki minangka prinsip dhasar saka basa kasebut. Kanthi kawruh iki, sampeyan bisa kanthi aman magang / magang.
Inti Jawa.  Pitakonan kanggo wawancara, bagean 2 - 1
Pitakonan iki bakal mbantu sampeyan nyegerake kawruh sadurunge wawancara, utawa sinau sing anyar dhewe. Kanggo entuk katrampilan praktis, sinau ing JavaRush . Artikel asli Pranala menyang bagean liyane: Java Core. Soal Wawancara, Bagian 1 Inti Jawa. Pitakonan kanggo wawancara, part 3

Napa metode finalize () kudu dihindari?

Kita kabeh ngerti pratelan yen metode finalize()diarani kolektor sampah sadurunge mbebasake memori sing dikuwasani obyek. Iki minangka conto program sing mbuktekake manawa telpon metode finalize()ora dijamin:
public class TryCatchFinallyTest implements Runnable {

	private void testMethod() throws InterruptedException
	{
		try
		{
			System.out.println("In try block");
			throw new NullPointerException();
		}
		catch(NullPointerException npe)
		{
			System.out.println("In catch block");
		}
		finally
		{
			System.out.println("In finally block");
		}
	}

	@Override
	protected void finalize() throws Throwable {
		System.out.println("In finalize block");
		super.finalize();
	}

	@Override
	public void run() {
		try {
			testMethod();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
public class TestMain
{
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
	for(int i=1;i< =3;i++)
	{
		new Thread(new TryCatchFinallyTest()).start();
	}
	}
}
Output: Ing try block Ing catch block Ing pungkasan block Ing try block Ing catch block Ing pungkasan block Ing try block Ing catch block Ing pungkasan block Aneh, cara iki finalizeora kaleksanan kanggo thread sembarang. Iki mbuktekake tembungku. Aku alesan sing finalizers sing kaleksanan dening Utas Penagih sampah kapisah. Yen Mesin Virtual Java mandheg banget awal, mula tukang sampah ora duwe cukup wektu kanggo nggawe lan nglakokake finalizer. Alasan liyane kanggo ora nggunakake metode kasebut finalize()yaiku:
  1. Cara kasebut finalize()ora bisa digunakake karo rantai kaya konstruktor. Iki tegese nalika sampeyan nelpon konstruktor kelas, konstruktor superclass bakal disebut tanpa syarat. Nanging ing kasus cara finalize(), iki ora bakal kelakon. Cara superclass finalize()kudu disebut kanthi eksplisit.
  2. Sembarang pangecualian sing dibuwang kanthi cara kasebut finalizeora digatekake dening benang pengumpul sampah lan ora bakal disebarake maneh, tegese acara kasebut ora bakal dicathet ing log sampeyan. Iki ala banget, ta?
  3. Sampeyan uga entuk penalti kinerja sing signifikan yen metode kasebut finalize()ana ing kelas sampeyan. Ing Pemrograman Efektif (ed. 2nd), Joshua Bloch ngandika:
    "Ya, lan siji liyane: ana paukuman kinerja gedhe nalika nggunakake finalizers. Ing mesinku, wektu kanggo nggawe lan ngrusak obyek sing prasaja kira-kira 5,6 nanodetik.
    Nambahake finalizer nambah wektu nganti 2400 nanodetik. Ing tembung liyane, kira-kira 430 kaping luwih alon kanggo nggawe lan mbusak obyek kanthi finalizer.

Napa HashMap ora bisa digunakake ing lingkungan multi-threaded? Apa iki bisa nyebabake loop tanpa wates?

Kita ngerti manawa HashMapiki minangka koleksi sing ora disinkronake, pasangan sing disinkronake yaiku HashTable. Dadi, nalika sampeyan ngakses koleksi lan ing lingkungan multi-threaded ing ngendi kabeh utas duwe akses menyang conto siji koleksi, mula luwih aman kanggo nggunakake HashTablekanthi alasan sing jelas, kayata ngindhari maca sing reged lan njamin konsistensi data. Ing kasus sing paling awon, lingkungan multi-Utas iki bakal nyebabake loop tanpa wates. Ya bener. HashMap.get()bisa nyebabake loop tanpa wates. Ayo ndeleng carane? Yen sampeyan ndeleng kode sumber metode kasebut HashMap.get(Object key), katon kaya iki:
public Object get(Object key) {
    Object k = maskNull(key);
    int hash = hash(k);
    int i = indexFor(hash, table.length);
    Entry e = table[i];
    while (true) {
        if (e == null)
            return e;
        if (e.hash == hash && eq(k, e.key))
            return e.value;
        e = e.next;
    }
}
while(true)bisa tansah dadi korban kanggo daur ulang tanpa wates ing lingkungan runtime multi-Utas yen sakperangan alesan e.nextbisa nuding dhewe. Iki bakal nimbulaké daur ulang telas, nanging carane e.nextbakal nuduhake dhewe (yaiku, kanggo e)? Iki bisa kedadeyan ing cara void transfer(Entry[] newTable)sing diarani nalika HashMapdiowahi ukurane.
do {
    Entry next = e.next;
    int i = indexFor(e.hash, newCapacity);
    e.next = newTable[i];
    newTable[i] = e;
    e = next;
} while (e != null);
Potongan kode iki cenderung nggawe loop tanpa wates yen ukurane kedadeyan bebarengan karo thread liyane sing nyoba ngganti conto peta ( HashMap). Cara mung kanggo ngindhari skenario iki yaiku nggunakake sinkronisasi ing kode sampeyan, utawa luwih apik, nggunakake koleksi sing disinkronake.

Nerangake abstraksi lan enkapsulasi. Carane padha disambungake?

Kanthi tembung sing prasaja , " Abstraksi mung nampilake sifat obyek sing penting kanggo tampilan saiki . " Ing teori pemrograman berorientasi obyek, abstraksi nyakup kemampuan kanggo nemtokake obyek sing makili "aktor" abstrak sing bisa nindakake karya, ngganti lan laporan owah-owahan ing negara, lan "interaksi" karo obyek liyane ing sistem. Abstraksi ing basa pamrograman apa wae bisa digunakake kanthi akeh cara. Iki bisa dideleng saka nggawe rutinitas kanggo nemtokake antarmuka kanggo prentah basa tingkat rendah. Sawetara abstraksi nyoba mbatesi ambane sakabèhé perwakilan saka kabutuhan programmer kanthi ndhelikake abstraksi sing dibangun, kayata pola desain. Biasane, abstraksi bisa dideleng kanthi rong cara: Abstraksi data minangka cara nggawe jinis data sing kompleks lan mung mbukak operasi sing migunani kanggo sesambungan karo model data, lan ing wektu sing padha ndhelikake kabeh rincian implementasine saka jagad njaba. Abstraksi eksekusi yaiku proses ngenali kabeh pernyataan sing penting lan mbabarake minangka unit kerja. Kita biasane nggunakake fitur iki nalika nggawe cara kanggo nindakake sawetara karya. Watesan data lan metode ing kelas kanthi kombinasi ndhelikake (nggunakake kontrol akses) asring diarani enkapsulasi. Asil minangka jinis data kanthi karakteristik lan prilaku. Enkapsulasi ateges uga kalebu ndhelikake data lan ndhelikake implementasine. "Encapsulate kabeh sing bisa diganti" . Kutipan iki minangka prinsip desain sing kondhang. Kanggo perkara kasebut, ing kelas apa wae, owah-owahan data bisa kedadeyan nalika runtime lan owah-owahan implementasine bisa kedadeyan ing versi sabanjure. Mangkono, enkapsulasi ditrapake kanggo data lan implementasine. Dadi bisa disambungake kaya mangkene:
  • Abstraksi biasane sing bisa ditindakake dening kelas [Idea]
  • Enkapsulasi luwih akeh Cara nggayuh fungsi iki [Implementasi]

Beda antarane antarmuka lan kelas abstrak?

Bentenipun utama bisa kadhaptar ing ngisor iki:
  • Antarmuka ora bisa ngetrapake cara apa wae, nanging kelas abstrak bisa.
  • Kelas bisa ngleksanakake akeh antarmuka, nanging mung bisa duwe siji superclass (abstrak utawa non-abstrak)
  • Antarmuka dudu bagean saka hirarki kelas. Kelas sing ora ana hubungane bisa ngetrapake antarmuka sing padha.
Sing kudu dieling-eling yaiku: "Yen sampeyan bisa njlèntrèhaké konsep kanthi lengkap babagan" apa sing ditindakake "tanpa kudu nemtokake "carane", sampeyan kudu nggunakake antarmuka. Yen sampeyan kudu nyakup sawetara rincian implementasine, mula sampeyan kudu makili konsep sampeyan ing kelas abstrak." Uga, kanthi cara liya: Apa ana akeh kelas sing bisa "diklompokake" lan diterangake kanthi tembung siji? Yen mangkono, gawe kelas abstrak kanthi jeneng tembung iki, lan warisake kelas kasebut. Contone, Catlan Dogbisa oleh warisan saka kelas abstrak Animal, lan kelas dhasar abstrak iki bakal ngleksanakake cara void Breathe()- ambegan, kang kabeh kewan mangkono bakal nindakake ing cara sing padha. Tembung kriya apa sing bisa ditrapake ing kelasku lan bisa ditrapake kanggo wong liya? Gawe antarmuka kanggo saben kriya kasebut. Contone, kabeh kewan bisa mangan, mula aku bakal nggawe antarmuka IFeedablelan Animalngetrapake antarmuka kasebut. Mung cukup apik kanggo ngleksanakake antarmuka Dog( saged seneng kula), nanging ora kabeh. Ana sing ujar: prabédan utama yaiku ing ngendi sampeyan pengin implementasine. Nalika nggawe antarmuka, sampeyan bisa mindhah implementasine kanggo sembarang kelas sing ngleksanakake antarmuka. Kanthi nggawe kelas abstrak, sampeyan bisa nuduhake implementasine kabeh kelas asale ing sak panggonan lan ngindhari akeh perkara sing ora becik kaya kode duplikat. HorseILikeable

Kepiye carane StringBuffer nyimpen memori?

Kelas kasebut Stringdileksanakake minangka obyek sing ora bisa diganti, tegese nalika sampeyan mutusake kanggo nyelehake barang menyang obyek kasebut String, mesin virtual nyedhiyakake array sing dawane tetep persis karo ukuran asline. Iki banjur bakal dianggep minangka pancet nang mesin virtual, kang menehi dandan kinerja pinunjul yen Nilai saka senar ora ngganti. Nanging, yen sampeyan mutusake kanggo ngganti isi senar kanthi cara apa wae, apa sing ditindakake mesin virtual yaiku nyalin isi senar asli menyang ruang sementara, gawe owah-owahan sampeyan, banjur simpen owah-owahan kasebut menyang susunan memori anyar. Mangkono, nggawe owah-owahan ing nilai senar sawise initialization operasi larang. StringBuffer, ing tangan liyane, dipun ginakaken minangka Uploaded mbosenke ngembangaken ing mesin virtual, kang tegese sembarang operasi modifikasi bisa kelakon ing sel memori ana lan memori anyar bakal diparengake yen perlu. Nanging, ora ana cara kanggo mesin virtual nindakake optimasi StringBufferamarga isine dianggep ora konsisten ing saben conto.

Napa metode ngenteni lan ngabari diumumake ing kelas Obyek tinimbang Utas?

Cara wait, notify, notifyAllmung dibutuhake yen sampeyan pengin thread sampeyan duwe akses menyang sumber daya sing dienggo bareng lan sumber daya sing dienggo bareng bisa dadi obyek java ing tumpukan kasebut. Mangkono, cara kasebut ditetepake ing kelas dhasar Objectsupaya saben obyek duwe kontrol sing ngidini benang ngenteni ing monitor. Jawa ora duwe obyek khusus sing digunakake kanggo nuduhake sumber daya bareng. Ora ana struktur data sing ditetepake. Mula, dadi tanggung jawab kelas Objectsupaya bisa dadi sumber daya bareng, lan nyedhiyakake metode helper kayata wait(), notify(), notifyAll(). Jawa adhedhasar gagasan Charles Hoare babagan monitor. Ing Jawa, kabeh obyek duwe monitor. Utas ngenteni ing monitor, supaya bisa ngenteni, kita butuh rong parameter:
  • benang
  • monitor (obyek apa wae).
Ing desain Jawa, utas ora bisa ditetepake kanthi tepat; mesthi dadi utas saiki sing ngeksekusi kode kasebut. Nanging, kita bisa nemtokake monitor (yaiku obyek sing bisa diarani metode wait). Iki desain apik amarga yen kita bisa meksa thread liyane ngenteni ing monitor tartamtu, iku bakal nyebabake "invasi", nggawe ngrancang / program program podo angel. Elinga yen ing Jawa, kabeh operasi sing ngganggu utas liyane ora digunakake (contone, stop()).

Tulis program kanggo nggawe deadlock ing Jawa lan ndandani

Ing Jawa deadlock, iki minangka kahanan sing paling ora ana rong utas nyekel blok ing sumber daya sing beda, lan loro-lorone ngenteni sumber daya liyane kasedhiya kanggo ngrampungake tugas. Lan ora ana sing bisa ninggalake kunci ing sumber daya sing ditahan. Inti Jawa.  Pitakonan kanggo wawancara, bagean 2 - 2 Contoh program:
package thread;

public class ResolveDeadLockTest {

	public static void main(String[] args) {
		ResolveDeadLockTest test = new ResolveDeadLockTest();

		final A a = test.new A();
		final B b = test.new B();

		// Thread-1
		Runnable block1 = new Runnable() {
			public void run() {
				synchronized (a) {
					try {
					// Добавляем задержку, чтобы обе нити могли начать попытки
					// блокирования ресурсов
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					// Thread-1 заняла A но также нуждается в B
					synchronized (b) {
						System.out.println("In block 1");
					}
				}
			}
		};

		// Thread-2
		Runnable block2 = new Runnable() {
			public void run() {
				synchronized (b) {
					// Thread-2 заняла B но также нуждается в A
					synchronized (a) {
						System.out.println("In block 2");
					}
				}
			}
		};

		new Thread(block1).start();
		new Thread(block2).start();
	}

	// Resource A
	private class A {
		private int i = 10;

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}
	}

	// Resource B
	private class B {
		private int i = 20;

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}
	}
}
Nganggo kode ing ndhuwur bakal nyebabake deadlock amarga alasan sing jelas (dijelasake ing ndhuwur). Saiki kita kudu ngatasi masalah iki. Aku percaya yen solusi kanggo masalah apa wae ana ing oyod saka masalah kasebut. Ing kasus kita, model akses menyang A lan B minangka masalah utama. Mula, kanggo ngatasi, kita mung ngganti urutan operator akses menyang sumber daya sing dienggo bareng. Sawise owah-owahan bakal katon kaya iki:
// Thread-1
Runnable block1 = new Runnable() {
	public void run() {
		synchronized (b) {
			try {
				// Добавляем задержку, чтобы обе нити могли начать попытки
				// блокирования ресурсов
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// Thread-1 заняла B но также нуждается в А
			synchronized (a) {
				System.out.println("In block 1");
			}
		}
	}
};

// Thread-2
Runnable block2 = new Runnable() {
	public void run() {
		synchronized (b) {
			// Thread-2 заняла B но также нуждается в А
			synchronized (a) {
				System.out.println("In block 2");
			}
		}
	}
};
Mbukak kelas iki maneh lan saiki sampeyan ora bakal weruh deadlock. Muga-muga iki mbantu sampeyan ngindhari deadlocks lan nyingkirake yen sampeyan nemoni.

Apa mengkono yen kelas sing ngleksanakake antarmuka Serializable ngemot komponen non-serializable? Carane ndandani iki?

Ing kasus iki, bakal dibuwang NotSerializableExceptionnalika eksekusi. Kanggo ndandani masalah iki, ana solusi sing gampang banget - mriksa kothak iki transient. Iki tegese kolom sing wis dicenthang ora bakal serial. Yen sampeyan uga pengin nyimpen kahanan kolom kasebut, sampeyan kudu nimbang variabel referensi, sing wis ngetrapake Serializable. Sampeyan bisa uga kudu nggunakake readResolve()lan cara writeResolve(). Ayo ngringkes:
  • Pisanan, gawe lapangan sampeyan ora bisa diserialisasi transient.
  • Pisanan writeObject, nelpon defaultWriteObjectthread kanggo nyimpen kabeh non- transientbidang, banjur nelpon cara isih kanggo serialize sifat individu saka obyek non-serializable.
  • Ing readObject, pisanan nelpon defaultReadObjecting stream kanggo maca kabeh non transientlapangan, banjur nelpon cara liyane (cocog karo sing ditambahake ing writeObject) kanggo deserialize non transientobyek.

Nerangake tembung kunci transient lan molah malih ing basa Jawa

"Kata kunci transientdigunakake kanggo nunjukake kolom sing ora bakal serialized." Miturut Spesifikasi Basa Jawa: Variabel bisa ditandhani karo indikator transien kanggo nunjukake yen dheweke dudu bagean saka kahanan terus-terusan obyek kasebut. Contone, sampeyan bisa ngemot kolom sing asale saka lapangan liyane, lan luwih becik diwenehi kanthi program tinimbang mulihake negara kasebut liwat serialisasi. Contone, ing kelas, BankPayment.javalapangan kayata principal(direktur) lan rate(tingkat) bisa serialized, lan interest(kapentingan accrued) bisa diwilang ing sembarang wektu, malah sawise deserialization. Yen kita ngelingi, saben thread ing Jawa duwe memori lokal dhewe lan nindakake operasi maca / nulis ing memori lokal iki. Nalika kabeh operasi wis rampung, nyerat negara dipunéwahi saka variabel menyang memori sambungan, saka ngendi kabeh Utas ngakses variabel. Biasane, iki minangka benang normal ing mesin virtual. Nanging modifier molah malih marang mesin virtual sing akses thread kanggo variabel sing kudu tansah cocog salinan dhewe saka variabel karo salinan master saka variabel ing memori. Iki tegese saben-saben thread pengin maca status variabel, kudu mbusak status memori internal lan nganyari variabel saka memori utama. Volatilepaling migunani ing algoritma kunci-free. Sampeyan menehi tandha variabel sing nyimpen data sing dienggo bareng minangka molah malih, banjur sampeyan ora nggunakake kunci kanggo ngakses variabel kasebut, lan kabeh owah-owahan sing digawe dening siji utas bakal katon kanggo wong liya. Utawa yen sampeyan pengin nggawe hubungan "kedaden-sawise" kanggo mesthekake yen petungan ora bola, maneh kanggo mesthekake owah-owahan katon ing wektu nyata. Volatile kudu digunakake kanggo nerbitake obyek sing ora bisa diganti kanthi aman ing lingkungan multi-threaded. Pranyatan lapangan public volatile ImmutableObjectmesthekake yen kabeh utas tansah ndeleng referensi saiki kasedhiya kanggo conto.

Bedane antarane Iterator lan ListIterator?

Kita bisa nggunakake , utawa Iteratorkanggo iterate liwat unsur . Nanging mung bisa digunakake kanggo ngulang unsur . Bedane liyane diterangake ing ngisor iki. Sampeyan bisa: SetListMapListIteratorList
  1. iterate ing urutan mbalikke.
  2. entuk indeks ing endi wae.
  3. nambah nilai ing ngendi wae.
  4. nyetel sembarang nilai ing posisi saiki.
Sukses kuliahmu!! Penulis artikel Lokesh Gupta Original article Java Core. Soal Wawancara, Bagian 1 Inti Jawa. Pitakonan kanggo wawancara, part 3
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION