JavaRush /Java блогы /Random-KK /Java ядросы. Сұхбатқа арналған сұрақтар, 3 бөлім
Vadim625
Деңгей

Java ядросы. Сұхбатқа арналған сұрақтар, 3 бөлім

Топта жарияланған
Алдыңғы екі мақалада біз сұхбаттарда жиі қойылатын кейбір маңызды сұрақтарды талқыладық. Әрі қарай қозғалып, қалған сұрақтарды қарастыратын кез келді.
Java ядросы.  Сұхбат сұрақтары, 3 - 1 бөлім

Терең көшіру және таяз көшіру

Түпнұсқаның дәл көшірмесі оның клоны болып табылады. Java тілінде бұл бастапқы нысанға ұқсас құрылымы бар нысанды жасау мүмкіндігін білдіреді. Әдіс clone()бұл функцияны қамтамасыз етеді. Таяз көшіру мүмкіндігінше аз ақпарат. Әдепкі бойынша, Java-да клондау таяз, яғни. Object classкөшіріп жатқан сыныптың құрылымы туралы білмейді. Клондау кезінде JVM келесі әрекеттерді орындайды:
  1. Егер сыныпта тек қарабайыр типтердің мүшелері болса, онда нысанның мүлдем жаңа көшірмесі жасалады және сол нысанға сілтеме қайтарылады.
  2. Егер сыныпта тек қарабайыр типтердің мүшелері ғана емес, сонымен қатар кез келген басқа класс түрінің мүшелері болса, онда осы сыныптардың an objectілеріне сілтемелер көшіріледі. Сондықтан екі нысанның да сілтемелері бірдей болады.
Терең көшіру бәрін қайталайды. Терең көшіру – екі жинақ, олардың біреуі түпнұсқа топтаманың барлық элементтерін қайталайды. Көшірменің кез келген элементіне өзгертулер енгізу түпнұсқа жинаққа әсер етпейтіндей көшірме жасағымыз келеді. Терең клондау келесі ережелерді талап етеді:
  1. Қарапайым деректерді бөлек көшірудің қажеті жоқ;
  2. Бастапқы сыныптағы барлық мүше сыныптары клондауды қолдауы керек. super.clone()Әрбір сынып мүшесі үшін әдіс қайта анықталған кезде шақырылуы керек clone();
  3. Егер сыныптың кез келген мүшесі клондауды қолдамаса, онда клондау әдісінде сол сыныптың жаңа данасын жасап, оның әрбір мүшесін барлық атрибуттары бар жаңа сынып нысанына бір-бірден көшіру керек.
Мұнда клондау туралы көбірек біліңіз

Синхрондау дегеніміз не? Нысан деңгейіндегі құлыптау және сынып деңгейіндегі құлыптау?

Синхрондау көп ағынды білдіреді. Синхрондалған code блогын бір уақытта тек бір ағынмен орындауға болады. Java бір уақытта бірнеше ағындарды өңдеуге мүмкіндік береді. Бұл бір өріске қатынасуды қалайтын екі немесе одан да көп ағындарға әкелуі мүмкін. Синхрондау жад ресурстарын дұрыс пайдаланбаған кезде пайда болатын жад қателерін болдырмауға көмектеседі. Әдіс синхрондалған деп жарияланған кезде, ағын өз мониторын ұстайды. Егер басқа ағын осы уақытта синхрондалған әдіске қатынасуға әрекет жасаса, ағын блокталады және монитордың бос болуын күтеді. Java тілінде синхрондау арнайы синхрондалған кілт сөзбен орындалады . Сыныптағы жеке блоктарды немесе әдістерді осылай белгілеуге болады. Синхрондалған кілт сөзді сынып айнымалыларымен немесе атрибуттарымен бірге пайдалану мүмкін емес. Нысан деңгейіндегі құлыптау - бұл класстың берілген данасында code блогын тек бір ағын орындай алатындай, статикалық емес әдісті немесе статикалық емес code блогын синхрондағыңыз келетін механизм. Бұл әрқашан сынып данасы ағынын қауіпсіз ету үшін жасалуы керек. Класс деңгейіндегі құлыптау класстың барлық қолжетімді даналары үшін синхрондалған блокқа бірнеше ағындардың кіруіне жол бермейді. Мысалы, егер DemoClass класының 100 данасы болса, онда тек 1 ағын берілген уақытта айнымалылардың бірін пайдаланып demoMethod() функциясын орындай алады. Бұл әрқашан статикалық жіптің қауіпсіздігін қамтамасыз ету үшін жасалуы керек. Синхрондау туралы қосымша ақпаратты осы жерден алыңыз.

Ұйқы() мен күту() арасындағы айырмашылық неде?

Sleep()процесті бірнеше секундқа кейінге қалдыру үшін қолданылатын әдіс. Жағдайда ағын біз немесе әдісін wait()шақырмайынша күту күйінде болады . Негізгі айырмашылығы - ол құлыпты босатпай, монитор құлпын босатады. көп ағынды қолданбалар үшін пайдаланылады, ағынның орындалуын кідірту үшін ғана пайдаланылады. ағымдағы ағынды белгілі бір уақыт ішінде «Орындалмайтын» күйге қояды. Жіп осы әдіс шақырылғанға дейінгі монитордың күйін сақтайды. Егер басқа жіп шақырса , «ұйықтап қалған» жіп оянады. Бұл статикалық әдіс екенін ескеріңіз, яғни ол әрқашан ағымдағы ағынға әсер етеді (әдісті орындайтын ). Кең таралған қате - басқа ағынның қайда екенін шақыру ; әдісті шақырған ағымдағы ағын ағын болмаса да. ағымдағы ағынды біраз уақытқа "Орындалмайтын" күйге жібереді, дәл сол сияқты , бірақ кейбір нюанстармен. жіпке емес, an objectіге шақырылады; біз бұл нысанды «құлыптау нысаны» деп атаймыз. Қоңырау шалмас бұрын ағымдағы ағын «құлыптау нысанымен» синхрондалу керек; содан кейін ол осы құлыпты босатады және ағынды осы құлыппен байланысты «күту тізіміне» қосады. Кейінірек басқа ағын сол құлыптау нысанымен синхрондауға және . Бұл әдіс әлі күтіп тұрған бастапқы жіпті «оятады». Негізінде, / -мен салыстыруға болады , тек белсенді ағынға ұйықтап жатқан ағынға тікелей көрсеткіш қажет емес, ол тек ортақ құлыптау нысанын білуі керек. Егжей-тегжейлі айырмашылықты мына жерден оқыңыз.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 тілінде тағайындау операторының сол жағы айнымалы болуы керек. «Бұл» әрқашан сыныптың ағымдағы данасын беретін арнайы кілт сөз. Бұл жай ғана айнымалы емес. Сол сияқты, «супер» кілт сөзін немесе кез келген басқа ұқсас кілт сөзді пайдаланып, нөлді айнымалыға тағайындау мүмкін емес.

&& және & арасындағы айырмашылық неде?

&- биттік және &&- логикалық.
  1. &операцияның екі жағын да бағалайды;
  2. &&операцияның сол жағын бағалайды. Егер рас болса, ол оң жағын бағалауды жалғастырады.
Тереңірек түсіну үшін осы жерден іздеңіз.

equals() және hachCode() әдістерін қалай қайта анықтауға болады?

hashCode()және әдістер Java нысандары үшін ата-аналық класс болып табылатын equals()сыныпта анықталады . ObjectОсы себепті барлық Java нысандары әдістер үшін әдепкі іске асыруды иеленеді. Әдіс hashCode()берілген нысан үшін бірегей бүтін санды алу үшін қолданылады. Бұл бүтін сан an objectіні сақтау қажет болғанда an objectінің орнын анықтау үшін пайдаланылады, мысалы HashTable. Әдепкі бойынша, нысан сақталатын жад орны мекенжайының көрінісін hashCode()қайтарады . integerӘдісі equls(), оның аты айтып тұрғандай, екі нысанның тең екендігін тексеру үшін қолданылады. Әдепкі іске асыру нысан сілтемелерін олардың тең екендігін тексеру үшін тексереді. Төменде осы әдістерді қайта жүктеуге арналған маңызды нұсқаулар берілген:
  1. hashCode()және генерациялау кезінде әрқашан бірдей нысан атрибуттарын пайдаланыңыз equals();
  2. Симметрия. Анау. xегер ол кейбір нысандар үшін true мәнін қайтарса y x.equals(y), онда ол y.equals(x)true мәнін қайтаруы керек;
  3. Рефлексивтілік. Кез келген нысан үшін x x.equals(x)true мәнін қайтару керек;
  4. Жүйелілік. Кез келген an objectілер үшін xжәне y x.equals(y)салыстыру кезінде пайдаланылған ақпарат өзгермесе, бірдей нәрсені қайтарады;
  5. Өтпелілік. Кез келген нысандар үшін және x, егер ол true мәнін қайтарса және true мәнін қайтарса, онда ол true мәнін қайтаруы керек;yzx.equals(y)y.equals(z)x.equals(z)
  6. Қолданбаны орындау кезінде бір нысанда әдіс шақырылғанда, пайдаланылған ақпарат өзгермейінше, ол бірдей нөмірді қайтаруы керек. hashCodeәртүрлі қолданбалы даналарда бірдей нысандар үшін әртүрлі мәндерді қайтара алады;
  7. -ге сәйкес екі нысан тең болса equals, онда олар hashCodeбірдей мәндерді қайтаруы керек;
  8. Қарама-қарсы талап міндетті емес. Екі тең емес нысан бірдей хэшcodeты қайтара алады. Дегенмен, өнімділікті жақсарту үшін әртүрлі нысандардың әртүрлі codeтарды қайтаратыны жақсы.
Осы әдістер туралы қызықты фактілерді мына жерден оқыңыз.

Кіру модификаторлары туралы айтып беріңіз

Java сыныптары, өрістері, конструкторлары және әдістері төрт түрлі қатынас модификаторларының біреуіне ие болуы мүмкін: жеке Егер әдіс немесе айнымалы мән private деп белгіленсе , онда тек бір сыныптағы code айнымалыға қол жеткізе алады немесе әдісті шақыра алады. Ішкі сыныптар ішіндегі code айнымалыға немесе әдіске қол жеткізе алмайды, сонымен қатар ол кез келген басқа сыныптан оған қол жеткізе алмайды. Жеке қатынас модификаторы көбінесе конструкторлар, әдістер және айнымалылар үшін пайдаланылады. әдепкі Модификатор мүлде көрсетілмесе, әдепкі қатынас модификаторы жарияланады . Бұл модификатор берілген сыныптың өрістеріне, конструкторларына және әдістеріне қол жеткізуді сыныптың ішіндегі codeпен, бір пакеттегі сыныптар ішіндегі codeпен алуға болатындығын білдіреді. Ішкі сыныптар, егер олар әдепкі деп жарияланған болса, жоғарғы сыныптың әдістеріне және мүше айнымалыларына қол жеткізе алмайды , егер ішкі сынып суперкласспен бір бумада болмаса. protected Қорғалған модификатор әдепкі сияқты жұмыс істейді , тек ішкі сыныптар да суперкласстың қорғалған әдістері мен айнымалыларына қол жеткізе алады. Бұл мәлімдеме ішкі сынып суперкласс сияқты бір пакетте болмаса да дұрыс. public Жалпыға қолжетімді модификатор барлық codeтың сыныпқа, оның айнымалыларына, конструкторларына немесе әдістеріне codeтың қай жерде орналасқанына қарамастан қатынаса алатынын білдіреді. Java ядросы.  Сұхбатқа арналған сұрақтар, 3 - 2 бөлім

Қоқыс жинағыш дегеніміз не? Біз оны шақыра аламыз ба?

Қоқыс жинау Java және NET.Framework тілдері сияқты көптеген заманауи бағдарламалау тілдеріндегі жадты автоматты басқару мүмкіндігі болып табылады. Қоқыс жинауды пайдаланатын тілдер көбінесе JVM сияқты виртуалды машинада қоқыс жинауды түсіндіреді. Қоқыс жинаудың екі мақсаты бар: кез келген пайдаланылмаған жад босатылуы керек, ал егер бағдарлама оны әлі де қолданатын болса, жад босатылмауы керек. Қоқыс жинауды қолмен іске қоса аласыз ба? Жоқ, System.gc()ол сізге мүмкіндігінше қол жеткізуге мүмкіндік береді. Ең жақсы нұсқа - әдісті шақыру System.gc(), ол қоқыс жинаушыға оның іске қосылуы керек екенін көрсетеді. Қоқыс жинағыш анықталмағандықтан, оны бірден іске қосудың жолы жоқ. Сонымен қатар, құжаттамаға сәйкес, OutOfMemoryErrorегер виртуалды машина қоқысты толық жинағаннан кейін жадты босатпаса, ол қайта жіберілмейді. Мұнда қоқыс жинаушы туралы көбірек біліңіз.

Жергілікті кілт сөз нені білдіреді? Егжей-тегжейлі түсіндіріңіз

Жергілікті кілт сөзі әдіс Java файлынан басқа бағдарламалау тілінде жүзеге асырылғанын көрсету үшін қолданылады. Жергілікті әдістер бұрын қолданылған. Java-ның қазіргі нұсқаларында бұл азырақ қажет. Қазіргі уақытта жергілікті әдістер қажет болған жағдайда:
  1. Java тілінен басқа тілде жазылған кітапханаға қоңырау шалу керек.
  2. Сізге тек басқа тіл (әдетте C) арқылы қол жеткізуге болатын жүйелік немесе аппараттық ресурстарға рұқсат қажет. Шын мәнінде, нақты компьютермен әрекеттесетін көптеген жүйелік функцияларды (дискілер немесе желілік деректер сияқты) тек жергілікті әдіспен шақыруға болады.
Жергілікті әдіс кітапханаларын пайдаланудың кемшіліктері де маңызды:
  1. JNI/JNA JVM тұрақсыздануы мүмкін, әсіресе күрделі бірдеңе жасауға тырыссаңыз. Егер сіздің жергілікті әдісіңіз дұрыс емес әрекет жасаса, JVM бұзылу мүмкіндігі бар. Сондай-ақ, егер сіздің жергілікті әдіс бірнеше ағындардан шақырылса, жаман нәрселер болуы мүмкін. Тағыда басқа.
  2. Жергілікті codeпен бағдарламаны жөндеу қиынырақ .
  3. Түпнұсқа code басқа платформаларға тасымалдау кезінде қиындықтар тудыруы мүмкін жақтаулардың бөлек құрылысын талап етеді.

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

Информатикада деректерді сақтау және беру контекстінде сериялау деректер құрылымын немесе an objectінің күйін кейінірек басқа есептеу ортасында сақтауға және алуға болатын пішімге аудару процесі болып табылады. Биттер қатарын алғаннан кейін олар сериялау пішіміне сәйкес қайта есептеледі және бастапқы нысанның семантикалық бірдей клонын жасау үшін пайдаланылуы мүмкін. Java интерфейсті іске асыру үшін нысанды талап ететін автоматты сериялауды қамтамасыз етеді java.io.Serializable. Интерфейсті іске асыру сыныпты «серияланатын» ретінде белгілейді. java.io.Serializable интерфейсінде сериализация әдістері жоқ, бірақ серияланатын сыныпта сериялау/диерализация процесінің бөлігі ретінде шақырылатын әдістерді таңдауға болады. Сыныптарға өзгертулер енгізген кезде олардың қайсысы сериализациямен үйлесімді және сәйкес келмейтінін ескеру қажет. Толық нұсқауларды мына жерден оқи аласыз. Мен ең маңызды ойларды беремін: Үйлесімсіз өзгерістер:
  1. Өрісті жою;
  2. Иерархияда сыныпты жоғары немесе төмен жылжытыңыз;
  3. Статикалық емес өрісті статикалық немесе өтпелі емес өрісті өтпеліге өзгерту;
  4. Мәлімделген қарабайыр деректер түрін өзгерту;
  5. WriteObjectӘдепкі бойынша өрістерді енді ReadObjectжазbyteын немесе оқымайтындай әдісті өзгерту ;
  6. Сыныпты ауыстыру немесе Serializableкерісінше Externalizable;
  7. Есептік сыныпты санаусызға немесе керісінше өзгерту ;
  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