JavaRush /Java Blogu /Random-AZ /Java nüvəsi. Müsahibə üçün suallar, 3-cü hissə
Vadim625
Səviyyə

Java nüvəsi. Müsahibə üçün suallar, 3-cü hissə

Qrupda dərc edilmişdir
Əvvəlki iki məqalədə müsahibələrdə sizə ən çox verilən bəzi vacib sualları müzakirə etdik. Davam etmək və qalan suallara baxmaq vaxtıdır.
Java nüvəsi.  Müsahibə sualları, 3-cü hissə - 1

Dərin surət və dayaz surət çıxarma

Orijinalın dəqiq surəti onun klonudur. Java-da bu, orijinal obyektə oxşar struktura malik obyekt yarada bilmək deməkdir. Metod clone()bu funksiyanı təmin edir. Mümkün qədər az məlumat nüsxələrinin dayaz surətdə çıxarılması. Varsayılan olaraq, Java-da klonlama dayazdır, yəni. Object classsurətini çıxardığı sinfin strukturundan xəbəri yoxdur. Klonlama zamanı JVM aşağıdakıları edir:
  1. Əgər sinifdə yalnız primitiv tiplərin üzvləri varsa, o zaman obyektin tamamilə yeni nüsxəsi yaradılacaq və həmin obyektə istinad qaytarılacaq.
  2. Əgər sinifdə təkcə primitiv tiplərin üzvləri deyil, həm də hər hansı digər sinif tiplərinin üzvləri varsa, bu siniflərin obyektlərinə istinadlar kopyalanır. Beləliklə, hər iki obyekt eyni istinadlara sahib olacaq.
Dərin surət çıxarmaq hər şeyi təkrarlayır. Dərin surət çıxarma iki kolleksiyadır, onlardan biri orijinal kolleksiyanın bütün elementlərini təkrarlayır. Biz elə bir nüsxə yaratmaq istəyirik ki, nüsxənin hər hansı elementinə dəyişiklik edilməsi orijinal kolleksiyaya təsir göstərməsin. Dərin klonlama aşağıdakı qaydaları tələb edir:
  1. Primitiv məlumatları ayrıca köçürməyə ehtiyac yoxdur;
  2. Orijinal sinifdəki bütün üzv sinifləri klonlamağı dəstəkləməlidir. super.clone()Hər bir sinif üzvü üçün metod ləğv edildikdə çağırılmalıdır clone();
  3. Əgər sinfin hər hansı üzvü klonlamağı dəstəkləmirsə, o zaman klonlama metodunda siz həmin sinfin yeni nümunəsini yaratmalı və onun üzvlərinin hər birini bütün atributları ilə bir-bir yeni sinif obyektinə köçürməlisiniz.
Burada klonlaşdırma haqqında daha çox məlumat əldə edin

Sinxronizasiya nədir? Obyekt səviyyəsində kilidləmə və sinif səviyyəsində kilidləmə?

Sinxronizasiya çox iş parçacığına aiddir. Sinxronlaşdırılmış kod bloku eyni anda yalnız bir başlıq tərəfindən icra edilə bilər. Java sizə eyni vaxtda bir neçə mövzunu emal etməyə imkan verir. Bu, iki və ya daha çox mövzunun eyni sahəyə daxil olmaq istəməsi ilə nəticələnə bilər. Sinxronizasiya yaddaş resurslarından düzgün istifadə edilmədikdə yaranan yaddaş xətalarının qarşısını almağa kömək edir. Metod sinxronlaşdırılmış kimi elan edildikdə, ip öz monitorunu saxlayır. Bu zaman başqa mövzu sinxronlaşdırılmış metoda daxil olmağa çalışırsa, ip bloklanır və monitorun boşalmasını gözləyir. Java-da sinxronizasiya xüsusi sinxronlaşdırılmış açar sözlə həyata keçirilir . Sinifinizdə fərdi blokları və ya metodları bu şəkildə qeyd edə bilərsiniz. Sinxronlaşdırılmış açar söz sinif dəyişənləri və ya atributları ilə birlikdə istifadə edilə bilməz. Obyekt səviyyəsində kilidləmə, statik olmayan metodu və ya qeyri-statik kod blokunu sinxronlaşdırmaq istədiyiniz zaman mexanizmdir ki, yalnız bir iplik sinifin verilmiş nümunəsində kod blokunu icra edə bilsin. Bu, həmişə sinif nümunəsinin iş parçasını təhlükəsiz etmək üçün edilməlidir. Sinif səviyyəli kilidləmə, sinifin bütün mövcud nümunələri üçün birdən çox mövzunun sinxronlaşdırılmış bloka daxil olmasının qarşısını alır. Məsələn, DemoClass sinfinin 100 nümunəsi varsa, onda yalnız 1 ip müəyyən bir zamanda dəyişənlərdən birini istifadə edərək demoMethod() funksiyasını yerinə yetirə biləcək. Statik iplik təhlükəsizliyini təmin etmək üçün bu həmişə edilməlidir. Sinxronizasiya haqqında burada ətraflı məlumat əldə edin.

Yuxu () və gözləyin () arasındakı fərq nədir?

Sleep()prosesi bir neçə saniyə gecikdirmək üçün istifadə edilən üsuldur. Və ya metodunu çağırana qədər wait()mövzu gözləmə vəziyyətindədir . Əsas fərq, kilidi buraxmadığı halda monitorun kilidini buraxmasıdır . çox yivli proqramlar üçün istifadə olunur, sadəcə olaraq ipin icrasını dayandırmaq üçün istifadə olunur. cari mövzunu müəyyən bir müddət ərzində "İşlənə bilməz" vəziyyətinə qoyur. Mövzu, bu metod çağırılmadan əvvəl olan monitorun vəziyyətini saxlayır. Başqa bir mövzu zəng edərsə , "yuxuya getmiş" ip oyanacaq. Qeyd edək ki, bu , statik bir üsuldur, yəni həmişə cari ipə təsir göstərir (metodunu icra edən ). Ümumi bir səhv başqa bir mövzunun olduğu yerə zəng etməkdir ; metodu çağıran cari mövzu iplik olmadığı halda belə. cari mövzunu bir müddət "İşlənə bilməz" vəziyyətinə göndərir, eynilə kimi , lakin bəzi nüanslarla. mövzuya deyil, obyektə çağırılır; biz bu obyekti “kilid obyekti” adlandırırıq. Zəng etməzdən əvvəl cari mövzu “kilid obyekti” ilə sinxronlaşdırılmalıdır; bundan sonra bu kilidi buraxır və mövzunu bu kilidlə əlaqəli "gözləmə siyahısına" əlavə edir. Daha sonra başqa bir ip eyni kilid obyekti ilə sinxronizasiya edə və . Bu üsul hələ də gözləyən orijinal ipi "oyandıracaq". Prinsipcə, / ilə müqayisə oluna bilər / , yalnız aktiv ipin yuxu ipinə birbaşa göstəriciyə ehtiyacı yoxdur, yalnız paylaşılan kilid obyektini bilmək lazımdır. Ətraflı fərqi burada oxuyun.notify()notifyAll()wait()sleep()Wait()sleep()Thread.sleep()t.interrupt()sleep()sleep()t.sleep()tsleep()tObject.wait()sleep()Wait()lock.wait()wait()lock.notify()wait()notify()sleep()interrupt()

Buna istinad dəyişəninə null təyin etmək mümkündürmü?

Yox bacarmazsan. Java-da təyinetmə operatorunun sol tərəfi dəyişən olmalıdır. "Bu" həmişə sinfin cari nümunəsini verən xüsusi açar sözdür. Bu, sadəcə hər hansı bir dəyişən deyil. Eyni şəkildə, null “super” açar sözü və ya hər hansı digər oxşar açar sözdən istifadə edərək dəyişənə təyin edilə bilməz.

&& və & arasında fərq nədir?

&- bitwise və &&- məntiqi.
  1. &əməliyyatın hər iki tərəfini qiymətləndirir;
  2. &&əməliyyatın sol tərəfini qiymətləndirir. Doğrudursa, sağ tərəfi qiymətləndirməyə davam edir.
Daha dərindən başa düşmək üçün buraya baxın.

equals() və hachCode() metodlarını necə ləğv etmək olar?

hashCode()və metodlar Java obyektləri üçün ana sinif olan equals()sinifdə müəyyən edilir . ObjectBu səbəbdən bütün Java obyektləri metodlar üçün standart tətbiqi miras alır. Metod hashCode()verilmiş obyekt üçün unikal tam ədəd əldə etmək üçün istifadə olunur. Bu tam ədəd, məsələn, obyektin saxlanması lazım olduqda obyektin yerini müəyyən etmək üçün istifadə olunur HashTable. Varsayılan olaraq, obyektin saxlandığı yaddaş yerinin ünvanının təsvirini hashCode()qaytarır . integerMetod equls(), adından da göründüyü kimi, sadəcə olaraq iki obyektin bərabər olub olmadığını yoxlamaq üçün istifadə olunur. Defolt tətbiq obyekt istinadlarının bərabər olub olmadığını yoxlayır. Aşağıda bu üsulları yenidən yükləmək üçün vacib təlimatlar verilmişdir:
  1. Yaradarkən həmişə eyni obyekt atributlarından istifadə edin hashCode()equals();
  2. Simmetriya. Bunlar. bəzi obyektlər üçün true xqaytarırsa y x.equals(y), o zaman y.equals(x)doğru qaytarmalıdır;
  3. Refleksivlik. Hər hansı bir obyekt üçün x x.equals(x)doğru qayıtmalıdır;
  4. Ardıcıllıq. Hər hansı bir obyekt üçün xy x.equals(y)müqayisələrdə istifadə olunan məlumat dəyişməzsə eyni şeyi qaytarır;
  5. Keçidlilik. İstənilən obyekt üçün x, yz, əgər x.equals(y)o, doğru və y.equals(z)doğrunu qaytarırsa, o zaman x.equals(z)həqiqəti qaytarmalıdır;
  6. Tətbiqin icrası zamanı eyni obyektdə metod çağırıldıqda, istifadə olunan məlumat dəyişməyincə o, eyni nömrəni qaytarmalıdır. hashCodemüxtəlif tətbiq nümunələrində eyni obyektlər üçün fərqli dəyərləri qaytara bilər;
  7. Əgər iki obyekt bərabərdirsə, uyğun olaraq equals, onlar hashCodeeyni dəyərləri qaytarmalıdırlar;
  8. Əks tələb isteğe bağlıdır. İki qeyri-bərabər obyekt eyni hashCode-u qaytara bilər. Bununla belə, performansı yaxşılaşdırmaq üçün fərqli obyektlərin fərqli kodları qaytarması daha yaxşıdır.
Bu üsullar haqqında maraqlı faktları burada oxuyun.

Giriş modifikatorları haqqında bizə məlumat verin

Java sinifləri, sahələri, konstruktorları və metodları dörd müxtəlif giriş modifikatorundan birinə malik ola bilər: özəl Əgər metod və ya dəyişən özəl olaraq qeyd olunubsa , onda yalnız eyni sinif daxilindəki kod dəyişənə daxil ola və ya metodu çağıra bilər. Alt siniflərin daxilindəki kod dəyişənə və ya metoda daxil ola bilməz, nə də başqa sinifdən ona daxil ola bilər. Şəxsi giriş modifikatoru ən çox konstruktorlar, metodlar və dəyişənlər üçün istifadə olunur. default. Əgər dəyişdirici ümumiyyətlə göstərilməyibsə, standart giriş dəyişdiricisi elan edilir. Bu modifikator o deməkdir ki, verilmiş sinfin sahələrinə, konstruktorlarına və metodlarına giriş sinifin özündə kod, eyni paketdəki siniflər daxilində kod vasitəsilə əldə edilə bilər. Alt siniflər supersiniflə eyni paketdə olmadıqda, defolt olaraq elan olunduqları halda, alt siniflər superklassın metodlarına və üzv dəyişənlərinə daxil ola bilməzlər . protected Qorunan modifikator default ilə eyni işləyir , istisna olmaqla, alt siniflər superklassın qorunan metodlarına və dəyişənlərinə də daxil ola bilər. Bu müddəa hətta alt sinif supersiniflə eyni paketdə olmasa belə doğrudur. public İctimai giriş modifikatoru o deməkdir ki, kodun harada yerləşməsindən asılı olmayaraq bütün kodlar sinfə, onun dəyişənlərinə, konstruktorlarına və ya metodlarına daxil ola bilər. Java nüvəsi.  Müsahibə üçün suallar, hissə 3 - 2

Zibil yığan nədir? Ona zəng edə bilərik?

Zibil toplama Java və NET.Framework-dəki dillər kimi bir çox müasir proqramlaşdırma dillərində avtomatik yaddaş idarəetmə xüsusiyyətidir. Zibil kolleksiyasından istifadə edən dillər tez-tez JVM kimi virtual maşında zibil kolleksiyasını şərh edir. Zibil toplamanın iki məqsədi var: hər hansı istifadə olunmamış yaddaş boşaldılmalı və proqram hələ də ondan istifadə edirsə, yaddaş boşaldılmamalıdır. Zibil yığımını əl ilə idarə edə bilərsinizmi? Xeyr, System.gc()bu sizə mümkün qədər çox giriş imkanı verir. Ən yaxşı seçim metodu çağırmaqdır ki System.gc(), bu da zibil kollektoruna işə salması lazım olduğunu göstərir. Zibil toplayıcı qeyri-deterministik olduğundan onu dərhal işə salmağın heç bir yolu yoxdur. Bundan əlavə, sənədlərə əsasən, OutOfMemoryErrorvirtual maşın tam zibil yığıldıqdan sonra yaddaşı boşalta bilməsə, ötürülməyəcək. Burada zibil toplayıcı haqqında daha çox məlumat əldə edin.

Doğma açar söz nə deməkdir? Ətraflı izah edin

Doğma açar sözü metodun Java faylından başqa proqramlaşdırma dilində həyata keçirildiyini göstərmək üçün istifadə olunur. Doğma üsullar keçmişdə istifadə edilmişdir. Java-nın hazırkı versiyalarında buna daha az ehtiyac duyulur. Hal-hazırda yerli metodlara ehtiyac olduqda:
  1. Java-dan başqa dildə yazılmış kitabxanaya zəng etməlisiniz.
  2. Sizə yalnız başqa dildən (adətən C) istifadə etməklə daxil olmaq mümkün olan sistem və ya aparat resurslarına daxil olmaq lazımdır. Əslində, real kompüterlə qarşılıqlı əlaqədə olan bir çox sistem funksiyaları (disklər və ya şəbəkə məlumatları kimi) yalnız yerli metodla çağırıla bilər.
Doğma metod kitabxanalarından istifadənin çatışmazlıqları da əhəmiyyətlidir:
  1. JNI/JNA, xüsusən də mürəkkəb bir şey etməyə cəhd etsəniz, JVM-də sabitliyi poza bilər. Doğma metodunuz səhv bir şey edərsə, JVM-nin çökməsi ehtimalı var. Doğma metodunuz birdən çox mövzudan çağırılsa da, pis şeylər baş verə bilər. Və s.
  2. Doğma kodla proqramda debug etmək daha çətindir .
  3. Doğma kod çərçivələrin ayrıca qurulmasını tələb edir ki, bu da digər platformalara keçiddə problemlər yarada bilər.

Serializasiya nədir?

Kompüter elmində verilənlərin saxlanması və ötürülməsi kontekstində seriallaşdırma verilənlər strukturunun və ya obyektin vəziyyətinin sonradan başqa hesablama mühitində saxlanıla və əldə edilə bilən formata çevrilməsi prosesidir. Bir sıra bitlər alındıqdan sonra onlar seriallaşdırma formatına uyğun olaraq yenidən hesablanır və orijinal obyektin semantik eyni klonunu yaratmaq üçün istifadə edilə bilər. Java avtomatik serializasiyanı təmin edir ki, bu da obyektin interfeysi həyata keçirməsini tələb edir java.io.Serializable. İnterfeys tətbiqi sinfi "seriyalılaşdırıla bilən" kimi qeyd edir. java.io.Serializable interfeysində seriallaşdırma metodları yoxdur, lakin serializasiya sinfi isteğe bağlı olaraq seriallaşdırma/serializasiya prosesinin bir hissəsi kimi çağırılacaq metodları müəyyən edə bilər. Siniflərə dəyişikliklər edərkən, hansıların serializasiya ilə uyğun olub-olmayacağını nəzərə almalısınız. Tam təlimatları burada oxuya bilərsiniz. Ən vacib məqamları verəcəyəm: Uyğun olmayan dəyişikliklər:
  1. Sahəni silin;
  2. İerarxiyada sinfi yuxarı və ya aşağı köçürün;
  3. Qeyri-statik sahəni statikə və ya qeyri-keçici sahəyə keçid;
  4. Elan edilmiş primitiv məlumat növünün dəyişdirilməsi;
  5. Metodun dəyişdirilməsi WriteObjectya ReadObjectonlar artıq standart olaraq sahələri yazmasın və ya oxumasınlar;
  6. Sinfin dəyişdirilməsi və ya Serializableəksinə Externalizable;
  7. Enum sinfinin qeyri-enum sinfinə və ya əksinə dəyişdirilməsi ;
  8. aradan qaldırılması Serializablevə ya Externalizable;
  9. Sinifə metodun writeReplaceəlavə edilməsi .readResolve
Uyğun dəyişikliklər:
  1. Sahələrin əlavə edilməsi;
  2. Siniflərin əlavə edilməsi/çıxarılması;
  3. Metodların əlavə edilməsi WriteObject/ReadObject[üsullar defaultReadObjectvə ya defaultWriteObjectbaşlanğıcda çağırılmalıdır];
  4. aradan qaldırılması üsulları WriteObject/ReadObject;
  5. Əlavə java.io.Serializable;
  6. Sahəyə girişin dəyişdirilməsi;
  7. Statik sahənin qeyri-statikə və ya keçici sahənin qeyri- keçiciyə dəyişdirilməsi .
Əvvəlki hissələrə keçidlər: Java Core. Müsahibə sualları, Java Core hissəsi 1. Müsahibə sualları, 2-ci hissə Orijinal məqalə Xoşbəxt təhsil!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION