JavaRush /Java Blog /Random-TK /Java Core. Söhbetdeşlik soraglary, 2-nji bölüm
Andrey
Dereje

Java Core. Söhbetdeşlik soraglary, 2-nji bölüm

Toparda çap edildi
Java Core sözüni ilkinji gezek eşidenler üçin bu diliň esasy esaslarydyr. Bu bilim bilen, tejribe / tejribe üçin arkaýyn gidip bilersiňiz.
Java Core.  Söhbetdeşlik üçin soraglar, 2 - 1 bölüm
Bu soraglar, söhbetdeşlikden ozal bilimleriňizi täzelemäge ýa-da özüňiz üçin täze bir zat öwrenmäge kömek eder. Amaly endikleri almak üçin JavaRush -da okaň . Asyl makala Beýleki böleklere baglanyşyklar: Java Core. Söhbetdeşlik soraglary, 1-nji bölüm Java Core. Söhbetdeşlik üçin soraglar, 3-nji bölüm

Näme üçin gutarnykly () usuldan gaça durmaly?

finalize()Bir zadyň eýeleýän ýadyny boşatmazdan ozal, bir usul zibil ýygnaýjy tarapyndan çagyrylýar diýen jümläni bilýäris . finalize()Ine, usul çagyryşynyň kepillendirilmeýändigini subut edýän mysal programmasy :
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();
	}
	}
}
Çykyş: Synag blokynda Tutuş blokda Iň soňunda blok In In block block In In block block In try block In In block block In amaherezo blokirleme Geň galdyryjy zat, bu usul finalizehaýsydyr bir sapak üçin ýerine ýetirilmedi. Bu meniň sözlerimi subut edýär. Meniň pikirimçe, munuň sebäbi jemleýjiler aýratyn zibil ýygnaýjy sapak bilen ýerine ýetirilýär. Java wirtual maşyn gaty ir gutarsa, zibil ýygnaýjylaryň gutarnykly netijeleri döretmek we ýerine ýetirmek üçin ýeterlik wagty ýok. Usuly ulanmazlygyň beýleki sebäpleri finalize()bolup biler:
  1. Usul finalize()konstruktorlar ýaly zynjyrlar bilen işlemeýär. Diýmek, synp konstruktory diýlende, superklass konstruktorlary şertsiz atlandyrylar. Emma usul bar bolsa finalize(), bu dowam etmez. Superklass usuly finalize()aç-açan atlandyrylmalydyr.
  2. Usul tarapyndan atylan islendik kadadan çykma, finalizezibil ýygnaýjy sapak tarapyndan hasaba alynmaýar we mundan beýläk ýaýramaz, bu hadysanyň ýazgylaryňyza ýazylmajakdygyny aňladýar. Bu gaty erbet, şeýlemi?
  3. finalize()Şeýle hem bu usul synpyňyzda bar bolsa, ep-esli ýerine ýetiriş jezasyny alarsyňyz . Netijeli programmirlemekde (2-nji neşir) Joşua Bloch:
    “Hawa, ýene bir zat: finalçylary ulananyňyzda uly jeza bar. Enjamymda ýönekeý zatlary döretmek we ýok etmek wagty takmynan 5,6 nanosekunt.
    Finalizator goşmak wagty 2400 nanosekunta çenli artdyrýar. Başgaça aýdylanda, jemleýji bilen bir obýekt döretmek we ýok etmek takmynan 430 esse haýal. ”

Näme üçin “HashMap” -y köp sapakly gurşawda ulanmaly däl? Bu çäksiz aýlawyň döremegine sebäp bolup bilermi?

HashMapMunuň sinhron däl ýygyndydygyny, sinhronlaşdyrylan kärdeşiniň bardygyny bilýäris HashTable. Şeýlelik bilen, kolleksiýa gireniňizde we ähli sapaklaryň kolleksiýanyň ýekeje mysalyna girip bilýän köp sapakly gurşawda, HashTablehapa okalmazlyk we maglumatlaryň yzygiderliligini üpjün etmek ýaly aç-açan sebäplerden peýdalanmak has ygtybarlydyr. Iň erbet ýagdaýda, köp sapakly gurşaw çäksiz aýlawyň döremegine sebäp bolar. Hawa dogry. HashMap.get()çäksiz aýlawyň döremegine sebäp bolup biler. Geliň, nädip göreli? Usulyň deslapky kodyna seretseňiz HashMap.get(Object key), şuňa meňzeýär:
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)e.nextNäme üçindir özüni görkezip bilýän bolsa, köp sapakly iş gurşawynda elmydama çäksiz aýlawyň pidasy bolup biler . Bu tükeniksiz aýlaw döreder, ýöne e.nextözüni nädip görkezer (ýagny e)? void transfer(Entry[] newTable)Bu ölçegi üýtgedilende çagyrylýan usulda bolup biler HashMap.
do {
    Entry next = e.next;
    int i = indexFor(e.hash, newCapacity);
    e.next = newTable[i];
    newTable[i] = e;
    e = next;
} while (e != null);
Bu kod bölegi, ölçegi başga bir sapagyň karta mysalyny üýtgetmäge synanyşýan bir wagtda ýüze çyksa, çäksiz aýlaw döretmäge ýykgyn edýär HashMap. Bu ssenariýadan gaça durmagyň ýeke-täk usuly, koduňyzda sinhronizasiýa ulanmak, has gowusy, sinhronlaşdyrylan kolleksiýany ulanmak.

Abstraksiýany we encapsulýasiýany düşündiriň. Olar nähili baglanyşykda?

Simpleönekeý sözler bilen aýdylanda , “ Abstraksiýa diňe häzirki görnüş üçin möhüm bolan obýektiň häsiýetlerini görkezýär . ” Obýekte gönükdirilen programmirleme teoriýasynda abstraksiýa işi ýerine ýetirip, ýagdaýyny üýtgedip we habar berip bilýän we ulgamyň beýleki obýektleri bilen "täsirleşip bilýän" abstrakt "aktýorlary" aňladýan obýektleri kesgitlemek ukybyny öz içine alýar. Islendik programmirleme dilindäki abstraksiýa köp tarapdan işleýär. Muny pes derejeli dil buýruklary üçin interfeýsleri kesgitlemek üçin tertipleriň döredilmeginden görmek bolýar. Käbir abstraksiýalar, dizaýn nagyşlary ýaly gurlan abstraksiýalary doly gizläp, programmistiň zerurlyklarynyň umumy görkezilişiniň giňligini çäklendirmäge synanyşýar. Adatça, abstraksiýany iki görnüşde görmek bolýar: Maglumatlaryň abstraksiýasy çylşyrymly maglumat görnüşlerini döretmegiň we maglumatlar modeli bilen täsirleşmek üçin diňe manyly amallary paş etmegiň, şol bir wagtyň özünde ähli durmuşa geçiriş jikme-jikliklerini daşarky dünýäden gizlemegiň usulydyr. Ecutionerine ýetiriş abstraksiýasy ähli möhüm jümleleri kesgitlemek we olary iş bölümi hökmünde paş etmekdir. Adatça käbir işleri etmek üçin usul döredenimizde bu aýratynlygy ulanýarys. Synplaryň içinde maglumatlary we usullary gizlemek (giriş gözegçiligini ulanmak) bilen utgaşdyrmak köplenç encapsulation diýilýär. Netijede häsiýetleri we özüni alyp barşy bilen maglumat görnüşi. Enkapsulýasiýa maglumatlary gizlemegi we durmuşa geçirmegi gizlemegi hem öz içine alýar. "Üýtgedip biljek hemme zady gurşap alyň" . Bu sitata belli dizaýn ýörelgesidir. Şol sebäpli islendik synpda maglumatlaryň üýtgemegi iş wagtynda bolup biler we geljekki wersiýalarynda durmuşa geçiriş üýtgeşmeleri bolup biler. Şeýlelik bilen, encapsulation maglumatlara we ýerine ýetirişe degişlidir. Şonuň üçin olary şeýle baglanyşdyryp bolar:
  • Abstraksiýa esasan synpyň edip biljek zadydyr [Idea ]
  • Enkapsulýasiýa has köp Bu funksiýany nädip gazanmaly?

Interfeýs bilen abstrakt synpyň arasyndaky tapawutlar?

Esasy tapawutlary aşakdaky ýaly sanap bolar:
  • Interfeýs haýsydyr bir usuly amala aşyryp bilmez, ýöne abstrakt synp ýerine ýetirip biler.
  • Bir synp köp interfeýsi amala aşyryp biler, ýöne diňe bir superklas (abstrakt ýa-da abstrakt däl) bolup biler.
  • Interfeýs synp iýerarhiýasynyň bir bölegi däl. Baglanyşyksyz synplar şol bir interfeýsi durmuşa geçirip bilerler.
Rememberatda saklamaly zadyňyz: “Bir düşünjäni“ nädip edýär ”kesgitlemezden“ näme edýär ”manysynda doly suratlandyryp bilseňiz, interfeýs ulanmalysyňyz. Käbir durmuşa geçiriş jikme-jikliklerini goşmaly bolsaňyz, düşünjäňizi abstrakt synpda görkezmeli ". Mundan başga-da, başga bir söz bilen aýdylanda: "bir ýere jemlenip" we bir at bilen suratlandyryp boljak köp synp barmy? Şeýle bolsa, bu atyň ady bilen abstrakt synp dörediň we ondan sapak alyň. Mysal üçin, abstrakt synpdan miras alyp biler Catwe bu abstrakt esasy synp ähli haýwanlaryň şol bir görnüşde ýerine ýetirjek usuly - dem alar . Haýsy işlikler meniň synpymda ulanylyp bilner we başgalara hem ulanylyp bilner? Bu işlikleriň her biri üçin interfeýs dörediň. Mysal üçin, ähli haýwanlar iýip bilerler, şonuň üçin interfeýs dörederin we şol interfeýsi durmuşa geçirerin . Diňe interfeýsi durmuşa geçirmek üçin ýeterlik ( meni halamaga ukyply), ýöne hemmesi däl. Kimdir biri: esasy tapawut, durmuşa geçirilmegiňizi isleýän ýeriňizdir. Interfeýs döredeniňizde, interfeýsi amala aşyrýan islendik synpa geçirip bilersiňiz. Abstrakt synp döretmek bilen, alnan synplaryň ýerine ýetirilişini bir ýerde paýlaşyp bilersiňiz we kod köpeltmek ýaly köp erbet zatlardan gaça durup bilersiňiz. DogAnimalvoid Breathe()IFeedableAnimalDogHorseILikeable

StringBuffer ýady nädip tygşytlaýar?

Synp Stringüýtgewsiz bir obýekt hökmünde amala aşyrylýar, ýagny ilki bilen bir zada bir zat goýmak kararyna geleniňizde String, wirtual maşyn asyl bahanyňyzyň ululygyna kesgitlenen uzynlyk massiwini bölýär. Soňra wirtual maşynyň içindäki hemişelik hökmünde serediler, setiriň bahasy üýtgemese ep-esli gowulaşmagy üpjün eder. Şeýle-de bolsa, setiriň mazmunyny haýsydyr bir görnüşde üýtgetmek kararyna gelseňiz, wirtual maşynyň aslynda asyl setiriň mazmunyny wagtlaýyn giňişlige göçürmek, üýtgetmeler girizmek, şol üýtgeşmeleri täze ýat massiwine ýazdyrmak. Şeýlelik bilen, başlangyçdan soň setiriň bahasyna üýtgeşmeler girizmek gaty gymmat iş. StringBufferbeýleki tarapdan, wirtual maşynyň içinde dinamiki giňelýän massiw hökmünde amala aşyrylýar, bu bar bolan ýat öýjüginde islendik üýtgetme amalynyň bolup biljekdigini we zerur bolanda täze ýadyň bölünjekdigini aňladýar. Şeýle-de bolsa, wirtual maşynyň optimizasiýa etmegi üçin hiç hili ýol ýok StringBuffer, sebäbi mazmuny her hadysada biri-birine gabat gelmeýär.

Näme üçin sapak ýerine Obýekt synpynda garaşmak we habar bermek usullary yglan edilýär?

wait,, Usullar notify, notifyAlldiňe sapaklaryňyzyň umumy çeşmelere girmegini isläniňizde zerurdyr we umumy çeşme üýşmeleňde islendik java obýekti bolup biler. Şeýlelik bilen, bu usullar esasy synpda kesgitlenýär, Objectşonuň üçin her bir obýektiň sapaklara monitora garaşmagyna mümkinçilik berýän dolandyryş bar. Java-da umumy çeşmäni paýlaşmak üçin ulanylýan ýörite obýekt ýok. Şeýle maglumat gurluşy kesgitlenmedi. Şonuň üçin umumy çeşmä öwrülmegi we ,, Objectýaly kömekçi usullary üpjün etmegi başarmak synpyň jogapkärçiligidir . Java, Çarlz Hoaryň monitor ideýasyna esaslanýar. Java-da ähli obýektleriň monitory bar. Saplar monitorlarda garaşýar, şonuň üçin garaşmagy ýerine ýetirmek üçin bize iki parametr gerek: wait()notify()notifyAll()
  • sapak
  • monitor (islendik obýekt).
Java dizaýnynda bir sapagy takyk kesgitläp bolmaýar, elmydama kody ýerine ýetirýän häzirki sapak. Şeýle-de bolsa, monitory kesgitläp bileris (bu usul diýip atlandyryp boljak obýektdir wait). Bu oňat dizaýn, sebäbi başga bir sapagy belli bir monitorda garaşmaga mejbur edip bilsek, paralel programmalary taslamak / programmirlemek kynlaşdyrar "çozuşa" sebäp bolar. Java-da, beýleki sapaklara päsgel berýän ähli amallaryň köne bolandygyny ýadyňyzdan çykarmaň (mysal üçin stop()).

Java-da petik döretmek we düzeltmek üçin programma ýazyň

Java-da deadlock, bu azyndan iki sapagyň dürli çeşmelerde blok saklaýan we ikisi hem beýleki çeşmäniň öz işini ýerine ýetirmek üçin elýeterli bolmagyna garaşýan ýagdaý. Olaryň hiç biri-de saklanýan çeşmede gulp goýup bilmeýär. Java Core.  Söhbetdeşlik üçin soraglar, 2 - 2 bölüm Mysal üçin programma:
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;
		}
	}
}
Aboveokardaky kody işletmek, aç-açan sebäpler bilen petiklener (ýokarda düşündirilýär). Indi bu meseläni çözmeli. Islendik meseläniň çözgüdiniň problemanyň özenidigine ynanýaryn. Biziň ýagdaýymyzda A we B giriş modeli esasy mesele. Şonuň üçin muny çözmek üçin giriş operatorlarynyň tertibini umumy çeşmelere üýtgedýäris. Üýtgeşmeden soň şeýle bolar:
// 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");
			}
		}
	}
};
Bu synpy täzeden işlediň, indi kynçylyklary görmersiňiz. Bu, kynçylyklardan gaça durmaga we olar bilen ýüzbe-ýüz bolsaňyz, olardan dynmaga kömek eder diýip umyt edýärin.

“Serializable” interfeýsini amala aşyrýan synpyňyzda seriallaşdyrylmaýan komponent bar bolsa näme bolar? Muny nädip düzetmeli?

NotSerializableExceptionBu ýagdaýda jeza ýerine ýetirilende zyňylar . Bu meseläni çözmek üçin gaty ýönekeý çözgüt bar - bu gutulary belläň transient. Bu, barlanan meýdanlaryň seriallaşdyrylmajakdygyny aňladýar. Şeýle hem bu meýdanlaryň ýagdaýyny saklamak isleseňiz, eýýäm ýerine ýetirýän salgylanma üýtgeýjilerini göz öňünde tutmaly Serializable. readResolve()Şeýle hem usullary we usullary ulanmagyňyz zerur bolup biler writeResolve(). Gysgaça jemläliň:
  • Ilki bilen, meýdanyňyzy seriýalaýyn däl ediň transient.
  • Ilki bilen writeObject, defaultWriteObjectmeýdan däl ýerleri tygşytlamak üçin sapaga çagyryň transient, soňra seriallaşdyrylmaýan obýektiňiziň aýratyn aýratynlyklaryny seriallaşdyrmak üçin galan usullary çagyryň.
  • Ilki bilen readObject, defaultReadObjectähli däl meýdanlary okamak üçin akymy çagyryň transient, soňra obýektiňizi deserializasiýa etmek üçin başga usullara (goşan usullaryňyza laýyk writeObject) jaň ediň transient.

Java-da wagtlaýyn we üýtgäp durýan açar sözleri düşündiriň

"Açar söz transientseriallaşdyrylmaýan meýdanlary görkezmek üçin ulanylýar." Java dil spesifikasiýasyna görä: Üýtgeýjiler, obýektiň dowamly ýagdaýynyň bir bölegi däldigini görkezmek üçin wagtlaýyn görkeziji bilen bellik edilip bilner. Mysal üçin, beýleki meýdanlardan alnan meýdanlary öz içine alyp bilersiňiz we serializasiýa arkaly ýagdaýyny dikeltmegiň ýerine olary programma taýdan almak has gowudyr. Mysal üçin, bir synpda (re directorissýor) we (stawka) BankPayment.javaýaly meýdanlar seriýalaşdyrylyp bilner we (hasaplanan göterim) deserializasiýa edilenden soň hem islendik wagtda hasaplanyp bilner. Javaadymyzda bolsa, Java-daky her bir sapagyň öz ýerli ýady bar we bu ýerli ýatda okamak / ýazmak amallaryny ýerine ýetirýär. Operationshli amallar ýerine ýetirilenden soň, ähli sapaklaryň üýtgeýjä girýän ýerinden üýtgeýjiniň üýtgedilen ýagdaýyny umumy ýada ýazýar. Adatça, bu wirtual maşynyň içindäki adaty sapak. Theöne üýtgäp durýan üýtgediji wirtual maşyna, şol üýtgeýjä sapagyň elýeterliliginiň hemişe şol üýtgeýjiniň öz nusgasyna ýadyň üýtgeýjisiniň esasy nusgasy bilen laýyk gelmelidigini aýdýar. Diýmek, sapak her gezek üýtgeýjiniň ýagdaýyny okamak islese, içerki ýadyň ýagdaýyny arassalamaly we üýtgeýjini esasy ýatdan täzelemeli. gulpsyz algoritmlerde iň peýdaly. Paýlaşylan maglumatlary üýtgeýän saklaýjyny üýtgewsiz diýip belleýärsiňiz, şol üýtgeýjä girmek üçin gulplary ulanmaýarsyňyz we bir sapak tarapyndan edilen ähli üýtgeşmeler beýlekilere görüner. Ora-da hasaplamalaryň gaýtalanmazlygyny üpjün etmek üçin "bolup geçen-soň" gatnaşyk döretmek isleseňiz, üýtgeşmeleriň hakyky wagtda görünmegini üpjün etmek üçin. Üýtgemeýän zatlary köp sapakly gurşawda ygtybarly neşir etmek üçin ulanylmaly. Meýdanyň beýany, ähli sapaklaryň mydama häzirki salgylanmany görmegini üpjün edýär. principalrateinterestVolatilepublic volatile ImmutableObject

Iterator bilen ListIterator arasyndaky tapawut?

Elementleriň üstünden ulanyp ýa-da Iteratorgaýtalap bileris . Itöne ony diňe elementleriň üstünde gaýtalamak üçin ulanyp bolýar . Beýleki tapawutlar aşakda beýan edilýär. Başararsyňyz: SetListMapListIteratorList
  1. ters tertipde gaýtalaň.
  2. islendik ýerde indeks alyň.
  3. islendik ýere baha goşuň.
  4. häzirki ýagdaýynda islendik bahany belläň.
Okuwyňyz bilen üstünlik arzuw ediň !! Makalanyň awtory Lokesh Gupta Asyl makala Java Core. Söhbetdeşlik soraglary, 1-nji bölüm Java Core. Söhbetdeşlik üçin soraglar, 3-nji bölüm
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION