JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 7-бөлүк

Группада жарыяланган
Hey баарына! Программалоо тузактарга толгон. Ал эми мүдүрүлбөй турган тема дээрлик жок. Бул, өзгөчө, үйрөнчүктөр үчүн чыныгы болуп саналат. Муну кыскартуунун бирден-бир жолу окуу. Атап айтканда, бул эң негизги темалардын деталдуу талдоолоруна тиешелүү. Бүгүн мен Java иштеп чыгуучуларынын интервьюларынан алынган 250+ суроолорду талдоону улантып жатам , алар негизги темаларды жакшы камтыйт. Тизмеде жалпы темаларды башка бурчтан кароого мүмкүндүк берген кээ бир стандарттуу эмес суроолор да камтылганын белгилегим келет.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-1-бөлүк

62. Сап бассейни деген эмне жана ал эмне үчүн керек?

Javaдагы эс тутумда (үймөлөк, бул тууралуу кийинчерээк сүйлөшөбүз) аймак бар - String pool же string pool. Ал сап баалуулуктарын сактоо үчүн иштелип чыккан. Башкача айтканда, сиз белгилүү бир сапты түзгөндө, мисалы, кош тырмакчалар аркылуу:
String str = "Hello world";
сап пулдун берилген мааниге ээ экендигин текшерүү үчүн текшерүү жүргүзүлөт. Андай болсо, str өзгөрмөсүнө бассейндеги ошол мааниге шилтеме ыйгарылат. Эгер андай болбосо, бассейнде жаңы маани түзүлөт жана ага шилтеме str өзгөрмөсүнө дайындалат . Келгиле, бир мисал карап көрөлү:
String firstStr = "Hello world";
String secondStr = "Hello world";
System.out.println(firstStr == secondStr);
чыныгы экранда көрсөтүлөт . Эсибизде, == шилтемелерди салыштырат — бул эки шилтеме сап бассейниндеги бир эле маанини билдирет. Бул эс тутумда String тибиндеги көптөгөн окшош an objectтерди чыгарбоо үчүн жасалат , анткени биз эсибизде болгондой, String өзгөрүлгүс класс жана эгерде бизде бир эле мааниге көп шилтемелер болсо, анда эч кандай жаман нерсе жок. Бир жерде бир маанини өзгөртүү бир эле учурда бир нече башка шилтемелер үчүн өзгөрүүлөргө алып келген кырдаал үчүн мындан ары мүмкүн эмес. Бирок, ошентсе да, биз new аркылуу сап түзсөк :
String str = new String("Hello world");
эстутумда бул саптын маанисин сактай турган өзүнчө an object түзүлөт (жана бизде сап пулунда мындай маани бар же жокпу маанилүү эмес). тастыктоо катары:
String firstStr = new String("Hello world");
String secondStr = "Hello world";
String thirdStr = new String("Hello world");
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
Биз эки жалган маанини алабыз , демек, бул жерде шилтеме жасалып жаткан үч башка маани бар. Чынында, бул жөн гана кош тырмакчаларды колдонуу менен саптарды түзүү үчүн сунуш кылынат. Бирок, new аркылуу an object түзүп жатканда саптык бассейнге маанилерди кошо аласыз (же шилтеме ала аласыз) . Бул үчүн биз string класс ыкмасын колдонобуз - intern() . Бул ыкма күч менен сап бассейнинде маанини жаратат, же ал жерде сакталган болсо, ага шилтеме алат. Бул жерде бир мисал:
String firstStr = new String("Hello world").intern();
String secondStr = "Hello world";
String thirdStr = new String("Hello world").intern();
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
System.out.println(secondStr == thirdStr);
Натыйжада, биз консолдо үч чыныгы маанини алабыз , бул үч өзгөрмө тең бир сапка тиешелүү дегенди билдирет.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-2-бөлүк

63. Саптык бассейнде кандай GOF үлгүлөрү колдонулат?

GOF үлгүсү сап бассейнинде ачык көрүнүп турат - flyweight , башкача айтканда, отурукташкан деп аталат. Бул жерден башка шаблонду көрсөңүз, аны комментарийлерде бөлүшүңүз. Келгиле, жеңил үлгү жөнүндө сүйлөшөлү. Жеңил салмак бул структуралык дизайн үлгүсү, анда өзүн программанын ар кайсы жерлеринде уникалдуу инстанция катары көрсөткөн an object, чынында, андай эмес. Жеңил салмак ар бир an objectте бирдей маалыматтарды сактоонун ордуна an objectтердин жалпы абалын бөлүшүү менен эстутумду үнөмдөйт. Маңызын түшүнүү үчүн эң жөнөкөй мисалды карап көрөлү. Бизде кызматкер интерфейси бар дейли:
public interface Employee {
   void work();
}
Ал эми кээ бир ишке ашыруулар бар, мисалы, юрист:
public class Lawyer implements Employee {

   public Lawyer() {
       System.out.println("Юрист взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Решение юридических вопросов...");
   }
}
Ал эми бухгалтер:
public class Accountant implements Employee{

   public Accountant() {
       System.out.println("Бухгалтер взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Ведение бухгалтерского отчёта....");
   }
}
Методдор абдан шарттуу: биз жөн гана алар аткарылып жатканын көрүшүбүз керек. Ушундай эле абал конструкторго да тиешелүү. Консолдун чыгышынын аркасында жаңы an objectтер качан жаралганын көрөбүз. Бизде ошондой эле кызматкерлер бөлүмү бар, анын милдети суралган кызматкерди чыгаруу, ал жок болсо, аны жумушка алуу жана суроо-талапка жооп берүү:
public class StaffDepartment {
   private Map<String, Employee> currentEmployees = new HashMap<>();

   public Employee receiveEmployee(String type) throws Exception {
       Employee result;
       if (currentEmployees.containsKey(type)) {
           result = currentEmployees.get(type);
       } else {
           switch (type) {
               case "Бухгалтер":
                   result = new Accountant();
                   currentEmployees.put(type, result);
                   break;
               case "Юрист":
                   result = new Lawyer();
                   currentEmployees.put(type, result);
                   break;
               default:
                   throw new Exception("Данный сотрудник в штате не предусмотрен!");
           }
       }
       return result;
   }
}
Башкача айтканда, логика жөнөкөй: эгерде берилген бирдик бар болсо, аны кайтарыңыз, эгерде жок болсо, аны түзүп, сактагычка (кэш сыяктуу бир нерсе) салып, кайра бериңиз. Эми мунун баары кантип иштээрин карап көрөлү:
public static void main(String[] args) throws Exception {
   StaffDepartment staffDepartment = new StaffDepartment();
   Employee empl1  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl2  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl3  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl4  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl5  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl6  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl7  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl8  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl9  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl10  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
}
Ал эми консолдо, ошого жараша, натыйжа болот:
Адвокат жумушка алынган. Юридикалык маселелерди чечүү... Бухгалтер жумушка алынды. Бухгалтердик отчетту жүргүзүү.... Юридикалык маселелерди чечүү... Бухгалтердик отчетту жүргүзүү.... Юридикалык маселелерди чечүү... Бухгалтердик отчетту жүргүзүү.... Юридикалык маселелерди чечүү... Бухгалтердик отчетту жүргүзүү.... Юридикалык маселелерди чечүү... Бухгалтердик отчетторду жүргүзүү...
Көрүнүп тургандай, эки гана an object түзүлгөн, алар көп жолу колдонулган. Мисал абдан жөнөкөй, бирок бул шаблонду колдонуу ресурстарыбызды кантип үнөмдөөгө болорун ачык-айкын көрсөтүп турат. Ооба, сиз байкагандай, бул моделдин логикасы камсыздандыруу бассейнинин логикасына абдан окшош. Сиз бул макалада GOF үлгүлөрүнүн түрлөрү жөнүндө көбүрөөк окуй аласыз .Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-3-бөлүк

64. Сапты бөлүктөргө кантип бөлөт? Тиешелүү codeдун мисалын бериңиз

Албетте, бул суроо бөлүү ыкмасы жөнүндө . String классында бул ыкманын эки варианты бар:
String split(String regex);
Жана
String split(String regex);
regex сызык бөлгүч - сапты саптардын массивине бөлүүчү кээ бир регулярдуу туюнтмалар, мисалы:
String str = "Hello, world it's Amigo!";
String[] arr = str.split("\\s");
for (String s : arr) {
  System.out.println(s);
}
Консолго төмөндөгүлөр чыгарылат:
Салам, дүйнө бул Амиго!
Башкача айтканда, биздин саптын мааниси саптардын массивине бөлүнгөн жана бөлгүч боштук болгон (бөлүү үчүн биз боштук эмес регулярдуу "\\s" жана жөн гана " " сап туюнтмасын колдонсок болот ). Экинчи, ашыкча жүктөлгөн ыкмада кошумча аргумент бар - чек . чек — пайда болгон массивдин максималдуу уруксат берилген мааниси. Башкача айтканда, сап эбак эле жол берилген максималдуу ички саптар санына бөлүнгөндө, андан ары бөлүү болбойт жана акыркы элементте мүмкүн аз бөлүнгөн саптын "калдыгы" болот. Мисал:
String str = "Hello, world it's Amigo!";
String[] arr = str.split(" ", 2);
for (String s : arr) {
  System.out.println(s);
}
Консолдук чыгаруу:
Салам, дүйнө бул Амиго!
Көрүнүп тургандай, эгерде чек = 2 чектөө болбосо , массивдин акыркы элементи үч субсапка бөлүнүшү мүмкүн.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-4-бөлүк

65. Эмне үчүн символдук массив сырсөздү сактоо үчүн сапка караганда жакшыраак?

Сырсөздү сактоодо массивди саптан артык көрүүнүн бир нече себептери бар: 1. Стринг бассейни жана саптын өзгөрбөшү. Массивди ( char[] ) колдонгондо, биз аны менен бүтүргөндөн кийин дайындарды так өчүрө алабыз. Ошондой эле, биз массивди каалагандай кайра жаза алабыз жана жарактуу сырсөз системанын эч бир жеринде болбойт, ал тургай таштанды чогултканга чейин (бир нече уячаны жараксыз маанилерге өзгөртүү жетиштүү). Ошол эле учурда, String өзгөрүлгүс класс болуп саналат. Башкача айтканда, анын баасын өзгөрткүбүз келсе, жаңысын алабыз, ал эми эскиси сап бассейнинде калат. Эгер биз сырсөздүн String маанисин алып салгыбыз келсе , бул өтө татаал иш болушу мүмкүн, анткени String бассейнинен маанини алып салуу үчүн таштанды жыйноочу керек жана бул String мааниси бир нече убакытка чейин ошол жерде калуу ыктымалдыгы жогору. узак убакыт. Башкача айтканда, бул кырдаалда String маалыматтарды сактоо коопсуздугу жагынан char массивинен төмөн. 2. Эгерде String мааниси кокустан консолго (же журналдарга) чыгарылса, анда маанинин өзү көрсөтүлөт:
String password = "password";
System.out.println("Пароль - " + password);
Консолдук чыгаруу:
Купуя сөз
Ошол эле учурда, эгер сиз кокусунан массивди консолго чыгарсаңыз:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Пароль - " + arr);
консолдо түшүнүксүз gobbledygook болот:
Сырсөз - [C@7f31245a
Чынында gobbledygook эмес, бирок: [C класстын аталышы - char массиви , @ - бөлүүчү, андан кийин 7f31245a - он алтылык хэшcode. 3. Java Cryptography Architecture Guide расмий documentинде сырсөздөрдү String ордуна char[] ичинде сактоо ачык айтылган : “ Жава.lang.String түрүндөгү an objectте сырсөздү чогултуу жана сактоо логикалык көрүнөт . Бирок, бул жерде бир эскертүү бар: String an objectтери өзгөрүлбөйт, б.а., String an objectинин мазмунун өзгөртүүгө (үстүнө жазууга) же колдонуудан кийин жокко чыгарууга уруксат берүү үчүн аныкталган ыкмалар жок . Бул функция String an objectтерин колдонуучунун сырсөздөрү сыяктуу купуя маалыматты сактоого жараксыз кылат. Тескерисинче, сиз ар дайым тамгалар массивинде купуя коопсуздук маалыматын чогултуп, сакташыңыз керек."Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-5-бөлүк

Enum

66. Java тorндеги енумге кыскача мүнөздөмө бериңиз

Enum - бул санап чыгуу, жалпы тип менен бириктирилген саптык константалардын жыйындысы. - enum ачкыч сөзү аркылуу жарыяланды . Бул жерде enum менен бир мисал - белгилүү бир мектепте жарактуу ролдору:
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD
}
Баш тамгалар менен жазылган сөздөр жаңы операторду колдонбостон, жөнөкөйлөтүлгөн түрдө жарыяланган ошол эле санак константалары . Санактарды колдонуу жашоону абдан жөнөкөйлөтөт, анткени алар атоодо каталарды жана башаламандыктарды болтурбоого жардам берет (анткени баалуулуктардын белгилүү тизмеси гана болушу мүмкүн). Жеке мен аларды Switch логикалык дизайнында колдонгондо абдан ыңгайлуу деп эсептейм .

67. Enum интерфейстерди ишке ашыра алабы?

Ооба. Анткени, санап чыгуулар жөн гана пассивдүү жыйнактарды эмес (мисалы, ролдорду) көрсөтүшү керек. Java-да алар кандайдыр бир функцияга ээ болгон татаалыраак an objectтерди көрсөтө алышат, ошондуктан аларга кошумча функцияларды кошуу керек болушу мүмкүн. Бул ошондой эле ишке ашырылган интерфейстин түрү талап кылынган жерлерде enum маанисин алмаштыруу менен полиморфизмдин мүмкүнчүлүктөрүн колдонууга мүмкүндүк берет .

68. Энум классты узарта алабы?

Жок, мүмкүн эмес, анткени enum - бул Enum <T> жалпы классынын демейки подклассы , мында T жалпы энум түрүн билдирет. Бул Java тorнин бардык энум түрлөрү үчүн жалпы базалык класстан башка эч нерсе эмес. Энумду класска которуу компиляция убагында Java компилятору тарабынан ишке ашырылат. Бул кеңейтүү codeдо ачык көрсөтүлгөн эмес, бирок ар дайым көрүнбөй турат.

69. Объект инстанциялары жок Enum түзүүгө болобу?

Мага келсек, суроо бир аз кызык, же мен аны толук түшүнгөн жокмун. Менде эки чечмелөө бар: 1. Баалуулугу жок энум болушу мүмкүнбү - ооба, албетте, бул бош класс сыяктуу нерсе болмок - маанисиз:
public enum Role {
}
Жана чалып:
var s = Role.values();
System.out.println(s);
Биз консолдо алабыз:
[Lflyweight.Role;@9f70c54
( Рол маанилеринин бош массиви) 2. Жаңы операторсуз энум түзүүгө болобу - ооба, албетте. Мен жогоруда айткандай, жаңы операторду enum маанилери (санактар) үчүн колдонуунун кереги жок , анткени бул статикалык маанилер.

70. Enum үчүн toString() ыкмасын жокко чыгара алабызбы?

Ооба, албетте, toString ыкмасын чакырганда ( энумду кадимки сапка которууда , мисалы, консолго же журналга чыгаруу үчүн) сиздин enum көрсөтүүнүн белгилүү бир жолун аныктоо үчүн toString () ыкмасын жокко чыгара аласыз.
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;

   @Override
   public String toString() {
       return "Выбрана роль - " + super.toString();
   }
}
Мунун баары бүгүн, кийинки бөлүгүнө чейин!Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  7-6-бөлүк
Сериядагы башка материалдар:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION