JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 16-бөлүк

Группада жарыяланган
Салам дос! Иштеп чыгуучу болуу үчүн канча убакыт керек? Ар кандай адамдардан сурадым, ар кандай жоопторду уктум. Кээ бир адамдар үчүн бир ай жетиштүү болушу мүмкүн, ал эми кээ бирлери үчүн бир жыл да аздык кылат. Бирок мен Java иштеп чыгуучусу болуу сиздин баштапкы жөндөмүңүзгө карабастан, тикенектүү жана узак жол экенин так билем. Анткени, жөндөмдүүлүк эмес, өжөрлүк жана эмгекчилдик маанилүү. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-1-бөлүкОшондуктан, бүгүн биз Java иштеп чыгуучусу үчүн эң популярдуу интервью суроолорун максаттуу түрдө талдоону улантабыз. Аларды окуп-үйрөнүү акырындык менен сизди асыл максатыңызга жакындатат. Баштайлы!

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() ыкмасын колдонуп андан маани алууга аракет кылганда , төмөндөгүлөр ыргытылат: Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-2-бөлүкБул жакшы эмес. Бул учурда, төмөнкү конструкцияларды колдонуу жакшы:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    Бул учурда, биз элементтин Кошумча болушун текшерип жатабыз . Болбосо, натыйжада сап өзүнүн эски маанисине ээ.

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

    Бул учурда, биз кандайдыр бир демейки маанини белгилейбиз, ал бош Кошумча болгон учурда пайда болгон сапка берилет .

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

    Бул учурда, Кошумча бош болгондо, биз өзүбүзчө өзгөчөлүктү таштайбыз .

Бул, мисалы, Spring JPA ыкмасы колдонулганда, колдонмодо ыңгайлуу болушу мүмкүн - findById() , ал Кошумча маанилерди кайтарат . Бул учурда, бул ыкма менен биз маанини алууга аракет кылабыз жана ал жок болсо, ExceptionHandler аркылуу контроллердин деңгээлинде иштетorп , 404 - NO FOUND статусу менен HTTP жообуна айландырылган Runtime өзгөчөлүктөрүн ыргытабыз . Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-3-бөлүк

18. Негизги ыкманы акыркы деп жарыялоого болобу?

Ооба, албетте, эч нерсе бизге main() ыкмасын final деп жарыялоого тоскоолдук кылbyte . Компилятор каталарды чыгарbyte. Бирок аны акыркы деп жарыялагандан кийин ар кандай ыкма акыркы ыкма болуп калаарын эстен чыгарбоо керек - жокко чыгарылbyte. Бирок, ким негизгисин кайра аныктайт ??? Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-4-бөлүк

19. Бир эле пакетти/классты эки жолу импорттоого болобу? Мунун кесепети кандай болушу мүмкүн?

Ооба болот. кесепеттери? Бизде Intelijj IDEA боз түстө көрсөтө турган бир нече керексиз импорт болот, б.а. пайдаланылбаган. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-5-бөлүкJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-6-бөлүк

20. Кастинг деген эмне? ClassCastException качан ала алабыз?

Кастинг, же типтеги кастинг , бир маалымат түрүн башка маалымат түрүнө айландыруу процесси: кол менен (жашыруун кастинг) же автоматтык түрдө (айкын түрдөгү кастинг). Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-7-бөлүкАвтоматтык түрдө конвертациялоо компилятор тарабынан, ал эми кол менен өзгөртүү иштеп чыгуучу тарабынан ишке ашырылат. Примитивдер жана класстар үчүн типтүү кастинг бир аз башкача, ошондуктан биз аларды өзүнчө карап чыгабыз. Примитивдик типтер Примитивдик типтерди автоматтык түрдө чыгаруунун мисалы :
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();
Сиз ката аласыз: Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-8-бөлүкЧындыгында, сиз 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у болуп саналат, бирок бардык учурларда керек эмес. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-9-бөлүкМындай учурларда, аны кайра иштеп чыгуучулардын мойнуна өткөрүп албаш үчүн, алHowтын ичинде иштетүү оңой. Ооба, албетте, өзгөчө кырдаал келип чыгышы мүмкүн, бирок ошол эле текшерилбеген өзгөчөлүктөрдү try-catch режиминде иштетүү менен убара болбостон жана методдор аркылуу андан ары өтпөстөн, ыңгайлуураак жол менен чечсе болот . ExionHandler ичинде өзгөчө жагдайды кээ бир HTTP жоопторуна айландыруу жетиштүү .

22. Статикалык импорт деген эмне?

Статикалык маалыматтарды (методдор, өзгөрмөлөр) колдонууда сиз an objectтин өзүн түзө албайсыз, бирок аны класстын аты менен жасайсыз, бирок бул учурда да бизге класска шилтеме керек. Аны менен баары жөнөкөй: ал кадимки импорт аркылуу кошулат. Бирок класстын атын жазбастан статикалык методду колдонууга барсакчы, ал учурдагы класстын статикалык методу сыяктуу? Бул статикалык импорт менен мүмкүн! Бул учурда, биз статикалык импортту жана ошол ыкмага шилтемени жазышыбыз керек. Бул сыяктуу, мисалы, косинус маанисин эсептөө үчүн Math классынын статикалык ыкмасы:
import static java.lang.Math.cos;
Натыйжада, класстын атын көрсөтпөстөн методду колдоно алабыз:
double result = cos(60);
Биз ошондой эле статикалык импортту колдонуу менен класстын бардык статикалык ыкмаларын бир эле учурда жүктөй алабыз:
import static java.lang.Math.*;
Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-10-бөлүк

23. hashCode() жана equals() методдорунун ортосунда кандай байланыш бар?

Oracle ылайык , эреже: Эгерде эки an object бирдей болсо (б.а. equals() методу чындыкты кайтарса ), аларда бирдей хэш-code болушу керек. Ошол эле учурда эки башка an objectиде бир эле хэш code болушу мүмкүн экенин унутпаңыз. Эмне үчүн equals() жана hashCode() ар дайым жуптарда жокко чыгарыларын түшүнүү үчүн , төмөнкү учурларды карап көрүңүз:
  1. Эки ыкма тең жокко чыгарылат.

    Бул учурда , бирдей ички абалы менен эки башка an object барабар () болгондо чындыкты кайтарат , ал эми hashCode() экөө тең бирдей санды кайтарат.

    Эреже сакталып калгандыктан баары жайында экен.

  2. Эки ыкма тең жокко чыгарылbyte.

    Бул учурда, бирдей ички абалдары бар эки башка an object, equals() болгондо false кайтарып берет , анткени салыштыруу == оператору аркылуу жүргүзүлөт .

    hashCode() ыкмасы да ар кандай маанилерди кайтарат (кыязы), ал эстутум жайгашкан даректин конверттелген маанисин чыгарат. Бирок ошол эле an object үчүн бул маани бирдей болот, бул учурда equals() шилтемелер бир эле an objectти көрсөткөндө гана чындыкты кайтарат .

    Көрсө, бул учурда баары жайында болуп, эреже аткарылат экен.

  3. Overridden equals() , жокко чыгарылган hashCode() эмес .

    Бул учурда, бирдей ички абалы менен эки башка an object үчүн, equals() true кайтарат , ал эми hashCode() ар кандай маанилерди кайтарат (кыязы).

    Бул эреженин бузулушу, андыктан муну жасоо сунушталbyte.

  4. equals() жокко чыгарылган эмес , hashCode() жокко чыгарылган .

    Бул учурда, бирдей ички абалы менен эки башка an object үчүн, equals() false жана hashCode() бирдей маанилерди кайтарат .

    Эреже бузуу бар, ошондуктан мамиле туура эмес.

Көрүнүп тургандай, эреже equals() жана hashCode() экөө тең жокко чыгарылганда же экөө тең жокко чыгарылбаганда гана аткарылышы мүмкүн. Бул макалада equals() жана hashCode()Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-11-бөлүк тууралуу көбүрөөк оку .

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 эрежеси боюнча кезекте турган элементтерди сактоочу маалымат структурасын сүрөттөгөн интерфейс .

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-12-бөлүкКоллекция жөнүндө көбүрөөк оку . Коллекциялар - бул көптөгөн ар кандай пайдалуу ыкмаларды камсыз кылган пайдалуу класс. Мисалы:
  • 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> тизмесин кеңейтет) - өткөн тизменин өзгөртүлгүс көрүнүшүн кайтарат.

Жыйнактарда мындай көптөгөн ыңгайлуу ыкмалар бар . Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-13-бөлүкБул ыкмалардын толук тизмесин Oracle веб-сайтынан тапса болот . Бекеринен айтпадымбы, алар ыңгайлуу деп. Анткени, алардын баары статикалык. Башкача айтканда, керектүү методду чакыруу үчүн бул класстын an objectисин ар дайым түзүүнүн кажети жок. Сиз жөн гана класстын атын киргизип, ага керектүү ыкманы чакырып, бардык талап кылынган аргументтерди тапшырышыңыз керек. Жыйынтыктап айтканда, Коллекция коллекциялар алкагынын түпкү интерфейси. Коллекциялар – коллекциялардын түзүмүндөгү түргө тиешелүү an objectтерди ыңгайлуураак иштетүү үчүн жардамчы класс. Ооба, бүгүнкү күндө баары ушул. Баарына жакшылык!Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  16-14-бөлүк
Сериядагы башка материалдар:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION