JavaRush /Java Blogu /Random-AZ /Java tərtibatçısı üçün müsahibələrdən alınan sualların və...

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili. 16-cı hissə

Qrupda dərc edilmişdir
Salam dost! Tərtibatçı olmaq üçün nə qədər vaxt lazımdır? Çox fərqli insanlardan soruşdum və çox fərqli cavablar eşitdim. Bəzi insanlar üçün hətta bir ay kifayət edə bilər, amma bəziləri üçün hətta bir il kifayət etməyəcəkdir. Amma mən dəqiq bilirəm ki, ilkin qabiliyyətlərinizdən asılı olmayaraq, Java proqramçısı olmaq çətin və uzun bir yoldur. Axı inadkarlıq və zəhmət qədər önəmli olan qabiliyyət deyil. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-1-ci hissəBuna görə də, bu gün biz Java tərtibatçıları üçün ən populyar müsahibə suallarını məqsədyönlü şəkildə təhlil etməyə davam edirik. Onları öyrənmək sizi yavaş-yavaş əziz hədəfinizə yaxınlaşdıracaq. Gəlin başlayaq!

17. Könüllülərin uğurlu və uğursuz istifadəsinə misallar göstərin

Tutaq ki, axın vasitəsilə keçdiyimiz müəyyən bir sıra dəyərlərimiz var və nəticədə bəzi Könüllülər əldə edirik :
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
Gözlənildiyi kimi, bu Könüllüdən dəyəri almalıyıq . Sadəcə get() istifadə etmək pis bir yoldur:
String result = stringOptional.get();
Amma bu metodun Könüllüdən dəyəri almaq və bizə qaytarması nəzərdə tutulur? Bu, əlbəttə ki, doğrudur, amma mənası varsa. Yaxşı, axındakı dəyərlər fərqli olsaydı və sonda boş bir Optional aldıqsa, get() metodundan istifadə edərək ondan dəyər almağa çalışdıqda , aşağıdakılar atılacaq: Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-2-ci hissəHansı yaxşı deyil. Bu vəziyyətdə aşağıdakı konstruksiyalardan istifadə etmək daha yaxşıdır:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    Bu halda, elementin Könüllü olaraq olub olmadığını yoxlayırıq . Əgər yoxsa, nəticədə yaranan sətir köhnə dəyərinə malikdir.

  2. String result = stringOptional.orElse("default value");

    Bu halda, biz boş halda yaranan sətirə veriləcək bəzi defolt dəyəri təyin edirik Könüllü .

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    Bu vəziyyətdə, Opsiyonel boş olduqda özümüz bir istisna atırıq .

Bu, məsələn, Spring JPA metodu istifadə edildiyi zaman tətbiqdə rahat ola bilər - findById() , Opsiyonel dəyərləri qaytarır . Bu halda, bu üsulla biz dəyəri götürməyə çalışırıq və əgər orada deyilsə, ExceptionHandler istifadə edərək nəzarətçi səviyyəsində işlənən və 404 - TAPILMADI statusu ilə HTTP cavabına çevrilən bəzi Runtime istisnasını atırıq . Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-3-cü hissə

18. Əsas metodu yekun elan etmək olarmı?

Bəli, əlbəttə ki, heç bir şey bizə main() metodunu final elan etməyə mane olmur . Kompilyator səhvlər yaratmayacaq. Ancaq yadda saxlamaq lazımdır ki, hər hansı bir üsul son olaraq elan edildikdən sonra sonuncu üsul olacaq - ləğv edilməyəcək. Baxmayaraq ki, əsası kim yenidən müəyyənləşdirəcək ??? Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-4-cü hissə

19. Eyni paketi/sinifi iki dəfə idxal etmək mümkündürmü? Nəticələri nə ola bilər?

Bəli sən bacararsan. Nəticələr? Intelijj IDEA-nın boz kimi göstərəcəyi bir neçə lazımsız idxalımız olacaq, yəni. istifadəsiz. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-5-ci hissəJava tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-6 hissə

20. Castinq nədir? ClassCastException nə vaxt əldə edə bilərik?

Yayımlama və ya növ tökmə , bir məlumat növünün digər məlumat növünə çevrilməsi prosesidir: əl ilə (qeyri-müəyyən yayım) və ya avtomatik (açıq tipli yayım). Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-7-ci hissəAvtomatik çevrilmə kompilyator tərəfindən, əl ilə çevrilmə isə tərtibatçı tərəfindən həyata keçirilir. Primitivlər və siniflər üçün tip tökmə bir qədər fərqlidir, buna görə də onları ayrıca nəzərdən keçirəcəyik. İbtidai növlər Primitiv növlərin avtomatik tökmə nümunəsi :
int value = 17;
double convertedValue = value;
Gördüyünüz kimi, burada = işarəsindən başqa əlavə manipulyasiyalara ehtiyac yoxdur. İbtidai növlərin əl tökmə nümunəsi :
double value = 17.89;
int convertedValue = (int)value;
Bu halda, biz (int) istifadə edərək həyata keçirilən əl ilə ötürülməni müşahidə edə bilərik , bununla da vergüldən sonrakı hissə atılacaq və convertedValue dəyəri - 17 olacaq. Primitiv növlərin dökümü haqqında bu məqalədə ətraflı oxuyun . Yaxşı, indi obyektlərə keçək. İstinad növləri İstinad növləri üçün nəsil siniflərdən valideyn siniflərinə avtomatik tökmə mümkündür. Buna polimorfizm də deyilir . Deyək ki, Cat sinfindən miras qalan Lion sinifimiz var . Bu halda, avtomatik çevrilmə belə görünəcək:
Cat cat = new Lion();
Ancaq açıq bir cast ilə hər şey bir qədər daha mürəkkəbdir, çünki primitivlərdə olduğu kimi artıqlığı kəsmək üçün heç bir funksionallıq yoxdur. Və sadəcə formanın açıq şəkildə çevrilməsini edirik:
Lion lion= (Lion)new Cat();
Siz xəta alacaqsınız: Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-8-ci hissəƏslində, siz əvvəlcə Cat sinifində olmayan Lion nəsli sinfinə metodlar əlavə edə və sonra onları çağırmağa cəhd edə bilərsiniz, çünki obyekt tipiniz Lion olacaq . Yaxşı, bunda heç bir məntiq yoxdur. Buna görə də, növün daralması yalnız orijinal obyekt Lion tipli olduqda, lakin sonradan ana sinifə köçürüldükdə mümkündür:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Həmçinin, daha çox etibarlılıq üçün instanceOf konstruksiyasından istifadə edərək obyektlər üçün daralma tövsiyə olunur :
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
Bu məqalədə istinad növü haqqında daha çox oxuyun .

21. Nə üçün müasir çərçivələr əsasən yalnız yoxlanılmamış istisnalardan istifadə edir?

Düşünürəm ki, bütün bunlar ona görədir ki, yoxlanılan istisnalarla işləmək hələ də hər yerdə təkrarlanan, lakin bütün hallarda lazım olmayan spagetti kodudur. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-9-cu hissəBelə hallarda, bunu bir daha tərtibatçıların çiyinlərinə verməmək üçün çərçivə daxilində emal etmək daha asandır. Bəli, əlbəttə ki, fövqəladə vəziyyət yarana bilər, lakin bu eyni yoxlanılmamış istisnalar daha rahat şəkildə, try-catch- də emaldan narahat olmadan və metodlardan keçmədən həll edilə bilər. İstisnanı exceptionHandler -da bəzi HTTP cavabına çevirmək kifayətdir .

22. Statik idxal nədir?

Statik verilənlərdən (metodlar, dəyişənlər) istifadə edərkən siz obyektin özünü yarada bilməzsiniz, lakin bunu sinfin adı ilə həyata keçirə bilərsiniz, lakin bu halda da bizə sinfə keçid lazımdır. Bununla hər şey sadədir: müntəzəm idxaldan istifadə edərək əlavə olunur. Bəs biz sinif adını yazmadan statik metoddan istifadə etsək necə olar ki, bu, cari sinfin statik metodudur? Bu, statik idxalla mümkündür! Bu halda statik import və həmin metoda keçid yazmalıyıq . Bu kimi, məsələn, kosinus dəyərinin hesablanması üçün Riyaziyyat sinfinin statik metodu:
import static java.lang.Math.cos;
Nəticə olaraq, sinif adını göstərmədən metoddan istifadə edə bilərik:
double result = cos(60);
Statik idxaldan istifadə edərək bir sinifin bütün statik üsullarını bir anda yükləyə bilərik:
import static java.lang.Math.*;
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-10-cu hissə

23. hashCode() və equals() metodları arasında hansı əlaqə var?

Oracle- a görə , qayda belədir: Əgər iki obyekt bərabərdirsə (yəni, equals() metodu doğrunu qaytarırsa ), onların eyni hash kodu olmalıdır. Eyni zamanda, iki fərqli obyektin eyni hash kodu ola biləcəyini unutmayın. Niyə equals()hashCode() hər zaman cüt-cüt qeyd edildiyini anlamaq üçün aşağıdakı halları nəzərdən keçirin:
  1. Hər iki üsul ləğv edilir.

    Bu halda , eyni daxili vəziyyətə malik iki fərqli obyekt bərabər olduqda () doğru qayıdacaq , hashCode() isə hər ikisi eyni ədədi qaytaracaq.

    Belə çıxır ki, qaydaya əməl olunur, çünki hər şey qaydasındadır.

  2. Hər iki üsul ləğv edilmir.

    Bu halda, eyni daxili vəziyyətə malik iki fərqli obyekt, equals() olduqda false qaytaracaq , çünki müqayisə == operatoru vasitəsilə aparılır .

    HashCode() metodu yaddaş yeri ünvanının çevrilmiş dəyərini istehsal etdiyi üçün fərqli dəyərlər də qaytaracaq (çox güman ki). Lakin eyni obyekt üçün bu dəyər eyni olacaq, necə ki, bu halda equals() yalnız istinadlar eyni obyektə işarə etdikdə doğru qaytaracaq .

    Belə çıxır ki, bu halda hər şey qaydasındadır və qayda yerinə yetirilir.

  3. Üstündən təyin edilmiş equals() , ləğv edilmiş hashCode() deyil .

    Bu halda, eyni daxili vəziyyətə malik iki fərqli obyekt üçün equals() true , hashCode() isə (çox güman ki) fərqli dəyərləri qaytaracaq .

    Bu qayda pozuntusudur, ona görə də bunu etmək tövsiyə edilmir.

  4. equals() ləğv edilməyib , hashCode() ləğv edilib .

    Bu halda, eyni daxili vəziyyətə malik iki fərqli obyekt üçün equals() falsehashCode() eyni dəyərləri qaytaracaq .

    Qayda pozuntusu var, ona görə də yanaşma düzgün deyil.

Gördüyünüz kimi, qayda yalnız equals()hashCode() funksiyalarının hər ikisi ləğv edildikdə və ya hər ikisi ümumiyyətlə ləğv edilmədikdə icra oluna bilər. Bu məqalədə equals()hashCode()Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-11-ci hissə haqqında ətraflı oxuyun .

24. BufferedInputStream və BufferedOutputStream sinifləri nə vaxt istifadə olunur?

InputStream bəzi resursdan verilənləri bayt-bayt oxumaq üçün, OutputStream isə bayt-bayt məlumat yazmaq üçün istifadə olunur. Lakin bayt-bayt əməliyyatları çox əlverişsiz ola bilər və əlavə emal tələb edə bilər (mətnləri normal oxumaq/yazmaq üçün). Əslində, belə bayt qeydlərini sadələşdirmək üçün BufferedOutputStream təqdim edildi və oxumaq üçün BufferedInputStream təqdim edildi . Bu siniflər verilənləri toplayan buferlərdən başqa bir şey deyildir ki, məlumatlarla bayt-bayt deyil, bütün məlumat paketləri (massivləri) ilə işləməyə imkan verir. Yaradılan zaman BufferedInputStream öz konstruktoruna verilənlərin oxunduğu InputStream tipli nümunəni qəbul edir :
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in konsoldan məlumatları oxuyan InputStream obyektidir . Yəni, bu BufferedInputStream obyektindən istifadə edərək, biz InputStream- dən məlumatları ötürülən massivə yazaraq oxuya bilərik . Bu, InputStream sinifinin bir növ sarğısı olur . Bu misaldakı arr massivi BufferedInputStream -dən məlumat alan massivdir . Bu, öz növbəsində, InputStream- dən məlumatları standart olaraq 2048 bayt olan başqa bir massivlə oxuyur. Eyni şey BufferedOutputStream üçün də keçərlidir: OutputStream növünün nümunəsi konstruktora ötürülməlidir və biz bütün massivlərdə məlumatları yazacağıq:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out məlumatı konsola yazan OutputStream obyektidir . flush() metodu BufferedOutputStream- dən məlumatları prosesdə BufferedOutputStream- i təmizləyərək OutputStream- ə göndərir . Bu üsul olmadan heç nə qeydə alınmayacaq. Və əvvəlki nümunəyə bənzər: arr məlumatların BufferedOutputStream -ə yazıldığı massivdir . Oradan onlar OutputStream- ə standart olaraq 512 bayt ölçüsü olan fərqli massivdə yazılır . Məqalədə bu iki sinif haqqında daha çox oxuyun .

25. Java.util.Collection və java.util.Collections sinifləri arasında fərq nədir?

Kolleksiya kolleksiya iyerarxiyasının rəhbəri olan interfeysdir. O, bütün obyekt qruplarını yaratmağa, ehtiva etməyə və dəyişdirməyə imkan verən sinifləri təqdim edir. Bunun üçün əlavə () , remove() , contain() və başqaları kimi bir çox üsullar təqdim edilmişdir . Collection sinifinin əsas interfeysləri :
  • Dəst sıralanmamış unikal (təkrar etməyən) elementləri ehtiva edən dəsti təsvir edən interfeysdir.

  • Siyahı obyektlərin ardıcıl ardıcıllığını saxlayan məlumat strukturunu təsvir edən interfeysdir. Bu obyektlər öz indekslərini (nömrələrini) alırlar, onlardan istifadə edərək onlarla əlaqə saxlaya bilərsiniz: götürün, silin, dəyişdirin, üzərinə yazın.

  • Queue - FIFO - First In First Out qaydasına əməl edən növbə şəklində elementləri saxlayan məlumat strukturunu təsvir edən interfeysdir .

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-12-ci hissəKolleksiya haqqında ətraflı oxuyun . Kolleksiyalar bir çox müxtəlif kommunal metodları təmin edən bir köməkçi sinifdir. Misal üçün:
  • addAll(Collection<? super T> kolleksiyası, T...element) - T tipli ötürülmüş elementləri kolleksiyaya əlavə edir .

  • copy(List<? super T> dest, List<? extensions T> src) - bütün elementləri src siyahısından destdəki siyahıya köçürür .

  • emptyList() - boş siyahı qaytarır.

  • max(Kolleksiya<? T> kolleksiyasını genişləndirir, Müqayisəçi<? super T> komp) - Müəyyən edilmiş komparator tərəfindən müəyyən edilmiş sıraya uyğun olaraq verilmiş kolleksiyanın maksimum elementini qaytarır.

  • unmodifiableList(Siyahı<? T> siyahısını genişləndirir) - keçmiş siyahının dəyişdirilə bilməyən təqdimatını qaytarır.

Kolleksiyalarda belə bir çox müxtəlif rahat üsullar var . Bu üsulların tam siyahısını Oracle saytındaJava tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-13-cü hissə tapa bilərsiniz . Əbəs yerə deməmişəm ki, onlar rahatdırlar. Axı, onların hamısı statikdir. Yəni hər dəfə bu sinfin obyektini yaratmaq lazım deyil ki, onun üzərində lazımi metodu çağırasan. Sizə sadəcə olaraq sinfin adını daxil etmək, onun üzərində istədiyiniz metodu çağırmaq və bütün tələb olunan arqumentləri vermək lazımdır. Xülasə etmək üçün, Kolleksiya kolleksiyalar çərçivəsinin kök interfeysidir. Collections kolleksiyalar strukturundan bir növə aid olan obyektlərin daha rahat işlənməsi üçün köməkçi sinifdir. Yaxşı, bu gün üçün hamısı. Hər vaxtınız xeyir!Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  16-14-cü hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION