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

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

Топта жарияланған
Практика немесе теория? Не маңыздырақ? Көбісі, әрине, тәжірибе маңыздырақ екенін айтады. Мысалы, мүмкіндігінше тырысыңыз және сіз бақытты боласыз. Мен мұнымен келіспеуге батылым бар. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8-1 бөлімСұхбат кезінде сіздің тәжірибеде қаншалықты жақсы екеніңізді ешкім білмейді. Сізден теорияға сәйкес толық көлемде сұралады. Содан кейін ғана сіз сұхбаттардың барлық турларынан өтіп, жобаға кірген кезде практикалық дағдыларыңызды пайдаланасыз. Сіз қарсы болуыңыз мүмкін: кейде олар сізге тест тапсырмасын береді және әлі де тәжірибе қажет. Мен дауламаймын, олар кейде беріледі, бірақ істің мәні КЕЙДЕ, бірақ теориялық сұхбат ӘРҚАШАН орын алады. Сіз айырмашылықты сезінесіз бе? Сондықтан, сіздердің табандарыңыздың астында берік теориялық іргетас болуы керек, оны біз бүгін де нығайта береміз. Атап айтқанда, сұхбат кезінде жиі қойылатын сұрақтарды талдауды жалғастырамыз .

71. Enum үшін toString() әдісін қайта анықтамасақ не болады?

Бізде келесі нөмір бар делік :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Консольде студентті оған toString() шақыру арқылы көрсетейік :
System.out.println(Role.STUDENT.toString());
Консольдегі нәтиже:
СТУДЕНТ
Яғни, әдепкі бойынша, enum үшін toString() тұрақтының өзі болып табылады.

72. Enum ішінде конструкторды көрсетуге болады ма?

Иә, әрине. Ішкі enum айнымалы мәндерінің мәндері конструктор арқылы орнатылады. Мысал ретінде, әрбір рөл үшін жас ауқымын көрсету үшін алдыңғы нөмірге екі өрісті қосамыз - ageFrom және ageTo -:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. == және equals() арасындағы айырмашылық неде?

Бұл Java әзірлеушілерімен сұхбаттасудың ең көп тараған сұрақтарының бірі. Қарапайым мәндерді ( int , char , double ...) салыстырған кезде біз оны == арқылы жасаймыз , өйткені айнымалылар нақты мәндерден тұрады және біз оларды салыстыра аламыз. Ал қарабайыр айнымалылар толыққанды нысандар емес - олар Object- дан мұра алмайды және equals() әдісі жоқ . Нысандарға сілтеме жасайтын айнымалы мәндерді салыстыру туралы айтатын болсақ, == тек сілтемелердің мәнін салыстырады - олар бір нысанға сілтеме жасай ма, жоқ па. Тіпті бір нысан екіншісімен бірдей болса да, == арқылы салыстыру теріс нәтиже береді ( false ), себебі бұл басқа нысан. Түсінгеніңіздей, equals() әдісі анықтамалық айнымалы мәндерді салыстыру үшін пайдаланылады . Бұл an objectілерді толық салыстыру үшін қажет Object класының стандартты әдістерінің бірі . Бірақ бірден нақтылаған жөн: бұл әдіс дұрыс жұмыс істеуі үшін осы сыныптың an objectілерін қалай салыстыру керектігін жазу арқылы оны қайта анықтау керек. Әдісті қайта анықтамасаңыз, әдепкі бойынша ол нысандарды == арқылы салыстырады . IntelliJ IDEA жүйесінде оны автоматты түрде қайта анықтауға болады (IDEA құралдарын пайдалану) -> alt + insert , пайда болған терезеде equals() және hashCode() таңдаңыз -> қай сынып өрістері қатысу керектігін таңдаңыз -> және voila, автоматты түрде орындау әдістері аяқталды. Мұнда екі өрісі бар қарапайым Cat класы үшін автоматты түрде жасалатын теңдеу әдісі қалай көрінетінінің мысалы келтірілген - 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 Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
Егер == және enums үшін тең арасындағы айырмашылық туралы айтатын болсақ , онда ол көп емес. Өйткені, enum тұрақты мәндерді сақтайды, тіпті == көмегімен ұқсас мәндерді салыстырған кезде де біз true аламыз , өйткені сілтемелер әрқашан бірдей нысандарға арналған. Сонымен, теңдерді пайдаланған кезде біз функционалдылықты да дұрыс өңдейміз, әсіресе enum үшін equals әдісінің денесіне кірсеңіз, Enum сыныбында әдісті іске асыру келесідей екенін көресіз : Яғни, ішінде - сілтеме бойынша жақсы ескі салыстыру! Қорытындылау үшін: enum үшін == және тең арқылы салыстыру дұрыс.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8-2 бөлімJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 3 бөлімJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 4 бөлім

74. Enum-да ordinal() әдісі не істейді?

Enum элементінде int ordinal() әдісін шақырған кезде біз санаулардың жалпы қатарындағы осы мәннің нөлінен реттік санды аламыз. Бұл әдісті талқыланған алдыңғы нөмірдің бір элементінде қолданайық - Role :
System.out.println(Role.DIRECTOR.ordinal());
Тиісінше, консоль келесіні көрсетеді:
2

75. Java тілінде TreeSet немесе TreeMap көмегімен Enum пайдалану мүмкін бе?

TreeSet және TreeMap ішіндегі санау түрлерін пайдалануға рұқсат етілген. Және біз жаза аламыз:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
Ал консоль келесіні көрсетеді:
СТУДЕНТ МҰҒАЛІМІ ДИРЕКТОР ҚАУІПСІЗДІК_САҚТАЛУЫ
Біз шығысты алфавиттік ретпен емес алдық. Мәселе мынада, егер TreeSet мәндері үшін enum элементтерін немесе TreeMap үшін кілттер ретінде пайдалансақ , элементтер табиғи ретімен сұрыпталады (олар enum ішінде көрсетілген ретпен ). Бұл мүмкіндіктерді түсіну бізге жақсырақ code жазуға көмектеседі.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 5 бөлім

76. Enum жүйесінде ordinal() және compareTo() әдістері қалай байланысты?

Жоғарыда айтылғандай, ordinal() жалпы тізімдер тізіміндегі мәннің реттік нөмірін қайтарады. Сондай-ақ, алдыңғы сұрақты талдау кезінде сіз санау элементтері бір рет, мысалы, TreeSet (сұрыпталған жиын) ішінде enum ішінде жарияланған ретті қабылдайтынын көрдіңіз . Біз білетіндей, TreeSet және TreeMap элементтерді Comparable интерфейсінің compareTo() әдісіне шақыру арқылы сұрыптайды . Бұдан біз Enum класы Comparable интерфейсін жүзеге асырады деп болжауға болады , оны салыстыруTo() әдісінде жүзеге асырады , оның ішінде сұрыптау ретін орнату үшін ordinal() пайдаланылады. Enum класына енгеннен кейін біз мұны растауды көреміз: Ал әдістің өзі: ordinal() әдісі мұнда шақырылмайды. Оның орнына реттік айнымалы қолданылады - тізімдегі элементтің реттік нөмірі. ordinal() әдісінің өзі реттік айнымалы үшін алушыдан басқа ештеңе емес .Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 6 бөлімJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8-7 бөлімJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 8 бөлім

77. EnumM мысалын жазыңыз

Жоғарыда талқыланған сұрақтарда мен нөмірлердің мысалдарын келтірдім және codeты қайталаудың мәнін көрмеймін (мысалы, enum ішіндегі конструктор туралы № 72 сұрақ).

78. Enum-ды коммутатор жағдайында қолдануға болады ма?

Бұл мүмкін және қажет! Өз тәжірибеме қарап, мен enum пайдаланудың ең көп таралған орындарының бірі switch сияқты логикалық конструкциялар екенін байқадым . Бұл жағдайда сіз case барлық мүмкін нұсқаларын бере аласыз және логиканы жазғаннан кейін барлық нөмір мәндері үшін - әдепкі операторды пайдалану тіпті қажет болмауы мүмкін! Өйткені, егер сіз String немесе int түріндегі сандық мәнді пайдалансаңыз, күтпеген мәнді алуыңыз мүмкін, бұл өз кезегінде enum көмегімен мүмкін емес . Бұрын талқыланған мысал үшін қосқыш қандай болады :
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

79. Enum данасында барлық қолжетімді мәндерді қалай алуға болады?

Егер нөмірдің барлық даналарын алу қажет болса, белгілі бір нөмірдің барлық қол жетімді мәндерінің массивін табиғи ретпен қайтаратын values() әдісі бар (олар enum ішінде көрсетілген ретпен ). Мысалы:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Консоль келесі нәтижені көрсетеді:
СТУДЕНТ МҰҒАЛІМІ ДИРЕКТОР ҚАУІПСІЗДІК_САҚТАЛУЫ

Stream API

80. Java тіліндегі Stream дегеніміз не?

Java Stream - бұл деректер ағынымен өзара әрекеттесудің салыстырмалы түрде жаңа тәсілі, ол өз кезегінде үлкен деректерді ыңғайлы және ықшам өңдеуге мүмкіндік береді, сонымен қатар белгілі бір ағындар саны арасында деректерді өңдеуді параллельді түрде пайдалануда өнімділікті арттырады. функционалдылық. Бұл тақырыпты қысқаша тереңірек талқылау мүмкін емес, сондықтан мен мұнда осы тақырыпқа енуге көмектесетін мақаланың сілтемесін қалдырамын.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8 - 9 бөлім

81. Мәмілелердің негізгі қасиеттері қандай?

Тақырып Stream API деп аталады, бірақ мәселе транзакция туралы. Хмм... Алдымен транзакцияның не екенін анықтап алайық. Транзакция – бұл деректермен жұмыс істеудің логикалық бірлігін білдіретін дәйекті дерекқор операцияларының тобы. Мәліметтер тұтастығын сақтай отырып және параллель орындалатын басқа транзакцияларға тәуелсіз транзакция толығымен және сәтті аяқталуы мүмкін немесе оны мүлдем аяқтау мүмкін емес, бұл жағдайда оның ешқандай әсері болмайды. Сонымен, транзакциялардың төрт негізгі қасиеті бар, олар қысқаша ACID деп аталады . Осы аббревиатураның әрбір әрпі қалай тұратынын қарастырайық: A - Atomicity - atomicity - бұл қасиет жүйеде ешқандай транзакцияның ішінара жазылмайтынына кепілдік береді. Оның барлық қосалқы операциялары орындалады немесе ешқайсысы орындалмайды ( барлығы немесе ештеңесі ). C – Consistency – консистенциясы – әрбір сәтті транзакция тек жарамды нәтижелерді жазуды қамтамасыз ететін қасиет. Яғни, бұл транзакция сәтті болған жағдайда жүйе нақты деректерге қоятын барлық ережелер мен шектеулер орындалатынына кепілдік, әйтпесе транзакция аяқталмайды және жүйедегі деректер бұрынғыға оралады. күй. I – Оқшаулау – оқшаулау – транзакцияны орындау кезінде параллельді операциялар оның нәтижесіне әсер етпеуі керек екенін айтатын қасиет. Бұл сипат ресурсты көп қажет етеді, сондықтан ол әдетте оқшаулаудың белгілі бір мәселелерін шешетін белгілі бір оқшаулау деңгейлеріне рұқсат беру арқылы ішінара жүзеге асырылады. Бұл туралы келесі сұрақта толығырақ қарастырамыз. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  8-10 бөлімD - Төзімділік - бұл қасиет пайдаланушы жүйеден транзакцияның аяқталғаны туралы растауды алса, ол қандай да бір сәтсіздікке байланысты ол жасаған өзгерістердің жойылмайтынына сенімді болуын қамтамасыз етеді. Яғни, транзакцияның сәтті аяқталғаны туралы растауды алған болсаңыз, операциялық жүйенің қандай да бір ақаулығы деректеріңізге ештеңе жасамайтынына сенімді бола аласыз.

82. Транзакцияның оқшаулану деңгейлері қандай?

Жоғарыда айтқанымдай, ACID оқшаулауын қамтамасыз ету ресурстарды қажет ететін процесс. Сондықтан бұл мүлік ішінара қанағаттандырылады. Оқшауланудың әртүрлі деңгейлері бар, ал деңгей неғұрлым жоғары болса, соғұрлым өнімділікке әсер етеді. Транзакцияны оқшаулау деңгейлеріне көшпес бұрын, транзакцияның жеткіліксіз оқшаулануының әртүрлі мәселелерін қарастыруымыз керек :
  • фантомдық оқу - бір транзакция ішінде бір үлгіні (бір сұрауды) қайталап шақырғанда, басқа транзакция бойынша деректерді енгізуге байланысты пайда болатын алынған деректер ерекшеленеді;

  • қайталанbyteын оқу - бір транзакция шеңберінде бір үлгіні (бір сұрауды) қайталап шақырғанда, басқа транзакция бойынша деректерді өзгерту (жаңарту) және жою салдарынан туындайтын алынған деректер ерекшеленеді;

  • лас оқу - кейіннен расталмаған (қайтарылған) транзакция арқылы қосылған немесе өзгертілген деректерді оқу процесі, яғни. жарамсыз деректерді оқу;

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

Транзакцияны оқшаулау деңгейлері олар қандай оқшаулау мәселелерінен қорғайтынымен сипатталады. Оқшаулау деңгейлерін және олар қандай мәселелерден қорғайтынын кесте түрінде қарастырайық:
Оқшаулау деңгейі Фантомдық оқу Қайталанbyteын оқу Лас оқу Жоғалған жаңарту
СЕРИЯЛЫҚ + + + +
Қайталанатын ОҚУ - + + +
ОҚУ МІНДЕТТІ - - + +
МІНДЕТТЕМЕЙ ОҚЫҢЫЗ - - - +
ЖОҚ - - - -
Монетаның екінші жағын ұмытпаңыз: оқшаулау деңгейі неғұрлым жоғары болса, транзакциялар соғұрлым ұзағырақ өңделеді (егер бірнеше транзакциялар параллель орындалса). Егер сіз осы тақырыпты тереңірек зерттегіңіз келсе, мұнда сізге бастау үшін тамаша мақала бар.

83. Мәлімдеме мен PreparedStatement арасындағы айырмашылық неде?

Және бұл жерде JDBC технологиясының ерекшеліктеріне өте тегіс көшу жоқ . Сонымен, алдымен, мәлімдеменің шын мәнінде не екенін анықтап алайық . Бұл SQL сұрауларын жасау үшін пайдаланылатын нысан. JDBC үш түрін пайдаланады - мәлімдеме , PreparedStatement және CallableStatement . Біз бүгін CallableStatement-ті қарастырмаймыз : мәлімдеме мен PreparedStatement арасындағы айырмашылық туралы сөйлесейік .
  1. Мәлімдеме кіріс, динамикалық кірістірілген параметрлерсіз қарапайым SQL сұрауларын орындау үшін қолданылады. PrepareStatement кіріс параметрлерін динамикалық кірістіру мүмкіндігімен пайдаланылады.

  2. PreparedStatement ішінде параметрлерді орнату үшін сұраудағы енгізу параметрлері сұрақ белгілері ретінде жазылады, осылайша мәнді оның орнына setDouble() , setFloat() , setInt() , setTime() сияқты әртүрлі баптауыштар арқылы енгізуге болады ... . Нәтижесінде сұрауыңызға қате деректер түрін кірістірмейсіз.

  3. PreparedStatement «алдын ала құрастырылған» және кэштеуді пайдаланады, сондықтан оның орындалуы Statement нысандарынан сұраудан сәл жылдамырақ болуы мүмкін . Нәтижесінде, жиі орындалатын SQL сұраулары өнімділікті жақсарту үшін PreparedStatement нысандары ретінде жазылады .

  4. Мәлімдеме SQL инъекцияларына осал, ал PreparedStatement оларға жол бермейді. Осы мақалада SQL инъекцияларын жою және Java қауіпсіздігінің басқа ең жақсы тәжірибелері туралы толығырақ оқыңыз .

Егер сіз Java қолданбасын JDBC дерекқорына қосу технологиясын зерттей бастасаңыз, мен сізге осы мақаладан бастауға кеңес беремін . Міне, осы тұста біз бүгін тоқталамыз.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION