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

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

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

97. Теңдерди кайра аныктоодо келишимди кайра аныктоо шарттары коюлабы?

Overridden equals() методу төмөнкү шарттарга (эрежелерге) ылайык келиши керек:
  • рефлексивдүүлүктү - каалаган x мааниси үчүн, x.equals(x) сыяктуу туюнтма ар дайым чындыкты кайтарышы керек (качан x != null ).

  • симметрия - х жана у ар кандай маанилери үчүн , x.equals(y) түрүндөгү туюнтма y.equals(x) чындыкты кайтарса гана чындыкты кайтарышы керек .

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

  • ырааттуулук - x жана y ар кандай маанилери үчүн , x.equals(y) га кайталанган чалуу, эки an objectти салыштыруу үчүн колдонулган талаалар чалуулардын ортосунда өзгөрбөсө, бул ыкмага мурунку чалуунун маанисин кайтарып берет. .

  • салыштыруу null - каалаган x мааниси үчүн, x.equals(null) чакырылышы false ды кайтарат .

98. Эгерде сиз Equals жана HashCode codeдорун жокко чыгарбасаңыз эмне болот?

Бул учурда, hashCode() берилген an object сакталган эстутумдун жайгашкан жеринин негизинде түзүлгөн санды кайтарат. Башкача айтканда, так бирдей талаалары бар эки an object жокко чыгарылбаган hashCode() чакырганда ар кандай маанилерди алышат (анткени алар ар кандай эстутумдун жерлеринде сакталат). Unverridden equals() шилтемелерди салыштырып, алар бир эле an objectти көрсөтүп же көрсөтпөгөнүн текшерет. Башкача айтканда, салыштыруу == аркылуу жүргүзүлөт жана бирдей талаалары бар an objectилерде ал ар дайым false кайтарып берет . Чындык бир эле an objectке шилтемелерди салыштырганда гана болот. Кээде бул ыкмаларды жокко чыгарбоо логикасы бар. Мисалы, сиз белгилүү бир класстын бардык an objectтеринин уникалдуу болушун каалайсыз жана бул ыкмаларды жокко чыгаруу уникалдуулуктун логикасын гана бузат. Эң негизгиси, жокко чыгарылган жана жокко чыгарылбаган ыкмалардын нюанстарын түшүнүү жана кырдаалга жараша эки ыкманы тең колдонуу.

99. Эмне үчүн симметрия x.equals(y) чындыкты кайтарса гана туура болот?

Бир аз кызык суроо. Эгерде А an objectиси В an objectисине барабар болсо, анда В an objectиси А an objectисине барабар. Эгерде В an objectиси А an objectисине барабар эмес болсо, анда анын карама-каршылыгы кантип мүмкүн болот? Бул жөнөкөй логика. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  11-2-бөлүк

100. HashCodeдеги коллизия деген эмне? аны менен кантип күрөшүү керек?

HashCode кагылышуусу – эки башка an object бирдей hashCode маанисине ээ болгон кырдаал . Бул кантип мүмкүн? Чындыгында, хэшcode бүтүн сан түрүнө окшоштурулган , ал өз кезегинде -2147483648ден 2147483647ге чейинки диапазонго ээ, башкача айтканда, болжол менен 4 миллиард түрдүү бүтүн сандар. Бул диапазон абдан чоң, бирок чексиз эмес. Демек, эки такыр башка an objectиде бирдей хэш-code болгондо жагдайлар болушу мүмкүн. Бул өтө күмөн, бирок мүмкүн. Начар ишке ашырылган хэш-функция ошондой эле окшош хэш-codeдордун жыштыгын жогорулата алат, алар, мисалы, кичинекей диапазондо сандарды кайтарып берет, бул кагылышуу мүмкүнчүлүгүн жогорулатат. Кагылышуу менен күрөшүү үчүн, баалуулуктардын таралышы максималдуу жана баалуулуктарды кайталоо мүмкүнчүлүгү минималдуу болушу үчүн hashCode ыкмасын жакшы ишке ашыруу керек .

101. Эгерде HashCode келишимине катышкан элемент анын маанисин өзгөртсө эмне болот?

Эгерде хэш-codeду эсептөөгө катышкан элемент өзгөртүлгөн болсо, анда an objectтин хеш-codeу өзгөртүлөт (эгерде хэш-функция жакшы болсо). Ошондуктан, HashMapта өзгөрүлгүс (өзгөрүлгүс) an objectтерди ачкыч катары колдонуу сунушталат, анткени алардын ички абалын (талааларын) түзүлгөндөн кийин өзгөртүү мүмкүн эмес. Демек, алардын хэш codeу да түзүлгөндөн кийин айландырылbyte. Эгер сиз өзгөрүлүүчү an objectти ачкыч катары колдонсоңуз, анда бул an objectтин талааларын өзгөрткөндө, анын хэш codeу өзгөрөт жана натыйжада HashMap ичинде бул жупту жоготуп алышыңыз мүмкүн . Анткени, ал баштапкы хэш-code үчүн чакада сакталат жана аны өзгөрткөндөн кийин башка чакадан изделет. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  11-3-бөлүк

102. String аталышынан жана 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;
 }
}
барабар:
  • Биринчиден, биз шилтемелерди түздөн-түз салыштырабыз, анткени шилтемелер бир эле an objectке болсо, текшерүүнү улантуунун эмне кереги бар? Баары чын болот баары бир .

  • null жана класстын түрлөрүнө дал келүү үчүн текшерүү, анткени an object нөлдүн же башка түрдүн аргументи болсо, бул an objectтер бирдей эмес дегенди билдирет - false .

  • Аргумент an objectисин бир түргө чыгаруу (эгерде ал негизги типтеги an object болсо).

  • Примитивдүү класс талаасын салыштыруу (анткени =! аркылуу салыштыруу жетиштүү ), эгерде талаа бирдей болбосо - false .

  • Примитивдик эмес талааны нөл жана барабар үчүн текшерүү ( Сапта ыкма жокко чыгарылат жана туура салыштырылат), эгерде эки талаа тең null же барабар болсо , анда текшерүү бүтөт жана ыкма true кайтарат .

HashCode:
  • Баштапкы хэш-codeдун маанисин an objectтин жашынын примитивине коюу .

  • Учурдагы хэш-codeду 31ге көбөйтүү (чоң жайылуу үчүн) жана ага примитивдүү эмес сап талаасынын хэш codeун кошуу (эгерде ал нөл эмес болсо).

  • Жыйынтыгын кайтаруу.

  • Бул хэш-codeду жокко чыгаруунун натыйжасында, бирдей аталыштагы жана int маанилери бар an objectтер ар дайым бирдей маанини кайтарып беришет.

103. if (obj instanceof Student) менен if (getClass() == obj.getClass()) колдонуунун ортосунда кандай айырма бар?

Келгиле, ар бир ыкма эмне кылаарын карап көрөлү:
  • instanceof сол тарабындагы an object шилтемеси оң жагындагы түрдүн мисалыбы же анын кандайдыр бир түрү экендигин текшерет.

  • getClass() == ... типтин идентификациясын текшерет.

Башкача айтканда, getClass() класстын толук иденттүүлүгүн текшерсе, анда instanceof an object жөн эле субтип болсо да чындыкты кайтарып берет , бул полиморфизмди активдүү колдонууда бизге көбүрөөк ийкемдүүлүктү берет. Чынында, эгер сиз алардын ишинин өзгөчөлүктөрүн түшүнүп, аларды керектүү жерлерде колдонсоңуз, эки ыкма тең жакшы.

104. Clon() методуна кыскача мүнөздөмө бериңиз.

Clone() бул Object классынын ыкмасы , анын максаты учурдагы an objectтин клонун түзүү жана кайтаруу (учурдагы an objectтин көчүрмөсү). Аны колдонуу үчүн 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тин ички талаасында башка an objectке шилтемеси бар болсо, анда бул шилтеме гана клондолот, бирок бул башка an objectтин өзү клондолбойт дегенди билдирет. Чынында, муну алар беттик клондоштуруу деп аташат. Эгер сизге бардык уя салынган an objectтерди клондоо менен толук клондоштуруу керек болсочы? Бул шилтемелердин көчүрмөлөрү эмес, үймөктө башка ээлеген эс тутум клеткалары бар an objectтердин толук кандуу клондору экенине кантип ынануу керек? Чындыгында, бардыгы абдан жөнөкөй - бул үчүн сиз бул ички an objectтердин ар бир классындагы clone() ыкмасын жокко чыгарып , маркер интерфейсин кошушуңуз керек - Cloneable . Андан кийин көчүрүлө турган an objectтерге шилтемелер эмес, an objectтердин өздөрү болот, анткени азыр алар өздөрүн да көчүрүү мүмкүнчүлүгүнө ээ.

Өзгөчө учурлар

106. Ката менен өзгөчөлүктүн айырмасы эмнеде?

Өзгөчө учурлар да, каталар да Throwable классынын субкласстары . Бирок, алардын айырмачылыктары бар. Ката, негизинен, система ресурстарынын жетишсиздигинен улам пайда болгон көйгөйдү көрсөтөт. Ал эми биздин колдонмо көйгөйлөрдүн бул түрлөрүн аныктабашы керек. Каталардын кээ бир мисалдары тутумдун бузулушу жана эстутум катасы. Каталар көбүнчө иштөө убагында пайда болот, анткени алар текшерилбеген типте. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  11-5-бөлүкӨзгөчө жагдайлар иштөө убагында жана компиляция убагында пайда болушу мүмкүн болгон көйгөйлөр. Адатта, бул иштеп чыгуучулар тарабынан жазылган codeдо болот. Башкача айтканда, өзгөчөлүктөр алдын ала айтууга болот жана иштеп чыгуучулар катары бизге көбүрөөк көз каранды. Ошол эле учурда, каталар кокусунан жана бизден көз каранды эмес, тескерисинче, биздин тиркеме иштеп жаткан системанын көйгөйлөрүнөн көз каранды.

107. Текшерилген жана белгиленбеген, өзгөчө, ыргытуу, ыргытуунун айырмасы эмнеде.

Мен жогоруда айткандай, өзгөчөлүк - бул программаны аткаруу учурунда жана компиляция учурунда иштеп чыгуучу жазган codeдо пайда болгон ката (кандайдыр бир анормалдуу кырдаалдан улам). Текшерилген бул өзгөчөлүктүн бир түрү, аны дайыма try-catch механизми аркылуу иштетүү же жогорудагы ыкмаларга ыргытуу керек. Throws ыкмасы менен ыргытылган мүмкүн болгон бөтөнчөлүктөрдү көрсөтүү үчүн методдун аталышында колдонулат. Башкача айтканда, бул жогорудагы ыкмаларга өзгөчө учурларды "ыргытуу" механизми. Текшерилбеген өзгөчөлүктүн түрү, аны иштетүүнү талап кылbyte жана адатта алдын ала айтууга болбойт жана пайда болуу ыктымалдыгы азыраак. Бирок, алар каалаган болсо, кайра иштетorши мүмкүн. Throw өзгөчө учурду кол менен ыргытууда колдонулат, мисалы:
throw new Exception();

108. Өзгөчөлүктөрдүн иерархиясы кандай?

Өзгөчөлүктөрдүн иерархиясы абдан чоң жана кеңири, ал тургай, бул жерде бардыгын айтуу үчүн өтө кеңири. Ошондуктан, биз анын негизги шилтемелерин гана карап чыгабыз: Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  11-6-бөлүкБул жерде иерархиянын эң жогору жагында классты көрөбүз - Throwable - жалпы класс, өзгөчө иерархиянын түпкү атасы, ал өз кезегинде төмөнкүлөргө бөлүнөт:
  • Ката - сын, текшерилгис каталар.
  • Exception - текшерилген өзгөчөлүктөр.
Exception ар кандай текшерилбеген аткаруу убактысынын өзгөчө учурларына жана ар кандай текшерилген өзгөчөлүктөргө бөлүнөт.

109. Белгиленген жана белгиленбеген өзгөчөлүк деген эмне?

Мен мурун айткандай:
  • Текшерилген - сиз кандайдыр бир жол менен чечишиңиз керек болгон өзгөчөлүктөр, башкача айтканда, аларды try - catch блогунда иштетиңиз же жогорудагы ыкмага "алдыга" жөнөтүңүз. Бул үчүн, метод кол тамгасында, метод аргументтерин тизмектегенден кийин, trows <exception type> ачкыч сөзүн колдонушуңуз керек , ал ыкманын колдонуучуларына бул өзгөчөлүктү (эскертүү сыяктуу бир нерсе) ыргыта ала тургандыгын көрсөтүп турат жана бул ыкманын колдонуучулары үчүн өзгөчөлүктү чечүү үчүн жоопкерчorк.

  • Текшерилбеген - компиляция убагында текшерилбегендиктен жана, эреже катары, алдын ала айтууга болбой турган өзгөчөлүктөр. Башкача айтканда, текшерилгенден негизги айырмачылык, алар үчүн бул аракет же ыргытуу механизмдери бирдей иштейт, бирок алар милдеттүү эмес.

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