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

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

Топта жарияланған
Сәлем досым! Әзірлеуші ​​болу үшін қанша уақыт қажет? Мен неше түрлі адамдардан сұрадым, әртүрлі жауаптар естідім. Кейбіреулер үшін бір ай жеткілікті болуы мүмкін, ал басқалары үшін тіпті бір жыл жеткіліксіз. Бірақ мен Java әзірлеушісі болу сіздің бастапқы қабілеттеріңізге қарамастан қиын және ұзақ жол екенін нақты білемін. Өйткені, қабілет емес, қайсарлық пен еңбекқорлық маңызды. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 1 бөлімСондықтан бүгін біз Java әзірлеушісі үшін ең танымал сұхбат сұрақтарын мақсатты түрде талдауды жалғастырамыз. Оларды зерделеу сізді бірте-бірте өз мақсатыңызға жақындата түседі. Бастайық!

17. Қосымшаның сәтті және сәтсіз қолданылуына мысалдар келтіріңіз

Бізде белгілі бір мәндер тізбегі бар делік, олар арқылы біз ағын арқылы өтеміз және нәтижесінде біз кейбір Қосымшаларды аламыз :
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
Біз күткендей, осы Қосымшадан мәнді алуымыз керек . Тек get() пайдалану жаман әдіс:
String result = stringOptional.get();
Бірақ бұл әдіс Таңдаулыдан мәнді алып , оны бізге қайтаруы керек пе? Бұл, әрине, дұрыс, бірақ мағынасы болса. Егер ағындағы мәндер әртүрлі болса және соңында біз бос Optional алдық болса, біз одан get() әдісі арқылы мән алуға тырысқанда, келесілер шығарылады: Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 2 бөлімБұл жақсы емес. Бұл жағдайда келесі конструкцияларды қолданған дұрыс:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    Бұл жағдайда біз элементтің Қосымша параметрінде екенін тексереміз . Олай болмаса, нәтижесінде алынған жолдың ескі мәні болады.

  2. String result = stringOptional.orElse("default value");

    Бұл жағдайда бос Қосымша болған жағдайда нәтиже жолына берілетін кейбір әдепкі мәнді көрсетеміз .

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    Бұл жағдайда Қосымша бос болған кезде біз өзіміз ерекше жағдайды жасаймыз .

Бұл қосымша мәндерді қайтаратын Spring JPA әдісі - findById() пайдаланылған кезде бұл қолданбада ыңғайлы болуы мүмкін . Бұл жағдайда, осы әдіс арқылы біз мәнді алуға тырысамыз және ол жоқ болса, ExceptionHandler көмегімен контроллер деңгейінде өңделетін және 404 - NO FOUND күйімен HTTP жауапына түрленетін Runtime ерекше жағдайларын шығарамыз . Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 3 бөлім

18. Негізгі әдісті түпкілікті деп жариялауға болады ма?

Иә, әрине, main() әдісін final деп жариялауға ештеңе кедергі келтірмейді . Компилятор қателер шығармайды. Бірақ оны түпкілікті деп жариялағаннан кейін кез келген әдіс соңғы әдіске айналатынын есте ұстаған жөн - қайта жазылмайды. Дегенмен, негізгіні кім қайта анықтайды ??? Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 4 бөлім

19. Бір пакетті/сыныпты екі рет импорттауға болады ма? Мұның салдары қандай болуы мүмкін?

Иә болады. Салдары? Бізде Intelijj IDEA сұр түспен көрсететін бірнеше қажетсіз импорт болады, яғни. пайдаланылмаған. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 5 бөлімJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 6 бөлім

20. Кастинг дегеніміз не? ClassCastException қашан алуға болады?

Трансляция немесе түрді трансляциялау - бұл бір деректер түрін басқа деректер түріне түрлендіру процесі: қолмен (жасырын трансляциялау) немесе автоматты түрде (анық түрдегі трансляция). Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 7 бөлімАвтоматты түрлендіруді компилятор, ал қолмен түрлендіруді әзірлеуші ​​жүзеге асырады. Примитивтер мен сыныптар үшін типті кастинг біршама ерекшеленеді, сондықтан біз оларды бөлек қарастырамыз. Қарапайым типтер Қарапайым типтерді автоматты түрде құюдың мысалы :
int value = 17;
double convertedValue = value;
Көріп отырғаныңыздай, мұнда = белгісінен басқа ешқандай қосымша манипуляциялар қажет емес. Қарапайым түрлерді қолмен құюдың мысалы :
double value = 17.89;
int convertedValue = (int)value;
Бұл жағдайда (int) арқылы жүзеге асырылатын қолмен трансляциялауды байқауға болады, оның көмегімен үтірден кейінгі бөлік алынып тасталады және convertedValue мәні - 17 болады. Қарапайым түрлерді трансляциялау туралы толығырақ осы мақалада оқыңыз . Ал, енді нысандарға көшейік. Сілтеме түрлері Анықтама түрлері үшін ұрпақ сыныптары үшін ата-аналық сыныптарға автоматты түрде трансляциялау мүмкін. Бұл полиморфизм деп те аталады . Бізде Cat сыныбынан мұраланған Lion сыныбы бар делік . Бұл жағдайда автоматты түрлендіру келесідей болады:
Cat cat = new Lion();
Бірақ анық кастингпен бәрі біршама күрделірек, өйткені примитивтер сияқты артық нәрсені кесу функционалдығы жоқ. Және жай ғана пішінді нақты түрлендіруді орындаңыз:
Lion lion= (Lion)new Cat();
Сіз қатені аласыз: Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 8 бөлімшын мәнінде, Lion ұрпағы класына Cat класында болмаған әдістерді қосып, содан кейін оларды шақыруға болады, себебі нысан түрі Lion болады . Жақсы, бұл жерде логика жоқ. Сондықтан, типті тарылту бастапқы нысан Lion типінде болғанда ғана мүмкін болады, бірақ кейінірек тектік сыныпқа шығарылды:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Сондай-ақ, жоғары сенімділік үшін instanceOf construct арқылы нысандарды тарылту ұсынылады :
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
Сілтеме түрі туралы қосымша ақпаратты осы мақалада оқыңыз .

21. Неліктен қазіргі фреймворктар негізінен тек тексерілмеген ерекшеліктерді пайдаланады?

Менің ойымша, мұның бәрі тексерілген ерекшеліктерді өңдеу әлі де барлық жерде қайталанатын спагетти codeы болып табылады, бірақ барлық жағдайларда қажет емес. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 9 бөлімМұндай жағдайларда оны әзірлеушілердің иығына тағы бір рет жүктеп алмау үшін рамка ішінде өңдеуді жасау оңайырақ. Иә, әрине, төтенше жағдай туындауы мүмкін, бірақ дәл осы тексерілмеген ерекшеліктерді try-catch режимінде өңдеуге алаңдамай және оларды әдістер арқылы әрі қарай өткізбей-ақ, ыңғайлы түрде өңдеуге болады. ExionHandler ішіндегі кейбір HTTP жауаптарына ерекше жағдайды түрлендіру жеткілікті .

22. Статикалық импорт дегеніміз не?

Статикалық мәліметтерді (әдістер, айнымалылар) пайдаланған кезде an objectінің өзін құруға болмайды, бірақ оны класс атымен орындауға болады, бірақ бұл жағдайда да бізге сыныпқа сілтеме қажет. Онымен бәрі қарапайым: ол тұрақты импорттау арқылы қосылады. Бірақ егер біз класс атын жазбай статикалық әдісті қолданатын болсақ, ол ағымдағы сыныптың статикалық әдісі сияқты? Бұл статикалық импортпен мүмкін! Бұл жағдайда біз статикалық импортты және сол әдіске сілтеме жазуымыз керек. Мысалы, косинус мәнін есептеуге арналған Math класының статикалық әдісі:
import static java.lang.Math.cos;
Нәтижесінде біз әдісті сынып атын көрсетпей пайдалана аламыз:
double result = cos(60);
Сондай-ақ, біз статикалық импортты пайдаланып сыныптың барлық статикалық әдістерін бірден жүктей аламыз:
import static java.lang.Math.*;
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 10 бөлім

23. hashCode() және equals() әдістерінің арасында қандай байланыс бар?

Oracle сәйкес ереже мынада: екі нысан тең болса (яғни, equals() әдісі true мәнін қайтарады ), олардың хэш-codeы бірдей болуы керек. Бұл ретте екі түрлі нысанда бірдей хэш-code болуы мүмкін екенін ұмытпаңыз. Неліктен equals() және hashCode() әрқашан жұппен қайта анықталатынын түсіну үшін келесі жағдайларды қарастырыңыз:
  1. Екі әдіс те жоққа шығарылған.

    Бұл жағдайда ішкі күйлері бірдей екі түрлі нысан equals() - true қайтарады , ал hashCode() екеуі де бірдей санды қайтарады.

    Тәртіп сақталып жатқандықтан, бәрі ойдағыдай болып шықты.

  2. Екі әдіс те жоққа шығарылмайды.

    Бұл жағдайда, бірдей ішкі күйлері бар екі түрлі нысан equals() кезінде жалған мәнін қайтарады , өйткені салыстыру == операторы арқылы жүзеге асырылады .

    hashCode() әдісі де әртүрлі мәндерді қайтарады (ең алдымен), ол жад орны мекенжайының түрлендірілген мәнін шығарады. Бірақ бірдей нысан үшін бұл мән бірдей болады, бұл жағдайда equals() сілтемелер бір нысанды көрсеткенде ғана true мәнін қайтарады .

    Бұл жағдайда бәрі жақсы және ереже орындалады екен.

  3. Қайта анықталған equals() , қайта анықталмаған hashCode() емес .

    Бұл жағдайда, бірдей ішкі күйлері бар екі түрлі нысан үшін equals() true мәнін қайтарады , ал hashCode() әртүрлі мәндерді (ең ықтимал) қайтарады.

    Бұл ережені бұзу, сондықтан мұны істеу ұсынылмайды.

  4. equals() қайта анықталмаған , hashCode() қайта анықталған .

    Бұл жағдайда бірдей ішкі күйлері бар екі түрлі нысан үшін equals() жалғанды ​​қайтарады және hashCode() бірдей мәндерді қайтарады.

    Ереженің бұзылуы бар, сондықтан тәсіл дұрыс емес.

Көріп отырғаныңыздай, ережені тек equals() және hashCode() екеуі де қайта анықталғанда немесе екеуі де мүлдем қайта анықталмағанда ғана орындауға болады. Бұл мақалада equals() және hashCode()Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 11 бөлім туралы толығырақ оқыңыз .

24. BufferedInputStream және BufferedOutputStream сыныптары қашан пайдаланылады?

InputStream кейбір ресурстағы деректерді byte-byte оқу үшін пайдаланылады, ал OutputStream деректер byte-byte жазу үшін пайдаланылады. Бірақ byte-byte операциялары өте ыңғайсыз болуы мүмкін және қосымша өңдеуді қажет етеді (мәтіндерді қалыпты оқу/жазу үшін). Шын мәнінде, мұндай byte жазбаларын жеңілдету үшін BufferedOutputStream енгізілді және оқу үшін BufferedInputStream енгізілді . Бұл класстар деректермен byte бойынша емес, бүкіл деректер пакеттері (массивтер) бойынша жұмыс істеуге мүмкіндік беретін деректерді жинақтайтын буферлерден басқа ештеңе емес. Жасалған кезде, BufferedInputStream өз конструкторына деректер оқылатын InputStream түрінің данасын қабылдайды :
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in — консольден деректерді оқитын InputStream нысаны. Яғни, осы BufferedInputStream нысанын пайдалану арқылы біз InputStream ішінен деректерді берілген массивке жазу арқылы оқи аламыз. Бұл InputStream класының орауыш түрі болып шығады . Бұл мысалдағы arr массиві BufferedInputStream ішінен деректерді қабылдайтын жиым болып табылады . Бұл өз кезегінде InputStream деректерін әдепкі бойынша өлшемі 2048 byte болатын басқа массивпен оқиды. Бұл BufferedOutputStream үшін де бірдей : OutputStream түрінің данасы конструкторға берілуі керек , оған біз деректерді бүкіл массивтерге жазамыз:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out — консольге деректерді жазатын OutputStream нысаны. flush() әдісі деректерді BufferedOutputStream ішінен OutputStream қызметіне жібереді , процесте BufferedOutputStream өшіреді . Бұл әдіссіз ештеңе жазылмайды. Алдыңғы мысалға ұқсас: arr - деректер BufferedOutputStream ішіне жазылатын жиым . Сол жерден олар OutputStream- ге әдепкі бойынша өлшемі 512 byte болатын басқа массивте жазылады . Осы екі сынып туралы толығырақ мақалада оқыңыз .

25. java.util.Collection мен java.util.Collections кластарының айырмашылығы неде?

Коллекция - коллекция иерархиясының басшысы болып табылатын интерфейс. Ол нысандардың барлық топтарын жасауға, қамтуға және өзгертуге мүмкіндік беретін сыныптарды ұсынады. Бұл үшін add() , remove() , contain() және т.б. сияқты көптеген әдістер қарастырылған . Collection класының негізгі интерфейстері :
  • Жиын – ретсіз бірегей (қайталанbyteын) элементтерді қамтитын жиынды сипаттайтын интерфейс.

  • Тізім – нысандардың реттелген тізбегін сақтайтын деректер құрылымын сипаттайтын интерфейс. Бұл an objectілер өздерінің индексін (нөмірін) алады, оның көмегімен сіз олармен әрекеттесе аласыз: алу, жою, өзгерту, қайта жазу.

  • Кезек - FIFO - Бірінші кіріс бірінші шығыс ережесіне сәйкес кезек түріндегі элементтерді сақтайтын деректер құрылымын сипаттайтын интерфейс .

Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 12 бөлімКоллекция туралы толығырақ оқыңыз . Коллекциялар - көптеген әртүрлі пайдалы әдістерді қамтамасыз ететін утorталар класы. Мысалы:
  • addAll(Collection<? super T> коллекциясы, T...element) - жинаққа T түріндегі берілген элементтерді қосады .

  • көшіру(List<? super T> dest, List<? extensions T> src) - src тізімінен барлық элементтерді dest ішіндегі тізімге көшіреді .

  • emptyList() – бос тізімді қайтарады.

  • max(Collection<? extensions T> collection, Comparator<? super T> comp) - Көрсетілген компаратор көрсеткен ретке сәйкес берілген жинақтың ең үлкен элементін қайтарады.

  • unmodifiableList(List<? T> тізімін кеңейтеді) - өткен тізімнің өзгертілмейтін көрінісін қайтарады.

Коллекцияларда мұндай ыңғайлы әдістер өте көп . Бұл әдістердің толық тізімін Oracle веб-сайтындаJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 13 бөлім табуға болады . Олар жайлы деп бекер айтқан жоқпын. Өйткені, олардың барлығы статикалық. Яғни, оған қажетті әдісті шақыру үшін әр уақытта осы класстың an objectісін жасаудың қажеті жоқ. Сізге тек сыныптың атын енгізіп, оған қажетті әдісті шақырып, барлық қажетті дәлелдерді беру керек. Қорытындылай келе, Коллекция коллекциялар шеңберінің түбірлік интерфейсі болып табылады. Коллекциялар - коллекциялар құрылымынан түрге жататын нысандарды неғұрлым ыңғайлы өңдеуге арналған көмекші сынып. Міне, бүгінгі күннің бәрі осы. Бәріне жақсылық!Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  16 - 14 бөлім
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION