JavaRush /Java blogi /Random-UZ /Java dasturchisi uchun intervyudan olingan savollar va ja...

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish. 7-qism

Guruhda nashr etilgan
Hammaga salom! Dasturlash tuzoqlarga to'la. Va deyarli hech qanday mavzu yo'q, unda siz qoqilmaysiz va zarba olasiz. Bu, ayniqsa, yangi boshlanuvchilar uchun to'g'ri keladi. Buni kamaytirishning yagona yo'li - o'rganish. Xususan, bu eng asosiy mavzularni batafsil tahlil qilish uchun amal qiladi. Bugun men Java dasturchilarining intervyularidan 250 dan ortiq savollarni tahlil qilishni davom ettiraman , ular asosiy mavzularni yaxshi yoritadi. Shuni ta'kidlashni istardimki, ro'yxatda umumiy mavzularga boshqa tomondan qarashga imkon beruvchi nostandart savollar ham mavjud.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-1-qism

62. String puli nima va u nima uchun kerak?

Java-da xotirada (Uyum, bu haqda keyinroq gaplashamiz) - String pool yoki string pool maydoni mavjud. U satr qiymatlarini saqlash uchun mo'ljallangan. Boshqacha qilib aytganda, siz ma'lum bir qatorni yaratganingizda, masalan, qo'sh tirnoq orqali:
String str = "Hello world";
string pulining berilgan qiymatga ega ekanligini tekshirish uchun tekshiriladi. Agar shunday bo'lsa, str o'zgaruvchisiga hovuzdagi ushbu qiymatga havola tayinlanadi. Agar shunday bo'lmasa, hovuzda yangi qiymat yaratiladi va unga havola str o'zgaruvchisiga tayinlanadi . Keling, bir misolni ko'rib chiqaylik:
String firstStr = "Hello world";
String secondStr = "Hello world";
System.out.println(firstStr == secondStr);
ekranda rost ko'rsatiladi . Esda tutamizki, == havolalarni solishtiradi, ya'ni bu ikki havola string pulidan bir xil qiymatga tegishli. Bu xotirada String tipidagi bir xil ob'ektlarni ko'p hosil qilmaslik uchun amalga oshiriladi , chunki biz eslaganimizdek, String o'zgarmas sinfdir va agar bizda bir xil qiymatga ko'p havolalar bo'lsa, buning hech qanday yomon joyi yo'q. Bir joyda qiymatni o'zgartirish bir vaqtning o'zida bir nechta boshqa havolalar uchun o'zgarishlarga olib keladigan vaziyat uchun endi mumkin emas. Ammo shunga qaramay, agar biz new yordamida satr yaratsak :
String str = new String("Hello world");
xotirada ushbu satr qiymatini saqlaydigan alohida ob'ekt yaratiladi (va bizda string hovuzida bunday qiymat mavjudmi yoki yo'qligi muhim emas). Tasdiq sifatida:
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);
Biz ikkita noto'g'ri qiymatga ega bo'lamiz , ya'ni bizda havola qilinayotgan uchta turli qiymat mavjud. Aslida, shuning uchun ikkita tirnoq yordamida satrlarni yaratish tavsiya etiladi. Biroq, new dan foydalanib ob'ekt yaratishda siz qiymatlarni satrlar hovuziga qo'shishingiz (yoki havola olishingiz) mumkin . Buning uchun biz string sinf usulidan foydalanamiz - intern() . Ushbu usul string hovuzida qiymatni majburan yaratadi yoki u erda allaqachon saqlangan bo'lsa, unga havola oladi. Mana bir misol:
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);
Natijada, biz konsolda uchta haqiqiy qiymatni olamiz , ya'ni uchta o'zgaruvchi ham bir xil satrga tegishli.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-2 qism

63. String pulida qanday GOF naqshlaridan foydalaniladi?

GOF namunasi torli hovuzda aniq ko'rinadi - flyweight , aks holda "settler" deb ataladi. Agar bu erda boshqa shablonni ko'rsangiz, uni sharhlarda baham ko'ring. Keling, engil shablon haqida gapiraylik. Engil vazn - bu dasturning turli joylarida o'zini noyob misol sifatida ko'rsatadigan ob'ekt, aslida, bunday bo'lmagan tizimli dizayn namunasidir. Engil vazn har bir ob'ektda bir xil ma'lumotlarni saqlash o'rniga ob'ektlarning umumiy holatini o'zaro almashish orqali xotirani tejaydi. Mohiyatni tushunish uchun eng oddiy misolni ko'rib chiqaylik. Aytaylik, bizda ishchi interfeysi mavjud:
public interface Employee {
   void work();
}
Va ba'zi ilovalar mavjud, masalan, advokat:
public class Lawyer implements Employee {

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

   @Override
   public void work() {
       System.out.println("Решение юридических вопросов...");
   }
}
Va buxgalter:
public class Accountant implements Employee{

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

   @Override
   public void work() {
       System.out.println("Ведение бухгалтерского отчёта....");
   }
}
Usullar juda shartli: biz faqat ular amalga oshirilganligini ko'rishimiz kerak. Xuddi shu holat konstruktorga ham tegishli. Konsol chiqishi tufayli biz yangi ob'ektlar yaratilganda ko'ramiz. Shuningdek, bizda xodimlar bo'limi mavjud bo'lib, uning vazifasi so'ralgan xodimni berish va agar u yo'q bo'lsa, uni ishga olish va so'rovga javob berishdir:
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;
   }
}
Ya'ni, mantiq oddiy: agar berilgan birlik bo'lsa, uni qaytaring, agar bo'lmasa, uni yarating, uni saqlashga joylashtiring (kesh kabi narsa) va uni qaytarib bering. Endi hammasi qanday ishlashini ko'rib chiqamiz:
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();
}
Va konsolda, shunga ko'ra, chiqish bo'ladi:
Advokat yollangan. Huquqiy masalalarni hal qilish... Hisobchi ishga qabul qilindi. Buxgalteriya hisobotini yuritish.... Huquqiy masalalarni hal qilish... Buxgalteriya hisobotini yuritish.... Huquqiy masalalarni hal qilish... Buxgalteriya hisobotini yuritish.... Huquqiy masalalarni hal qilish... Buxgalteriya hisobotini yuritish.... Huquqiy masalalarni hal qilish ... Buxgalteriya hisobotlarini yuritish ...
Ko'rib turganingizdek, faqat ikkita ob'ekt yaratilgan, ular ko'p marta ishlatilgan. Misol juda oddiy, ammo bu shablondan foydalanish resurslarimizni qanday tejash mumkinligini aniq ko'rsatib beradi. Xo'sh, siz sezganingizdek, ushbu naqshning mantig'i sug'urta pulining mantig'iga juda o'xshash. Ushbu maqolada GOF naqshlarining turlari haqida ko'proq o'qishingiz mumkin .Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-3-qism

64. Satrni qismlarga qanday ajratish mumkin? Iltimos, tegishli kodga misol keltiring

Shubhasiz, bu savol split usuli haqida . String sinfida ushbu usulning ikkita varianti mavjud:
String split(String regex);
Va
String split(String regex);
regex - bu qatorni ajratuvchi - qatorni qatorlar qatoriga ajratuvchi ba'zi bir muntazam ifoda, masalan:
String str = "Hello, world it's Amigo!";
String[] arr = str.split("\\s");
for (String s : arr) {
  System.out.println(s);
}
Konsolga quyidagilar chiqariladi:
Salom, dunyo bu Amigo!
Ya'ni, bizning satr qiymatimiz satrlar massiviga bo'lingan va ajratuvchi bo'sh joy edi (ajratish uchun biz bo'sh joy bo'lmagan "\\s" muntazam ifodasini va faqat " " satr ifodasini ishlatishimiz mumkin ). Ikkinchi, haddan tashqari yuklangan usulda qo'shimcha argument mavjud - limit . limit — olingan massivning ruxsat etilgan maksimal qiymati. Ya'ni, satr allaqachon ruxsat etilgan pastki qatorlarning maksimal soniga bo'lingan bo'lsa, keyingi bo'linish bo'lmaydi va oxirgi elementda, ehtimol, kam bo'lingan satrning "qoldig'i" bo'ladi. Misol:
String str = "Hello, world it's Amigo!";
String[] arr = str.split(" ", 2);
for (String s : arr) {
  System.out.println(s);
}
Konsol chiqishi:
Salom, dunyo bu Amigo!
Ko'rib turganimizdek, agar limit = 2 cheklovi bo'lmaganida , massivning oxirgi elementi uchta pastki qatorga bo'linishi mumkin edi.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-4-qism

65. Nima uchun parolni saqlash uchun belgilar massivi satrdan yaxshiroq?

Parolni saqlashda qatorga massivni afzal ko'rishning bir necha sabablari bor: 1. String pool va string o'zgarmasligi. Massivdan ( char[] ) foydalanilganda, u bilan ishlashni tugatgandan so'ng biz ma'lumotlarni aniq o'chirib tashlashimiz mumkin. Bundan tashqari, biz massivni xohlagancha qayta yozishimiz mumkin va joriy parol tizimning biron bir joyida, hatto axlat yig'ishdan oldin ham bo'lmaydi (bir nechta katakchalarni noto'g'ri qiymatlarga o'zgartirish kifoya). Shu bilan birga, String o'zgarmas sinfdir. Ya'ni, agar biz uning qiymatini o'zgartirmoqchi bo'lsak, biz yangisini olamiz, eskisi esa string hovuzida qoladi. Agar biz parolning String qiymatini o'chirmoqchi bo'lsak , bu juda qiyin ish bo'lishi mumkin, chunki String hovuzidagi qiymatni olib tashlash uchun bizga axlat yig'uvchi kerak bo'ladi va bu String qiymati o'sha erda bir muddat qolishi ehtimoli katta. uzoq vaqt. Ya'ni, bu vaziyatda String ma'lumotlarni saqlash xavfsizligi bo'yicha char massividan past. 2. Agar String qiymati tasodifan konsolga (yoki jurnallarga) chiqsa, qiymatning o'zi ko'rsatiladi:
String password = "password";
System.out.println("Пароль - " + password);
Konsol chiqishi:
Parol
Shu bilan birga, agar siz tasodifan konsolga massiv chiqarsangiz:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Пароль - " + arr);
konsolda tushunarsiz gobbledygook bo'ladi:
Parol - [C@7f31245a
Aslida gobbledygook emas, lekin: [C - sinf nomi - char massivi , @ - ajratuvchi, keyin 7f31245a - o'n oltilik hashkod. 3. Rasmiy hujjat, Java kriptografiyasi arxitektura qoʻllanmasida parollarni String oʻrniga char[] da saqlash haqida aniq eslatib oʻtiladi : “ Java.lang.String tipidagi obʼyektda parolni yigʻish va saqlash mantiqiy tuyuladi . Biroq, bu erda bir ogohlantirish bor: String ob'ektlari o'zgarmasdir, ya'ni String ob'ektining mazmunini ishlatilgandan keyin o'zgartirish (qayta yozish) yoki bekor qilish imkonini beradigan usullar aniqlanmagan . Bu xususiyat String obyektlarini foydalanuvchi parollari kabi nozik maʼlumotlarni saqlash uchun yaroqsiz qiladi. Buning o'rniga, siz har doim belgilar qatorida nozik xavfsizlik ma'lumotlarini to'plashingiz va saqlashingiz kerak."Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-5-qism

Enum

66. Java tilidagi Enum ga qisqacha tavsif bering

Enum - bu ro'yxatga olish, umumiy tip bilan birlashtirilgan satr konstantalari to'plami. Kalit so'z orqali e'lon qilingan - enum . Mana , ma'lum bir maktabda engum - haqiqiy rollarga misol :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD
}
Katta harflar bilan yozilgan so'zlar bir xil sanab o'tish konstantalari bo'lib, ular new operatoridan foydalanmasdan soddalashtirilgan tarzda e'lon qilinadi . Ro'yxatlardan foydalanish hayotni sezilarli darajada soddalashtiradi, chunki ular nomlashda xatolar va chalkashliklarning oldini olishga yordam beradi (chunki qiymatlarning faqat ma'lum bir ro'yxati bo'lishi mumkin). Shaxsan men ularni Switch-ning mantiqiy dizaynida foydalanilganda juda qulay deb bilaman .

67. Enum interfeyslarni amalga oshirishi mumkinmi?

Ha. Axir, ro'yxatlar passiv to'plamlardan (masalan, rollar) ko'proq narsani anglatishi kerak. Java-da ular ba'zi funksiyalarga ega bo'lgan murakkabroq ob'ektlarni ifodalashi mumkin, shuning uchun ularga qo'shimcha funksiyalar qo'shishingiz kerak bo'lishi mumkin. Bu, shuningdek , amalga oshirilgan interfeys turi talab qilinadigan joylarda enum qiymatini almashtirish orqali polimorfizm imkoniyatlaridan foydalanishga imkon beradi .

68. Enum sinfni kengaytira oladimi?

Yo'q, bu mumkin emas, chunki enum Enum <T> umumiy sinfining birlamchi pastki sinfidir , bu erda T umumiy enum turini ifodalaydi. Bu Java tilining barcha enum turlari uchun umumiy tayanch sinfdan boshqa narsa emas. Enumni sinfga aylantirish kompilyatsiya vaqtida Java kompilyatori tomonidan amalga oshiriladi. Ushbu kengaytma kodda aniq ko'rsatilmagan, lekin har doim ko'rinmas holda mavjud.

69. Ob'ekt misollarisiz Enum yaratish mumkinmi?

Menga kelsak, savol biroz g'alati, yoki men uni to'liq tushunmadim. Menda ikkita talqin bor: 1. Qiymatsiz raqam bo'lishi mumkinmi - ha, albatta, bu bo'sh sinfga o'xshash narsa bo'lar edi - ma'nosiz:
public enum Role {
}
Va qo'ng'iroq qilish:
var s = Role.values();
System.out.println(s);
Biz konsolda qabul qilamiz:
[Lflyweight.Role;@9f70c54
( rol qiymatlarining bo'sh massivi ) 2. Yangi operatorsiz enum yaratish mumkinmi - ha, albatta. Yuqorida aytib o'tganimdek, raqam qiymatlari (raqamlar) uchun new operatoridan foydalanish shart emas , chunki bular statik qiymatlardir.

70. Enum uchun toString() usulini bekor qila olamizmi?

Ha , albatta, toString () usulini toString usulini chaqirganda ( enumni oddiy satrga tarjima qilishda , masalan, konsol yoki jurnalga chiqarish uchun) koʻrsatishning aniq usulini belgilash uchun bekor qilishingiz mumkin.
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;

   @Override
   public String toString() {
       return "Выбрана роль - " + super.toString();
   }
}
Hammasi bugun, keyingi qismga qadar!Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  7-6-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION