JavaRush /Java блогы /Random-KK /Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жа...
Константин
Деңгей

Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау. 11-бөлім

Топта жарияланған
Сәлеметсіз бе! Бағысыз ең жылдам кеме де толқындар бойымен қозғалады. Егер сіз қазір менің мақаламды оқып жатсаңыз, сізде міндетті түрде мақсат бар. Ең бастысы, адаспау, өз жолыңмен соңына дейін жүру – Java әзірлеушісі болу. Бүгін мен Java әзірлеушілеріне арналған 250+ сұрақты талдауды жалғастырғым келеді, бұл теориядағы кейбір олқылықтарды жабуға көмектеседі. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 1 бөлім

97. Теңдіктерді қайта анықтау кезінде келісімді қайта анықтау шарттары қойылады ма?

Қайта анықталған equals() әдісі келесі шарттарға (ережелерге) сәйкес болуы керек:
  • рефлексивтілік - кез келген x мәні үшін x.equals(x) сияқты өрнек әрқашан шындықты қайтаруы керек ( x != null болғанда ).

  • симметрия - x және y кез келген мәндері үшін x.equals(y) пішінінің өрнегі тек y.equals(x) шын мәнін қайтарса ғана ақиқат мәнін қайтаруы керек .

  • транзитивтілік - кез келген x , y және z мәндері үшін , егер x.equals(y) ақиқат мәнін қайтарса және y.equals(z) ақиқат мәнін қайтарса , онда x.equals(z) шын мәнін қайтаруы керек .

  • консистенциясы - кез келген x және y мәндері үшін x.equals(y) қайталанатын қоңырау әрқашан екі нысанды салыстыру үшін пайдаланылатын өрістер қоңыраулар арасында өзгермеген жағдайда, осы әдіске алдыңғы шақырудың мәнін қайтарады. .

  • салыстыру null - кез келген x мәні үшін x.equals(null) мәнін шақыру false мәнін береді .

98. Equals және HashCode мәндерін ауыстырмасаңыз не болады?

Бұл жағдайда hashCode() берілген нысан сақталған жад орнына негізделген санды қайтарады. Яғни, дәл сол өрістері бар екі нысан қайта анықталмаған hashCode() шақырған кезде әртүрлі мәндерді алады (ақыр соңында олар әртүрлі жад орындарында сақталады). Қайта анықталмаған equals() сілтемелерді салыстырады, олардың бір нысанды меңзейтінін немесе көрсетпейтінін көреді. Яғни, салыстыру == арқылы жасалады және бірдей өрістері бар нысандар жағдайында ол әрқашан false қайтарады . True бір нысанға сілтемелерді салыстыру кезінде ғана болады. Кейде бұл әдістерді жоққа шығармау логикасы бар. Мысалы, белгілі бір сыныптың барлық нысандарының бірегей болуын қалайсыз және бұл әдістерді жоққа шығару бірегейлік логикасын ғана бұзады. Ең бастысы, қайта анықталған және жоққа шығарылмаған әдістердің нюанстарын түсіну және жағдайға байланысты екі тәсілді де қолдану.

99. Неліктен симметрия тек x.equals(y) ақиқат болса ғана дұрыс болады?

Біртүрлі сұрақ. Егер А an objectісі В an objectісіне тең болса, онда В нысаны А an objectісіне тең. Егер В А an objectісіне тең болмаса, онда керісінше қалай болуы мүмкін? Бұл қарапайым логика. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 2 бөлім

100. HashCode ішіндегі коллизия дегеніміз не? Онымен қалай күресуге болады?

HashCode соқтығысуы екі түрлі нысанның hashCode мәні бірдей болатын жағдай болып табылады . Бұл қалай болады? Мәселе мынада, хэшcode Integer түріне салыстырылады , ол өз кезегінде -2147483648 мен 2147483647 аралығындағы диапазонға ие, яғни шамамен 4 миллиард түрлі бүтін сандар. Бұл ауқым өте үлкен, дегенмен ол шексіз емес. Сондықтан, екі мүлдем басқа нысанда бірдей хэш-code болған жағдайлар мүмкін. Бұл өте екіталай, бірақ мүмкін. Нашар іске асырылған хэш-функция сондай-ақ бірдей хэш-codeтардың жиілігін арттыруы мүмкін, бұл, мысалы, шағын диапазондағы сандарды қайтарады, бұл соқтығысу мүмкіндігін арттырады. Соқтығыспен күресу үшін мәндердің таралуы максималды және мәндердің қайталану мүмкіндігі аз болуы үшін hashCode әдісін жақсы енгізу керек .

101. HashCode келісім-шартына қатысатын элемент оның мәнін өзгертсе не болады?

Егер хэш-codeты есептеуге қатысатын элемент өзгертілсе, онда нысанның хэш-codeының өзі өзгереді (егер хэш функциясы жақсы болса). Сондықтан HashMap -те кілт ретінде өзгермейтін (өзгермейтін) an objectілерді пайдалану ұсынылады, өйткені олардың ішкі күйін (өрістерін) жасалғаннан кейін өзгерту мүмкін емес. Тиісінше, олардың хэш-codeы да жасалғаннан кейін түрлендірілмейді. Кілт ретінде өзгермелі нысанды пайдалансаңыз, онда осы нысанның өрістерін өзгерткен кезде оның хэш codeы өзгереді және нәтижесінде HashMap ішінде бұл жұпты жоғалтуыңыз мүмкін . Өйткені, ол бастапқы хэш-code үшін шелекте сақталады және оны өзгерткеннен кейін ол басқа шелектен ізделеді. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 3 бөлім

102. Жол атауы мен int жас өрістерінен тұратын Student сыныбы үшін Equals және HashCode әдістерін жазыңыз.

public class Student {
int age;
String name;

 @Override
 public boolean equals(final Object o) {
   if (this == o) {
     return true;
   }
   if (o == null || this.getClass() != o.getClass()) {
     return false;
   }

   final Student student = (Student) o;

   if (this.age != student.age) {
     return false;
   }
   return this.name != null ? this.name.equals(student.name) : student.name == null;
 }

 @Override
 public int hashCode() {
   int result = this.age;
   result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
   return result;
 }
}
Тең:
  • Біріншіден, біз сілтемелерді тікелей салыстырамыз, өйткені сілтемелер бір нысанға болса, тексеруді жалғастырудың мәні неде? Бәрібір шындық болады .

  • Нөлді және сәйкес келетін сынып түрлерін тексеру, себебі егер нысан нөлдік немесе басқа түрдегі аргумент болса, бұл нысандар тең емес дегенді білдіреді - false .

  • Аргумент нысанын бір түрге көшіру (егер ол тектік түрдегі нысан болса).

  • Қарапайым класс өрісін салыстыру (ол үшін =! арқылы салыстыру жеткілікті ), егер өріс тең болмаса - жалған .

  • Қарапайым емес өрісті нөл және тең мәндерге тексеру ( Жолда әдіс қайта анықталған және дұрыс салыстырылады), егер екі өріс те null немесе тең болса , тексеру аяқталады және әдіс true мәнін қайтарады .

Хэшcode:
  • Бастапқы хэш-code мәнін нысанның жасы қарабайырына орнату .

  • Ағымдағы хэш-codeты 31-ге көбейту (үлкенірек тарату үшін) және оған қарабайыр емес жол өрісінің хэш codeын қосу (ол бос емес болса).

  • Нәтижені қайтару.

  • Осы хэш-codeты қайта анықтау нәтижесінде аты бірдей және int мәндері бар нысандар әрқашан бірдей мәнді қайтарады.

103. if (obj instanceof Student) және if (getClass() == obj.getClass()) пайдаланудың айырмашылығы неде?

Әрбір тәсілдің не істейтінін қарастырайық:
  • instanceof сол жағындағы нысан сілтемесі оң жағындағы түрдің данасы немесе оның кейбір ішкі түрі екенін тексереді.

  • getClass() == ... түр сәйкестігін тексереді.

Яғни, егер getClass() сыныптың толық сәйкестігін тексерсе, instanceof an object тек ішкі түр болса да ақиқат мәнін қайтарады , бұл полиморфизмді белсенді пайдаланған кезде бізге көбірек икемділік береді. Шын мәнінде, егер сіз олардың жұмысының ерекшеліктерін түсініп, оларды дұрыс жерде қолдансаңыз, екі тәсіл де жақсы.

104. Clon() әдісіне қысқаша сипаттама беріңіз.

Clone() — нысан класының әдісі , оның мақсаты ағымдағы нысанның клонын жасау және қайтару (ағымдағы нысанның көшірмесі). Оны пайдалану үшін CloneableJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 4 бөлім маркер интерфейсін енгізу қажет :
Student implements Cloneable
Және clone() әдісінің өзін қайта анықтаңыз :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Өйткені, Object сыныбында ол қорғалған, яғни ол тек Студент класының өзінде көрінеді , бірақ сырттан сыныптарға көрінбейді.

105. Анықтамалық типтегі an objectінің өрістерімен жұмыс істейтін clone() әдісінің ерекшелігі неде?

Нысандарды клондау кезінде тек қарабайыр мәндер мен нысан сілтемелерінің мәні көшіріледі. Бұл дегеніміз, егер an objectінің ішкі өрісінде басқа нысанға сілтеме болса, онда тек осы сілтеме клондалады, бірақ бұл басқа нысанның өзі клондалмайды. Шын мәнінде, бұл олар бетті клондау деп атайды. Егер сізге барлық кірістірілген нысандарды клондау арқылы толыққанды клондау қажет болса ше? Бұл сілтемелердің көшірмелері емес, үймедегі басқа жад ұяшықтары бар an objectілердің толыққанды клондары екеніне қалай көз жеткізуге болады? Шын мәнінде, бәрі өте қарапайым - бұл үшін сіз осы ішкі нысандардың әрбір класындағы clone() әдісін қайта анықтауыңыз керек және маркер интерфейсін қосуыңыз керек - Cloneable . Содан кейін көшірілетін an objectілерге сілтемелер емес, an objectілердің өздері болады, өйткені қазір олардың өздері де көшіру мүмкіндігі бар.

Ерекшеліктер

106. Қате мен ерекше жағдайдың айырмашылығы неде?

Ерекшеліктер де, қателер де Throwable класының ішкі сыныптары болып табылады . Дегенмен, олардың айырмашылықтары бар. Қате негізінен жүйелік ресурстардың жеткіліксіздігінен туындайтын мәселені көрсетеді. Біздің қосымшамыз мұндай проблемаларды анықтамауы керек. Қателердің кейбір мысалдары жүйенің бұзылуы және жадтың жеткіліксіздігі қатесі болып табылады. Қателер көбінесе орындалу уақытында орын алады, себебі олар тексерілмеген түрге жатады. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 5 бөлімЕрекшеліктер - орындалу уақытында және компиляция уақытында орын алуы мүмкін мәселелер. Әдетте бұл әзірлеушілер жазған codeта орын алады. Яғни, ерекше жағдайларды болжауға болады және әзірлеушілер ретінде бізге көбірек тәуелді. Сонымен қатар, қателер кездейсоқ және бізден тәуелсіз, бірақ біздің қолданба жұмыс істейтін жүйенің өзіне қатысты мәселелерге байланысты.

107. Белгіленген және белгіленбеген, ерекшелік, лақтыру, лақтырудың айырмашылығы неде.

Жоғарыда айтқанымдай, ерекшелік - бұл бағдарламаны орындау кезінде және әзірлеуші ​​​​жазған codeта (кейбір қалыптан тыс жағдайға байланысты) компиляция кезінде орын алған қате. Белгіленген - бұл әрқашан try-catch механизмі арқылы өңделуі немесе жоғарыдағы әдістерге лақтырылуы қажет ерекшелік түрі . Throws әдісі арқылы шығарылатын мүмкін ерекшеліктерді көрсету үшін әдіс тақырыбында пайдаланылады. Яғни, бұл жоғарыдағы әдістерге ерекшеліктерді «лақтыру» механизмі. Белгіленбеген - өңдеуді қажет етпейтін және әдетте болжамдылығы аз және орын алу ықтималдығы аз ерекше жағдай түрі. Дегенмен, қажет болса, оларды өңдеуге де болады. Throw ерекше жағдайды қолмен тастағанда пайдаланылады, мысалы:
throw new Exception();

108. Ерекшеліктер иерархиясы дегеніміз не?

Ерекшеліктердің иерархиясы өте үлкен және ауқымды, тіпті бұл жерде ол туралы бәрін айту үшін тым кең. Сондықтан біз оның тек негізгі буындарын ғана қарастырамыз: Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  11 - 6 бөлімМіне, иерархияның ең жоғарғы жағында біз классты көреміз - Throwable - жалпы класс, ерекшелік иерархиясының атасы, ол өз кезегінде бөлінеді:
  • Қате – сыни, тексерілмейтін қателер.
  • Exception - тексерілген ерекшеліктер.
Ерекшелік әртүрлі тексерілмеген орындау уақытының ерекше жағдайларына және әртүрлі тексерілген ерекшеліктерге бөлінеді.

109. Белгіленген және белгіленбеген ерекше жағдай дегеніміз не?

Мен бұрын айтқанымдай:
  • Белгіленген - сіз қандай да бір жолмен өңдеуіңіз керек ерекшеліктер, яғни оларды try-catch блогында өңдеңіз немесе жоғарыдағы әдіске «алға жіберіңіз». Бұл әрекетті орындау үшін әдіс қолтаңбасында әдіс аргументтерін тізімдегеннен кейін trows <exception type> кілт сөзін пайдалану керек , ол әдіс пайдаланушыларына әдіс осы ерекшелікті (ескерту сияқты нәрсе) тастай алатындығын көрсетеді және осы әдісті пайдаланушыларға қатысты ерекшеліктерді өңдеу жауапкершілігі.

  • Белгіленбеген – өңдеуді қажет етпейтін ерекшеліктер, өйткені олар компиляция уақытында тексерілмейді және, әдетте, болжау мүмкін емес. Яғни, тексерілгеннен басты айырмашылығы олар үшін бұл тырысу немесе лақтыру механизмдері бірдей жұмыс істейді, бірақ олар міндетті емес.

101. Әдістің try-catch блогында ерекше жағдайды ұстау және өңдеу мысалын жазыңыз.

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. Өзіңіздің ерекше жағдайларыңызды пайдаланып, ерекше жағдайды ұстау және өңдеу мысалын жазыңыз

Алдымен, Exception ішінен мұра алатын және оның конструкторын қате туралы хабармен қайта анықтайтын өз ерекшелік сыныбымызды жазайық :
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Ал, біз оны қолмен лақтырып, алдыңғы сұрақтағыдай ұстап аламыз:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Тағы да, оны іске қосқан кезде консольге келесі нәтижені аласыз:
Ой, бірдеңе дұрыс болмады =(
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 7Ерекшеліктер туралы толығырақ мына жерден біле аласыз . Міне, бүгінгі күннің бәрі осы! Келесі бөлімде кездескенше!
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION