71. Enum үшін toString() әдісін қайта анықтамасақ не болады?
Бізде келесі нөмір бар делік :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
Консольде студентті оған toString() шақыру арқылы көрсетейік :
System.out.println(Role.STUDENT.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 үшін == және тең арқылы салыстыру дұрыс.
74. Enum-да ordinal() әдісі не істейді?
Enum элементінде int ordinal() әдісін шақырған кезде біз санаулардың жалпы қатарындағы осы мәннің нөлінен реттік санды аламыз. Бұл әдісті талқыланған алдыңғы нөмірдің бір элементінде қолданайық - Role :System.out.println(Role.DIRECTOR.ordinal());
Тиісінше, консоль келесіні көрсетеді:
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);
Ал консоль келесіні көрсетеді:
76. Enum жүйесінде ordinal() және compareTo() әдістері қалай байланысты?
Жоғарыда айтылғандай, ordinal() жалпы тізімдер тізіміндегі мәннің реттік нөмірін қайтарады. Сондай-ақ, алдыңғы сұрақты талдау кезінде сіз санау элементтері бір рет, мысалы, TreeSet (сұрыпталған жиын) ішінде enum ішінде жарияланған ретті қабылдайтынын көрдіңіз . Біз білетіндей, TreeSet және TreeMap элементтерді Comparable интерфейсінің compareTo() әдісіне шақыру арқылы сұрыптайды . Бұдан біз Enum класы Comparable интерфейсін жүзеге асырады деп болжауға болады , оны салыстыруTo() әдісінде жүзеге асырады , оның ішінде сұрыптау ретін орнату үшін ordinal() пайдаланылады. Enum класына енгеннен кейін біз мұны растауды көреміз: Ал әдістің өзі: ordinal() әдісі мұнда шақырылмайды. Оның орнына реттік айнымалы қолданылады - тізімдегі элементтің реттік нөмірі. ordinal() әдісінің өзі реттік айнымалы үшін алушыдан басқа ештеңе емес .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 - бұл деректер ағынымен өзара әрекеттесудің салыстырмалы түрде жаңа тәсілі, ол өз кезегінде үлкен деректерді ыңғайлы және ықшам өңдеуге мүмкіндік береді, сонымен қатар белгілі бір ағындар саны арасында деректерді өңдеуді параллельді түрде пайдалануда өнімділікті арттырады. функционалдылық. Бұл тақырыпты қысқаша тереңірек талқылау мүмкін емес, сондықтан мен мұнда осы тақырыпқа енуге көмектесетін мақаланың сілтемесін қалдырамын.81. Мәмілелердің негізгі қасиеттері қандай?
Тақырып Stream API деп аталады, бірақ мәселе транзакция туралы. Хмм... Алдымен транзакцияның не екенін анықтап алайық. Транзакция – бұл деректермен жұмыс істеудің логикалық бірлігін білдіретін дәйекті дерекқор операцияларының тобы. Мәліметтер тұтастығын сақтай отырып және параллель орындалатын басқа транзакцияларға тәуелсіз транзакция толығымен және сәтті аяқталуы мүмкін немесе оны мүлдем аяқтау мүмкін емес, бұл жағдайда оның ешқандай әсері болмайды. Сонымен, транзакциялардың төрт негізгі қасиеті бар, олар қысқаша ACID деп аталады . Осы аббревиатураның әрбір әрпі қалай тұратынын қарастырайық: A - Atomicity - atomicity - бұл қасиет жүйеде ешқандай транзакцияның ішінара жазылмайтынына кепілдік береді. Оның барлық қосалқы операциялары орындалады немесе ешқайсысы орындалмайды ( барлығы немесе ештеңесі ). C – Consistency – консистенциясы – әрбір сәтті транзакция тек жарамды нәтижелерді жазуды қамтамасыз ететін қасиет. Яғни, бұл транзакция сәтті болған жағдайда жүйе нақты деректерге қоятын барлық ережелер мен шектеулер орындалатынына кепілдік, әйтпесе транзакция аяқталмайды және жүйедегі деректер бұрынғыға оралады. күй. I – Оқшаулау – оқшаулау – транзакцияны орындау кезінде параллельді операциялар оның нәтижесіне әсер етпеуі керек екенін айтатын қасиет. Бұл сипат ресурсты көп қажет етеді, сондықтан ол әдетте оқшаулаудың белгілі бір мәселелерін шешетін белгілі бір оқшаулау деңгейлеріне рұқсат беру арқылы ішінара жүзеге асырылады. Бұл туралы келесі сұрақта толығырақ қарастырамыз. D - Төзімділік - бұл қасиет пайдаланушы жүйеден транзакцияның аяқталғаны туралы растауды алса, ол қандай да бір сәтсіздікке байланысты ол жасаған өзгерістердің жойылмайтынына сенімді болуын қамтамасыз етеді. Яғни, транзакцияның сәтті аяқталғаны туралы растауды алған болсаңыз, операциялық жүйенің қандай да бір ақаулығы деректеріңізге ештеңе жасамайтынына сенімді бола аласыз.82. Транзакцияның оқшаулану деңгейлері қандай?
Жоғарыда айтқанымдай, ACID оқшаулауын қамтамасыз ету ресурстарды қажет ететін процесс. Сондықтан бұл мүлік ішінара қанағаттандырылады. Оқшауланудың әртүрлі деңгейлері бар, ал деңгей неғұрлым жоғары болса, соғұрлым өнімділікке әсер етеді. Транзакцияны оқшаулау деңгейлеріне көшпес бұрын, транзакцияның жеткіліксіз оқшаулануының әртүрлі мәселелерін қарастыруымыз керек :-
фантомдық оқу - бір транзакция ішінде бір үлгіні (бір сұрауды) қайталап шақырғанда, басқа транзакция бойынша деректерді енгізуге байланысты пайда болатын алынған деректер ерекшеленеді;
-
қайталанbyteын оқу - бір транзакция шеңберінде бір үлгіні (бір сұрауды) қайталап шақырғанда, басқа транзакция бойынша деректерді өзгерту (жаңарту) және жою салдарынан туындайтын алынған деректер ерекшеленеді;
-
лас оқу - кейіннен расталмаған (қайтарылған) транзакция арқылы қосылған немесе өзгертілген деректерді оқу процесі, яғни. жарамсыз деректерді оқу;
-
жоғалған жаңарту - әртүрлі транзакциялар бір уақытта бір деректерді өзгерткенде, соңғысынан басқа барлық өзгерістер жоғалады (көп ағынды ортадағы «жарыс жағдайы» мәселесін еске салады).
Оқшаулау деңгейі | Фантомдық оқу | Қайталанbyteын оқу | Лас оқу | Жоғалған жаңарту |
---|---|---|---|---|
СЕРИЯЛЫҚ | + | + | + | + |
Қайталанатын ОҚУ | - | + | + | + |
ОҚУ МІНДЕТТІ | - | - | + | + |
МІНДЕТТЕМЕЙ ОҚЫҢЫЗ | - | - | - | + |
ЖОҚ | - | - | - | - |
83. Мәлімдеме мен PreparedStatement арасындағы айырмашылық неде?
Және бұл жерде JDBC технологиясының ерекшеліктеріне өте тегіс көшу жоқ . Сонымен, алдымен, мәлімдеменің шын мәнінде не екенін анықтап алайық . Бұл SQL сұрауларын жасау үшін пайдаланылатын нысан. JDBC үш түрін пайдаланады - мәлімдеме , PreparedStatement және CallableStatement . Біз бүгін CallableStatement-ті қарастырмаймыз : мәлімдеме мен PreparedStatement арасындағы айырмашылық туралы сөйлесейік .-
Мәлімдеме кіріс, динамикалық кірістірілген параметрлерсіз қарапайым SQL сұрауларын орындау үшін қолданылады. PrepareStatement кіріс параметрлерін динамикалық кірістіру мүмкіндігімен пайдаланылады.
-
PreparedStatement ішінде параметрлерді орнату үшін сұраудағы енгізу параметрлері сұрақ белгілері ретінде жазылады, осылайша мәнді оның орнына setDouble() , setFloat() , setInt() , setTime() сияқты әртүрлі баптауыштар арқылы енгізуге болады ... . Нәтижесінде сұрауыңызға қате деректер түрін кірістірмейсіз.
-
PreparedStatement «алдын ала құрастырылған» және кэштеуді пайдаланады, сондықтан оның орындалуы Statement нысандарынан сұраудан сәл жылдамырақ болуы мүмкін . Нәтижесінде, жиі орындалатын SQL сұраулары өнімділікті жақсарту үшін PreparedStatement нысандары ретінде жазылады .
-
Мәлімдеме SQL инъекцияларына осал, ал PreparedStatement оларға жол бермейді. Осы мақалада SQL инъекцияларын жою және Java қауіпсіздігінің басқа ең жақсы тәжірибелері туралы толығырақ оқыңыз .
GO TO FULL VERSION