JavaRush /Java блогу /Random-KY /Java Core. Интервью үчүн суроолор, 3-бөлүк
Vadim625
Деңгээл

Java Core. Интервью үчүн суроолор, 3-бөлүк

Группада жарыяланган
Мурунку эки макалада биз интервьюларда сизге эң көп берилүүчү кээ бир маанилүү суроолорду талкууладык. Калган суроолорду карап чыгууга убакыт келди.
Java Core.  Интервью суроолору, 3-1-бөлүк

Терең көчүрүү жана тайыз көчүрүү

Түп нусканын так көчүрмөсү анын клону. Java-да бул баштапкы an objectке окшош түзүлүштөгү an objectти түзө алуу дегенди билдирет. Метод clone()бул функцияны камсыз кылат. тайыз көчүрүү мүмкүн болушунча аз маалымат. Демейки боюнча, Java-да клондоо тайыз, б.а. Object classал көчүрүп жаткан класстын түзүмү жөнүндө билбейт. Клондоштурууда JVM төмөнкүлөрдү аткарат:
  1. Эгерде класста жөнөкөй типтердин мүчөлөрү гана болсо, анда an objectтин таптакыр жаңы көчүрмөсү түзүлөт жана ал an objectке шилтеме кайтарылат.
  2. Эгерде класс примитивдүү типтердин мүчөлөрүн гана камтыбастан, башка класс тибинин мүчөлөрүн да камтыса, анда бул класстардын an objectтерине шилтемелер көчүрүлөт. Демек, эки an object тең бирдей шилтемелерге ээ болот.
Терең көчүрүү баарын кайталайт. Терең көчүрүү - бул эки жыйнак, алардын бири түпнуска жыйнактын бардык элементтерин кайталайт. Көчүрмөнүн кандайдыр бир элементине өзгөртүү киргизүү түпнуска жыйнакка таасирин тийгизбей тургандай кылып көчүрмөнү жасагыбыз келет. Терең клондоштуруу төмөнкү эрежелерди талап кылат:
  1. Примитивдүү маалыматтарды өзүнчө көчүрүүнүн кереги жок;
  2. Баштапкы класстагы бардык мүчө класстар клондоштурууну колдошу керек. super.clone()Ар бир класс мүчөсү үчүн метод жокко чыгарылганда чакырылышы керек clone();
  3. Эгерде класстын кайсы бир мүчөсү клондоштурууну колдобосо, анда клондоо методунда сиз ошол класстын жаңы нускасын түзүп, анын ар бир мүчөсүн бардык атрибуттары менен жаңы класс an objectисине бирден көчүрүшүңүз керек.
Бул жерден клондоштуруу жөнүндө көбүрөөк бorңиз

Синхрондоштуруу деген эмне? Объект деңгээлиндеги кулпу жана класс деңгээлиндеги кулпу?

Синхрондоштуруу көп агымды билдирет. Коддун синхрондоштурулган блогу бир эле учурда бир жип тарабынан аткарылышы мүмкүн. Java бир эле учурда бир нече жипти иштетүүгө мүмкүндүк берет. Бул эки же андан көп жиптердин бир талаага кирүүнү каалашына алып келиши мүмкүн. Синхрондоштуруу эс ресурстары туура эмес колдонулганда пайда болгон эстутум каталарынан качууга жардам берет. Метод синхрондоштурулган деп жарыяланганда, жип өзүнүн мониторун кармап турат. Эгерде башка жип учурда синхрондоштурулган ыкмага кирүүгө аракет кылса, жип бөгөттөлүп, монитордун бош болушун күтөт. Java'да синхрондоштуруу атайын синхрондуу ачкыч сөз менен ишке ашат . Сиз классыңыздагы айрым блокторду же методдорду ушинтип белгилей аласыз. Синхрондолгон ачкыч сөздү класстын өзгөрмөлөрү же атрибуттары менен бирге колдонууга болбойт. Объект деңгээлиндеги кулпулоо - бул класстын берилген нускасында бир гана жип code блогун аткарышы үчүн статикалык эмес методду же codeдун статикалык блогун синхрондоштурууну каалаган механизм. Бул класстын үлгү жипти коопсуз кылуу үчүн ар дайым жасалышы керек. Класс деңгээлиндеги кулпулоо класстын бардык жеткorктүү инстанциялары үчүн бир нече жиптердин синхрондоштурулган блокко киришине жол бербейт. Мисалы, эгерде DemoClass классынын 100 нускасы бар болсо, анда 1 жип гана бир убакта өзгөрмөлөрдүн бирин колдонуп demoMethod() аткара алат. Бул дайыма статикалык жип коопсуздугун камсыз кылуу үчүн жасалышы керек. Бул жерде синхрондоштуруу жөнүндө көбүрөөк билүү.

Уйку() менен күтүүнүн() ортосунда кандай айырма бар?

Sleep()процессти бир нече секундага кечиктирүү үчүн колдонулган ыкма. Жагдайда , жип биз же методун wait()чакырмайынча күтүү абалында болот . Негизги айырмасы, ал монитордун кулпусун бошотот, ал эми кулпусун бошотпойт. көп жиптүү тиркемелер үчүн колдонулат, жөн гана жиптин аткарылышын тындыруу үчүн колдонулат. учурдагы жипти белгилүү бир убакытка "Ишке мүмкүн эмес" абалына коет. Жип бул ыкма чакырылганга чейинки монитордун абалын сактайт. Башка жип чакырса , "уктап калган" жип ойгонот. Бул статикалык ыкма экенине көңүл буруңуз, демек, ал ар дайым учурдагы жипке (методду аткаруучу ) таасирин тийгизет. А таралган ката башка жип кайда чакыруу болуп саналат ; методду чакырган учурдагы жип жип эмес болгондо да. учурдагы жипти бир аз убакытка "Чуркоо мүмкүн эмес" абалына жөнөтөт, сыяктуу эле , бирок кандайдыр бир нюанстар менен. жипке эмес, an objectке чакырылган; биз бул an objectти "кулпу an objectи" деп атайбыз. Чалуудан мурун , учурдагы жип "кулпу an objectи" менен синхрондоштуруу керек; Андан кийин, ал бул кулпуну бошотот жана жипти бул кулпу менен байланышкан "күтүү тизмесине" кошот. Кийинчерээк, башка жип ошол эле кулпу an objectиси менен синхрондолуп, . Бул ыкма дагы эле күтүп жаткан оригиналдуу жипти "ойготот". Негизи, / менен салыштырууга болот , бир гана активдүү жип уктап жаткан жипке түз көрсөткүчтүн кереги жок, ал жалпы кулпу an objectисин гана бorши керек. Толук айырманы бул жерден окуңуз.notify()notifyAll()wait()sleep()Wait()sleep()Thread.sleep()t.interrupt()sleep()sleep()t.sleep()tsleep()tObject.wait()sleep()Wait()lock.wait()wait()lock.notify()wait()notify()sleep()interrupt()

Буга шилтеме өзгөрмөсүнө нөл ыйгаруу мүмкүнбү?

Жок болбойт. Java тorнде дайындоо операторунун сол тарабы өзгөрмө болушу керек. "Бул" ар дайым класстын учурдагы инстанциясын берген өзгөчө ачкыч сөз. Бул жөн гана кандайдыр бир өзгөрмө эмес. Ошо сыяктуу эле, null "супер" ачкыч сөзүн же башка ушул сыяктуу ачкыч сөздү колдонуп өзгөрмөгө ыйгарылган эмес.

&& жана & ортосунда кандай айырма бар?

&- биттик жана &&- логикалык.
  1. &операциянын эки тарабына баа берет;
  2. &&операциянын сол жагына баа берет. Эгер чын болсо, оң жагына баа берүүнү улантат.
Тереңирээк түшүнүү үчүн бул жерден издеңиз.

equals() жана hachCode() ыкмаларын кантип жокко чыгарса болот?

hashCode()жана equals()методдор класста аныкталат Object, ал Java an objectилери үчүн аталык класс болуп саналат. Ушул себептен улам, бардык Java an objectтери методдор үчүн демейки ишке ашырууну мурастайт. Метод hashCode()берилген an object үчүн уникалдуу бүтүн санды алуу үчүн колдонулат. Бул бүтүн сан an object сакталышы керек болгондо an objectтин жайгашкан жерин аныктоо үчүн колдонулат, мисалы HashTable. Демейки боюнча, an object сакталган эс тутумдун дарегинин өкүлчүлүгүн hashCode()кайтарат . integerМетод equls(), анын аты айтып тургандай, эки an objectтин бирдей экендигин текшерүү үчүн колдонулат. Демейки ишке ашыруу an object шилтемелеринин бирдей экендигин текшерүү үчүн текшерет. Төмөндө бул ыкмаларды кайра жүктөө үчүн маанилүү көрсөтмөлөр берилген:
  1. hashCode()жана генерациялоодо ар дайым бир эле an object атрибуттарын колдонуңуз equals();
  2. Симметрия. Ошол. xэгерде ал кээ бир an objectтер үчүн чындыкты кайтарса y x.equals(y), анда ал y.equals(x)чындыкты кайтарышы керек;
  3. Рефлексивдүүлүк. Ар бир an object үчүн x x.equals(x)чындыкты кайтаруу керек;
  4. ырааттуулук. Кандайдыр бир an objectилер үчүн xжана y x.equals(y)салыштырууда колдонулган маалымат өзгөрбөсө, ошол эле нерсени кайтарат;
  5. Өтмөлүк. Бардык an objectтер үчүн x, yжана z, эгерде x.equals(y)ал чындыкты кайтарып, y.equals(z)чындыкты кайтарса, анда ал x.equals(z)чындыкты кайтарышы керек;
  6. Колдонмонун аткарылышы учурунда бир эле an objectке метод чакырылганда, колдонулган маалымат өзгөрбөсө, ал ошол эле санды кайтарып бериши керек. hashCodeар кандай колдонуу инстанцияларында окшош an objectтер үчүн ар кандай маанилерди кайтара алат;
  7. Эгерде эки an object бирдей болсо, ылайык equals, анда алар hashCodeбирдей маанилерди кайтарышы керек;
  8. Карама-каршы талап милдеттүү эмес. Эки бирдей эмес an object бир эле hashCode кайтара алат. Бирок, ишти жакшыртуу үчүн, ар кандай an objectтер ар кандай codeдорду кайтарып бергени жакшы.
Бул ыкмалар тууралуу кызыктуу фактыларды бул жерден окуңуз.

Мүмкүнчүлүк өзгөрткүчтөрү жөнүндө айтып бериңиз

Java класстары, талаалары, конструкторлору жана методдору төрт түрдүү кирүү модификаторлорунун бирине ээ болушу мүмкүн: купуя Эгерде метод же өзгөрмө private деп белгиленген болсо, анда бир класстын ичиндеги code гана өзгөрмөгө кире алат же методду чакыра алат. Подкласстардын ичиндеги code өзгөрмөгө же методго кире алbyte, ошондой эле ага башка класстан кире алbyte. Жеке жетүү модификатору көбүнчө конструкторлор, методдор жана өзгөрмөлөр үчүн колдонулат. демейки Демейки кирүү модификатору эгер өзгөртүүчү такыр көрсөтүлбөсө, жарыя кылынат. Бул модификатор берилген класстын талааларына, конструкторлоруна жана методдоруна кирүүнү класстын ичиндеги code менен, ошол эле пакеттеги класстардын ичиндеги code менен алууга болорун билдирет. Эгерде субкласс суперкласс менен бир пакетте болбосо, подкласстар демейки деп жарыяланганда, суперкласстын ыкмаларына жана мүчө өзгөрмөлөрүнө кире алышпайт . protected Корголгон модификатор демейкидей иштейт , бирок кошумча класстар суперкласстын корголгон ыкмаларына жана өзгөрмөлөрүнө кире алат . Бул сөз субкласс суперкласс менен бир пакетте болбосо да туура. public Коомдук жеткorктүүлүк модификатору бардык codeдордун класска, анын өзгөрмөлөрүнө, конструкторлоруна же методдоруна, ал codeдун кайсы жерде жайгашканына карабастан кире ала тургандыгын билдирет. Java Core.  Маектешүү үчүн суроолор, 3-2-бөлүк

Таштанды жыйноочу деген эмне? Биз ага чалсак болобу?

Таштанды чогултуу Java жана NET.Framework тилдеринде сыяктуу көптөгөн заманбап программалоо тилдеринде эстутумду автоматтык башкаруунун өзгөчөлүгү болуп саналат. Таштанды чогултууну колдонгон тилдер көбүнчө JVM сыяктуу виртуалдык машинада таштанды чогултууну чечмелешет. Таштанды чогултуунун эки максаты бар: пайдаланылбаган эстутумду бошотуу керек, ал эми программа аны дагы эле колдонуп жатса, эстутум бошобошу керек. Таштанды чогултууну кол менен иштете аласызбы? Жок, System.gc()бул сизге мүмкүн болушунча көбүрөөк мүмкүнчүлүк берет. System.gc()Эң жакшы вариант - бул таштанды жыйноочуга аны иштетүү керек экенин көрсөткөн методду чакыруу . Таштанды жыйноочу аныкталбагандыктан, аны дароо иштетүүгө эч кандай мүмкүнчүлүк жок. Кошумчалай кетсек, documentтерге ылайык, OutOfMemoryErrorэгер виртуалдык машина таштандыны толук чогулткандан кийин эстутумду бошотпой калса, ал жөнөтүлбөйт. Таштанды жыйноочу жөнүндө көбүрөөк билүү бул жерде.

Түпкү ачкыч сөз эмнени билдирет? майда-чүйдөсүнө чейин түшүндүрүп

Жергorктүү ачкыч сөз ыкма Java файлынан башка программалоо тorнде ишке ашырылганын көрсөтүү үчүн колдонулат. Буга чейин жергorктүү ыкмалар колдонулган. Javaнын учурдагы versionларында бул азыраак талап кылынат. Азыркы учурда, жергorктүү ыкмалар зарыл болгон учурда:
  1. Башка тилде жазылган Java китепканасын чакырышыңыз керек.
  2. Башка тилди (көбүнчө C) колдонуу менен гана кире турган тутумдук же аппараттык ресурстарга кирүү мүмкүнчүлүгүңүз керек. Чынында, чыныгы компьютер менен өз ара аракеттенген көптөгөн системалык функцияларды (мисалы, дисктер же тармактык маалыматтар) жергorктүү ыкма менен гана чакырса болот.
Жергorктүү метод китепканаларды колдонуунун кемчorктери да олуттуу:
  1. JNI/JNA JVMди туруксуздаштырышы мүмкүн, айрыкча, сиз татаал нерсени жасоого аракет кылсаңыз. Эгер сиздин жергorктүү ыкмаңыз туура эмес иш кылса, JVM бузулуп калышы мүмкүн. Ошондой эле, эгер сиздин жергorктүү ыкмаңыз бир нече жиптен чакырылса, жаман нерселер болушу мүмкүн. Жана башка.
  2. Түпкү code менен программаны оңдоо кыйыныраак .
  3. Native code башка платформаларга өткөрүүдө көйгөйлөрдү жаратышы мүмкүн болгон алHowтарды өзүнчө курууну талап кылат.

Сериализация деген эмне?

Информатикада, маалыматтарды сактоо жана берүү контекстинде, сериялаштыруу бул маалымат структурасын же an objectтин абалын кийинчерээк башка эсептөө чөйрөсүндө сакталып, кайра алынуучу форматка которуу процесси. Бир катар биттерди алгандан кийин, алар сериялаштыруу форматына ылайык кайра эсептелинет жана баштапкы an objectтин семантикалык окшош клонун түзүү үчүн колдонулушу мүмкүн. Java автоматтык сериялаштыруу менен камсыз кылат, ал an objectтин интерфейсти ишке ашыруусун талап кылат java.io.Serializable. Интерфейсти ишке ашыруу классты "сериялаштырылуучу" деп белгилейт. Java.io.Serializable интерфейсинде сериалдаштыруу ыкмалары жок, бирок сериализациялануучу класс ыктыярдуу түрдө сериялаштыруу/дисерализация процессинин бир бөлүгү катары чакырыла турган ыкмаларды аныктай алат. Класстарга өзгөртүүлөрдү киргизүүдө, алардын кайсынысы сериалдаштырууга туура келбей турганын карап чыгышыңыз керек. Толук нускамаларды бул жерден окуй аласыз. Мен эң маанилүү пункттарды берем: Шайкеш келбеген өзгөртүүлөр:
  1. Талааны жок кылуу;
  2. Иерархияда классты өйдө же ылдый жылдыруу;
  3. Статикалык эмес талааны статикалыкка же өтмө эмес талаага өзгөртүү;
  4. Жарыяланган алгачкы маалыматтардын түрүн өзгөртүү;
  5. WriteObjectАлар мындан ReadObjectары демейки боюнча талааларды жазбай же окубай тургандай ыкманы өзгөртүү ;
  6. Классты алмаштыруу Serializableже Externalizableтескерисинче;
  7. Enum классын эсепке кирбеген класска өзгөртүү же тескерисинче;
  8. алып салуу Serializableже Externalizable;
  9. Класска метод writeReplaceкошуу .readResolve
Шайкеш өзгөрүүлөр:
  1. талааларды кошуу;
  2. Класстарды кошуу/алып салуу;
  3. Методдорду кошуу WriteObject/ReadObject[методдор defaultReadObjectже defaultWriteObjectбашында чакырылышы керек];
  4. алып салуу ыкмалары WriteObject/ReadObject;
  5. кошумча java.io.Serializable;
  6. Талаа мүмкүнчүлүгүн өзгөртүү;
  7. Статикалык талааны статикалык эмеске же өтмө талааны убактылуу эмеске өзгөртүү .
Мурунку бөлүктөргө шилтемелер: Java Core. Интервью суроолору, 1-бөлүк Java Core. Маектешүү суроолору, 2-бөлүк Түпнуска макала Бактылуу окуу!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION