17. Факультативди ийгorктүү жана ийгorксиз колдонууга мисал келтириңиз
Бизде белгилүү бир баалуулуктар сериясы бар дейли, алар аркылуу биз агым аркылуу өтүп, жыйынтыгында кандайдыр бир Кошумчаларды алабыз :Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
.filter(str -> str.length() >= 3)
.findAny();
Биз, күтүлгөндөй, бул Кошумча мааниден алышыбыз керек . Жөн гана get() колдонуу жаман жол:
String result = stringOptional.get();
Бирок бул ыкма Кошумча маанини алып , бизге кайтарып бериши керекпи? Бул, албетте, туура, бирок мааниси бар болсо. Эгер агымдагы баалуулуктар башкача болсо жана аягында биз бош Optional алдык, анда биз get() ыкмасын колдонуп андан маани алууга аракет кылганда , төмөндөгүлөр ыргытылат: Бул жакшы эмес. Бул учурда, төмөнкү конструкцияларды колдонуу жакшы:
-
String result = null; if (stringOptional.isPresent()) { stringOptional.get(); }
Бул учурда, биз элементтин Кошумча болушун текшерип жатабыз . Болбосо, натыйжада сап өзүнүн эски маанисине ээ.
-
String result = stringOptional.orElse("default value");
Бул учурда, биз кандайдыр бир демейки маанини белгилейбиз, ал бош Кошумча болгон учурда пайда болгон сапка берилет .
-
String result = stringOptional.orElseThrow(() -> new CustomException());
Бул учурда, Кошумча бош болгондо, биз өзүбүзчө өзгөчөлүктү таштайбыз .
18. Негизги ыкманы акыркы деп жарыялоого болобу?
Ооба, албетте, эч нерсе бизге main() ыкмасын final деп жарыялоого тоскоолдук кылbyte . Компилятор каталарды чыгарbyte. Бирок аны акыркы деп жарыялагандан кийин ар кандай ыкма акыркы ыкма болуп калаарын эстен чыгарбоо керек - жокко чыгарылbyte. Бирок, ким негизгисин кайра аныктайт ???19. Бир эле пакетти/классты эки жолу импорттоого болобу? Мунун кесепети кандай болушу мүмкүн?
Ооба болот. кесепеттери? Бизде Intelijj IDEA боз түстө көрсөтө турган бир нече керексиз импорт болот, б.а. пайдаланылбаган.20. Кастинг деген эмне? ClassCastException качан ала алабыз?
Кастинг, же типтеги кастинг , бир маалымат түрүн башка маалымат түрүнө айландыруу процесси: кол менен (жашыруун кастинг) же автоматтык түрдө (айкын түрдөгү кастинг). Автоматтык түрдө конвертациялоо компилятор тарабынан, ал эми кол менен өзгөртүү иштеп чыгуучу тарабынан ишке ашырылат. Примитивдер жана класстар үчүн типтүү кастинг бир аз башкача, ошондуктан биз аларды өзүнчө карап чыгабыз. Примитивдик типтер Примитивдик типтерди автоматтык түрдө чыгаруунун мисалы :int value = 17;
double convertedValue = value;
Көрүнүп тургандай, бул жерде = белгисинен башка эч кандай кошумча манипуляциялардын кереги жок. Примитивдүү типтерди кол менен куюунун мисалы :
double value = 17.89;
int convertedValue = (int)value;
Бул учурда, биз кол менен чыгарууну байкай алабыз, ал (int) аркылуу ишке ашырылат , мында үтүрдөн кийинки бөлүк алынып салынат жана convertedValue - 17 маанисине ээ болот. Примитивдик типтерди кастинг жөнүндө көбүрөөк маалымат бул макаладан окуңуз . Эми an objectтерге өтөбүз. Шилтеме түрлөрү Шилтеме түрлөрү үчүн, тукум класстардан ата-эне класстарга автоматтык түрдө чыгаруу мүмкүн. Бул дагы полиморфизм деп аталат . Бизде Cat классынан мураска калган Lion классы бар дейли . Бул учурда, автоматтык өзгөртүү төмөнкүдөй болот:
Cat cat = new Lion();
Бирок ачык-айкын кастинг менен баары бир аз татаалыраак, анткени примитивдер сыяктуу ашыкча нерселерди кесип салуу функциясы жок. Жана жөн гана форманы ачык конversionлоо:
Lion lion= (Lion)new Cat();
Сиз ката аласыз: Чындыгында, сиз Lion тукум классына Cat классында болбогон ыкмаларды кошуп , анан аларды чакырып көрүңүз, анткени an objectиңиздин түрү Lion болуп калат . Ооба, бул жерде эч кандай логика жок. Демек, типти тарытуу баштапкы an object Lion тибинде болгондо гана мүмкүн , бирок кийинчерээк ата-эне класска чыгарылган:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Ошондой эле, көбүрөөк ишенимдүүлүк үчүн, instanceOf конструкциясын колдонуу менен an objectилерди кыскартуу сунушталат :
if (cat instanceof Lion) {
newLion = (Lion)new Cat();
}
Бул макалада маалымдама түрү тууралуу көбүрөөк окуңуз .
21. Эмне үчүн заманбап алHowтар негизинен текшерилбеген өзгөчөлүктөрдү гана колдонушат?
Менин оюмча, мунун баары текшерилген өзгөчөлүктөр менен иштөө дагы эле бардык жерде кайталануучу спагетти codeу болуп саналат, бирок бардык учурларда керек эмес. Мындай учурларда, аны кайра иштеп чыгуучулардын мойнуна өткөрүп албаш үчүн, алHowтын ичинде иштетүү оңой. Ооба, албетте, өзгөчө кырдаал келип чыгышы мүмкүн, бирок ошол эле текшерилбеген өзгөчөлүктөрдү try-catch режиминде иштетүү менен убара болбостон жана методдор аркылуу андан ары өтпөстөн, ыңгайлуураак жол менен чечсе болот . ExionHandler ичинде өзгөчө жагдайды кээ бир HTTP жоопторуна айландыруу жетиштүү .22. Статикалык импорт деген эмне?
Статикалык маалыматтарды (методдор, өзгөрмөлөр) колдонууда сиз an objectтин өзүн түзө албайсыз, бирок аны класстын аты менен жасайсыз, бирок бул учурда да бизге класска шилтеме керек. Аны менен баары жөнөкөй: ал кадимки импорт аркылуу кошулат. Бирок класстын атын жазбастан статикалык методду колдонууга барсакчы, ал учурдагы класстын статикалык методу сыяктуу? Бул статикалык импорт менен мүмкүн! Бул учурда, биз статикалык импортту жана ошол ыкмага шилтемени жазышыбыз керек. Бул сыяктуу, мисалы, косинус маанисин эсептөө үчүн Math классынын статикалык ыкмасы:import static java.lang.Math.cos;
Натыйжада, класстын атын көрсөтпөстөн методду колдоно алабыз:
double result = cos(60);
Биз ошондой эле статикалык импортту колдонуу менен класстын бардык статикалык ыкмаларын бир эле учурда жүктөй алабыз:
import static java.lang.Math.*;
23. hashCode() жана equals() методдорунун ортосунда кандай байланыш бар?
Oracle ылайык , эреже: Эгерде эки an object бирдей болсо (б.а. equals() методу чындыкты кайтарса ), аларда бирдей хэш-code болушу керек. Ошол эле учурда эки башка an objectиде бир эле хэш code болушу мүмкүн экенин унутпаңыз. Эмне үчүн equals() жана hashCode() ар дайым жуптарда жокко чыгарыларын түшүнүү үчүн , төмөнкү учурларды карап көрүңүз:-
Эки ыкма тең жокко чыгарылат.
Бул учурда , бирдей ички абалы менен эки башка an object барабар () болгондо чындыкты кайтарат , ал эми hashCode() экөө тең бирдей санды кайтарат.
Эреже сакталып калгандыктан баары жайында экен.
-
Эки ыкма тең жокко чыгарылbyte.
Бул учурда, бирдей ички абалдары бар эки башка an object, equals() болгондо false кайтарып берет , анткени салыштыруу == оператору аркылуу жүргүзүлөт .
hashCode() ыкмасы да ар кандай маанилерди кайтарат (кыязы), ал эстутум жайгашкан даректин конверттелген маанисин чыгарат. Бирок ошол эле an object үчүн бул маани бирдей болот, бул учурда equals() шилтемелер бир эле an objectти көрсөткөндө гана чындыкты кайтарат .
Көрсө, бул учурда баары жайында болуп, эреже аткарылат экен.
-
Overridden equals() , жокко чыгарылган hashCode() эмес .
Бул учурда, бирдей ички абалы менен эки башка an object үчүн, equals() true кайтарат , ал эми hashCode() ар кандай маанилерди кайтарат (кыязы).
Бул эреженин бузулушу, андыктан муну жасоо сунушталbyte.
-
equals() жокко чыгарылган эмес , hashCode() жокко чыгарылган .
Бул учурда, бирдей ички абалы менен эки башка an object үчүн, equals() false жана hashCode() бирдей маанилерди кайтарат .
Эреже бузуу бар, ошондуктан мамиле туура эмес.
24. BufferedInputStream жана BufferedOutputStream класстары качан колдонулат?
InputStream кээ бир ресурстан берorштерди byte-byte окуу үчүн колдонулат, ал эми OutputStream маалыматтар byte-byte жазуу үчүн колдонулат. Бирок byte-byte операциялары өтө ыңгайсыз болушу мүмкүн жана кошумча иштетүүнү талап кылат (тексттерди кадимкидей окуу/жазуу үчүн). Чынында, мындай byte жазууларын жөнөкөйлөтүү үчүн, BufferedOutputStream киргизилген жана BufferedInputStream окуу үчүн киргизилген . Бул класстар маалыматтар менен byte боюнча эмес, бүтүндөй маалымат пакеттери (массивдер) боюнча иштөөгө мүмкүндүк берүүчү маалыматтарды топтоочу буферлерден башка эч нерсе эмес. Түзүлгөндө, BufferedInputStream өзүнүн конструкторуна InputStream түрүнүн үлгүсүн алат , андан маалыматтар окулат:BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in - консолдон маалыматтарды окуй турган InputStream an objectи. Башкача айтканда, бул BufferedInputStream an objectисин колдонуп, биз InputStreamден берorштерди өткөн массивге жазуу менен окуй алабыз . Бул InputStream классынын бир түрү болуп чыгат . Бул мисалдагы arr массиви BufferedInputStreamден берorштерди кабыл алган массив болуп саналат . Бул, өз кезегинде, InputStreamден маалыматтарды демейки боюнча 2048 byte болгон башка массив менен окуйт. Бул BufferedOutputStream үчүн да ушундай : OutputStream түрүнүн мисалы конструкторго берorши керек , ага биз маалыматтарды бүт массивдерге жазабыз:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out - консолго маалыматтарды жаза турган OutputStream an objectи. flush() методу BufferedOutputStreamден маалыматтарды OutputStreamге жөнөтөт , процессте BufferedOutputStreamди тазалайт . Бул ыкма болбосо, эч нерсе жазылbyte. Жана мурунку мисалга окшош: arr бул BufferedOutputStreamге маалыматтар жазылган массив . Ал жерден алар OutputStreamге башка массивде жазылат , анын демейки боюнча көлөмү 512 byte. Бул эки класс тууралуу кененирээк макаладан окуңуз .
25. Java.util.Collection жана java.util.Collections класстарынын ортосунда кандай айырма бар?
Коллекция – бул коллекция иерархиясынын башчысы болгон интерфейс. Бул an objectтердин бардык топторун түзүүгө, камтууга жана өзгөртүүгө мүмкүндүк берүүчү класстарды киргизет. Бул үчүн көптөгөн ыкмалар каралган, мисалы add() , remove() , contain() жана башкалар. Collection классынын негизги интерфейстери :-
Set – иреттелбеген уникалдуу (кайталанбаган) элементтерди камтыган топтомду сүрөттөгөн интерфейс.
-
Тизме – an objectтердин иреттелген ырааттуулугун сактаган маалымат структурасын сүрөттөгөн интерфейс. Бул an objectтер өздөрүнүн индексин (санын) алышат, анын жардамы менен сиз алар менен иштеше аласыз: алуу, жок кылуу, өзгөртүү, кайра жазуу.
-
Кезек - FIFO - Биринчи In First Out эрежеси боюнча кезекте турган элементтерди сактоочу маалымат структурасын сүрөттөгөн интерфейс .
-
addAll(Collection<? super T> коллекциясы, T...element) - коллекцияга T түрүндөгү өткөн элементтерди кошот .
-
copy(List<? super T> dest, List<? extensions T> src) - бардык элементтерди src тизмеден dest ичиндеги тизмеге көчүрөт .
-
emptyList() - бош тизмени кайтарат.
-
max(Collection<? extensions T> collection, Comparator<? super T> comp) - Берилген коллекциянын максималдуу элементин көрсөтүлгөн компаратор тарабынан көрсөтүлгөн тартипке ылайык кайтарат.
-
unmodifiableList(Тизме<? T> тизмесин кеңейтет) - өткөн тизменин өзгөртүлгүс көрүнүшүн кайтарат.
GO TO FULL VERSION