JavaRush /Java блогу /Random-KY /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 ичинде конструкторду көрсөтүү мүмкүнбү?

Ооба албетте. Бул конструктор аркылуу ички энум өзгөрмөлөрүнүн маанилери орнотулат. Мисал катары, мурунку тизмеге эки талааны кошолу - 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 ... ) биз муну == колдонуп жасайбыз , анткени өзгөрмөлөр белгилүү маанилерди камтыйт жана биз аларды салыштыра алабыз. Ал эми примитивдик өзгөрмөлөр толук кандуу an object эмес - алар Объекттен мураска алbyte жана equals() ыкмасына ээ эмес . Объекттерге тиешелүү өзгөрмөлөрдү салыштыруу жөнүндө сөз кылганда, == шилтемелердин маанисин гана салыштырат - алар бир эле an objectке тиешелүүбү же жокпу. Жана бир an object башка an objectиге окшош болсо дагы, == аркылуу салыштыруу терс натыйжа берет ( false ), анткени бул башка an object. Сиз түшүнгөндөй, equals() ыкмасы шилтеме өзгөрмөлөрдү салыштыруу үчүн колдонулат . Бул an objectтерди толук салыштыруу үчүн зарыл болгон Object классынын стандарттык ыкмаларынын бири . Бирок дароо тактоо керек: бул ыкма туура иштеши үчүн, бул класстын an 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 константаларды сактайт жана окшош маанилерди == колдонуп салыштырганда да , биз чындыкты алабыз , анткени шилтемелер ар дайым бир эле an objectтерге болот. Ооба, барабарларды колдонгондо , биз функцияны да туура иштеп чыгабыз, айрыкча 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 интерфейсин ишке ашырат деп болжолдоого болот , аны comparableTo() методунда ишке ашырат , анын ичинде ordinal() сорттоо тартибин орнотуу үчүн колдонулат. Enum классына киргенден кийин , биз мунун тастыкталышын көрөбүз: Ал эми методдун өзү: ordinal() методу бул жерде чакырылbyte. Анын ордуна, иреттик өзгөрмө колдонулат - санактагы элементтин иреттик саны. ordinal() методунун өзү ординал өзгөрмө үчүн алуудан башка эч нерсе эмес .Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  8-6-бөлүкJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  8-7-бөлүкJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  8-8-бөлүк

77. ЭнумМ мисалын жаз

Жогоруда талкууланган суроолордо мен энумдардын мисалдарын келтирдим жана мен codeду кайталоонун маанисин көрбөй жатам (мисалы, энумдагы конструктор жөнүндө №72 суроо).

78. Коммутатор корпусунда Enum колдонуу мүмкүнбү?

Бул мүмкүн жана зарыл! Өзүмдүн практикама көз чаптырып, мен enum колдонуу үчүн эң кеңири таралган жерлердин бири switch сыяктуу логикалык конструкциялар экенин байкадым . Бул учурда, сиз бардык мүмкүн болгон вариацияларды бере аласыз , жана бардык enum маанилери үчүн логиканы жазгандан кийин - жана демейки операторду колдонуунун кереги деле жок болушу мүмкүн! Анткени, эгер сиз 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 инстанциясында бардык жеткorктүү маанилерди кантип алууга болот?

Эгер сиз энумдун бардык инстанцияларын алышыңыз керек болсо, анда белгилүү бир энумдун бардык жеткorктүү маанилеринин массивин табигый тартипте кайтаруучу 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 деп аталат, бирок маселе транзакция жөнүндө. Ммм... Биринчиден, транзакция деген эмне экенин аныктап алалы. Транзакция – бул маалыматтар менен иштөөнүн логикалык бирдигин билдирген маалымат базасынын ырааттуу операцияларынын тобу. Транзакция маалыматтардын бүтүндүгүн сактоо менен жана параллелдүү башка транзакциялардан көз карандысыз түрдө толугу менен жана ийгorктүү аякташы мүмкүн, же ал эч кандай натыйжа бербейт. Ошентип, транзакциялар төрт негизги касиетке ээ, алар кыскача ACID деп аталат . Бул аббревиатуранын ар бир тамгасы кандайча көрсөтүлөрүн карап көрөлү: A - Atomicity - atomicity - бул касиет эч кандай транзакция системада жарым-жартылай жазылбай тургандыгына кепилдик берет. Же анын бардык суб-операциялары аткарылат, же эч бири аткарылbyte ( баары же эч нерсе ). C - Консистенция - ырааттуулук - бул ар бир ийгorктүү транзакциянын жарактуу натыйжаларын гана жазууну камсыз кылган касиет. Башкача айтканда, бул транзакция ийгorктүү болгон учурда, система белгилүү бир маалыматтарга киргизген бардык эрежелер жана чектөөлөр аткарылат, антпесе транзакция бүтпөйт жана системадагы маалыматтар мурунку абалына кайтып келет деген кепилдик. мамлекет. I - изоляция - обочолонуу бүтүмдүн аткарылышы учурунда параллелдүү бүтүмдөр анын натыйжасына таасир этпеши керек деген касиет. Бул мүлк ресурсту көп талап кылат, ошондуктан ал, адатта, кээ бир жылуулоо көйгөйлөрүн чечүүчү жылуулоонун белгилүү деңгээлдерине жол берүү менен жарым-жартылай ишке ашырылат. Бул тууралуу кийинки суроодо кененирээк талкуулайбыз. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  8-10-бөлүкD - Узак мөөнөттүүлүк - бул касиет, эгерде колдонуучу системадан транзакция аяктагандыгы жөнүндө тастыктоо алса, ал жасаган өзгөртүүлөр кандайдыр бир катачылыктан улам жокко чыгарылбай тургандыгына ишене аларын камсыздайт. Башкача айтканда, транзакцияңыздын ийгorктүү аяктагандыгы тууралуу ырастоону алган болсоңуз, операциялык тутумдун кандайдыр бир бузулушу сиздин маалыматтарыңызга эч нерсе кылbyte деп ишенсеңиз болот.

82. Транзакцияны обочолонтуу деңгээли кандай?

Мен жогоруда айткандай, ACID изоляциясын камсыз кылуу ресурстарды көп талап кылган процесс. Ошондуктан, бул мүлк жарым-жартылай канааттандырылат. Изоляциянын ар кандай деңгээли бар жана канчалык жогору болсо, өндүрүмдүүлүккө таасири ошончолук чоң болот. Транзакцияларды изоляциялоо деңгээлине өтүүдөн мурун, транзакцияларды изоляциялоонун жетишсиздигинин ар кандай көйгөйлөрүн карап чыгышыбыз керек :
  • фантомдук окуу - бир эле транзакциянын алкагында бир эле үлгү (бир эле суроо) кайра-кайра чакырылганда, башка транзакция менен маалыматтарды киргизүүдөн улам келип чыккан алынган маалыматтар айырмаланат;

  • кайталанбаган окуу - бир эле транзакциянын алкагында бир эле үлгү (бир эле суроо) кайра-кайра чакырылганда алынган маалыматтар башка транзакция менен маалыматтардын өзгөрүшүнө (жаңыртылышына) жана өчүрүлүшүнө байланыштуу келип чыккан айырмаланат;

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

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

Транзакциянын изоляциясынын деңгээли алар кандай изоляция көйгөйлөрүнөн коргогону менен мүнөздөлөт. Келгиле, table түрүндө изоляциянын деңгээлин жана алар кандай көйгөйлөрдөн коргой турганын карап көрөлү:
Изоляция деңгээли Фантомдук окуу Кайталанбаган окуу Кир окуу Жаңыртуу жоголду
СЕРИЯЛАШТЫРУУЧУ + + + +
КАЙТАЛАНГАН ОКУУ - + + +
ОКУУ КЕРЕК - - + +
МИЛДЕТТЕНБЕЙ ОКУ - - - +
ЖОК - - - -
Жана монетанын башка жагын да унутпаңыз: обочолонуу деңгээли канчалык жогору болсо, транзакциялар ошончолук узакка созулат (эгерде бир нече транзакциялар параллелдүү аткарылса). Эгер сиз бул теманы тереңирээк изилдегиңиз келсе, бул жерде сизди баштоо үчүн сонун макала бар.

83. Билдирүүнүн жана Даярдык декларациянын ортосунда кандай айырма бар?

Бул жерде JDBC технологиясынын өзгөчөлүктөрүнө өтө жылмакай өтүү жок . Ошентип, адегенде, келгиле, билдирүү чындыгында эмне экенин аныктап алалы . Бул SQL сурамдарын түзүү үчүн колдонулган an object болуп саналат. JDBC үч түрүн колдонот - Statement , PreparedStatement жана CallableStatement . Биз бүгүн CallableStatementти карабайбыз : Келгиле, Statement менен PreparedStatement ортосундагы айырмачылык жөнүндө сүйлөшөлү .
  1. Билдирме жөнөкөй SQL сурамдарын динамикалык түрдө киргизилген параметрлерсиз аткаруу үчүн колдонулат. PrepareStatement киргизүү параметрлерин динамикалык киргизүү мүмкүнчүлүгү менен колдонулат.

  2. PreparedStatement ичинде параметрлерди коюу үчүн , сурамдагы киргизүү параметрлери суроо белгилери катары жазылат, андыктан анын ордуна setDouble() , setFloat() , setInt() , setTime() ... . Натыйжада, сиз сурооңузга туура эмес типтеги маалыматтарды киргизбейсиз.

  3. PreparedStatement "алдын ала түзүлгөн" жана кэшти колдонот, ошондуктан анын аткарылышы Statement an objectтеринен сураганга караганда бир аз ылдамыраак болушу мүмкүн . Натыйжада, тез-тез аткарылуучу SQL сурамдары аткарууну жакшыртуу үчүн PreparedStatement an objectтери катары жазылат .

  4. Билдирме SQL инъекцияларына аялуу, ал эми PreparedStatement аларды алдын алат. Бул макалада SQL инъекцияларын жана Java коопсуздугу боюнча башка мыкты тажрыйбаларды жок кылуу жөнүндө көбүрөөк оку .

Эгер сиз Java тиркемесин JDBC маалымат базасына туташтыруу технологиясын изилдеп жатсаңыз, мен сизге ушул макаладан баштоону сунуштайм . Ооба, ушул учурда биз бүгүн токтойбуз.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  8-11-бөлүк
Сериядагы башка материалдар:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION