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: Hansı yaxşı deyil. Bu vəziyyətdə aşağıdakı konstruksiyalardan istifadə etmək daha yaxşıdır:
-
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.
-
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ü .
-
String result = stringOptional.orElseThrow(() -> new CustomException());
Bu vəziyyətdə, Opsiyonel boş olduqda özümüz bir istisna atırıq .
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 ???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.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). 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: Ə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. 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.*;
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() və hashCode() hər zaman cüt-cüt qeyd edildiyini anlamaq üçün aşağıdakı halları nəzərdən keçirin:-
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.
-
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.
-
Ü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.
-
equals() ləğv edilməyib , hashCode() ləğv edilib .
Bu halda, eyni daxili vəziyyətə malik iki fərqli obyekt üçün equals() false və hashCode() eyni dəyərləri qaytaracaq .
Qayda pozuntusu var, ona görə də yanaşma düzgün deyil.
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 .
-
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.
GO TO FULL VERSION