JavaRush /Java блогу /Random-KY /Топ 50 Java негизги интервью суроолору жана жооптору. 2 б...
Roman Beekeeper
Деңгээл

Топ 50 Java негизги интервью суроолору жана жооптору. 2 бөлүк

Группада жарыяланган
Топ 50 Java негизги интервью суроолору жана жооптору. 1-бөлүк Топ 50 Java негизги интервью суроолору жана жооптору.  2-1-бөлүк

Коллекциялар

25. Java тorндеги Collections деген эмнени билдирет?

Коллекция - бул an objectтерди сактоо жана башкаруу үчүн иштелип чыккан алHow. Төмөнкү операцияларды аткаруу үчүн колдонулат:
  • издөө;
  • сорттоо;
  • манипуляция;
  • кошумча;
  • жок кылуу.
Коллекция алкагындагы бардык класстар жана интерфейстер пакетте java.util.

26. Коллекция алкагында кандай класстар жана интерфейстер бар?

Интерфейстер:
  • Коллекция;
  • Тизме;
  • Set;
  • карта;
  • Sorted Set;
  • Сортталган карта;
  • Кезек.
Класстар:
  • Тизмелер:
    1. ArrayList;
    2. LinkedList;
    3. Вектор (эскирген).
  • Комплекттер:
    1. HashSet;
    2. LinkedHashSet;
    3. TreeSet.
  • Карталар:
    1. HashMap
    2. TreeMap
    3. HashTable (эскирип калган)
    4. LinkedHashMap
  • Кезек
    1. Приоритеттүү кезек.

27. Коллекцияларда иреттелген жана иреттелген деген эмнени билдирет?

Буйрутма берилген:

Бул коллекцияда сакталган нерселер коллекцияга кошулган баалуулуктарга негизделет дегенди билдирет. Ушундай жол менен биз коллекциядагы баалуулуктарды белгилүү бир тартипте кайталай алабыз. Башкача айтканда, бул коллекциянын элементтери, алар жайгаштырылат, ага ылайык өзүнүн белгилүү бир тартиби бар экенин билдирет. Жакшыраак түшүнүү үчүн, иреттелбеген коллекция өзүнүн элементтерин туш келди тартипте сактайт. Мисалы, Set.

Сорттолгон:

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

28. List интерфейси бар кандай коллекциялар бар? Сиз List менен кантип иштейсиз?

Барактагы элементтердин баалуулуктары алардын индексине негизделген - алар индекс боюнча иреттелген. Элементтердин кайталанышына жол берилет (башкача айтканда, бир эле an objectти коллекцияга бир нече жолу кошсоңуз болот, бул жакшы болот).

ArrayList:

Эң кеңири таралган коллекция. Чындыгында, бул динамикалык түрдө кеңейген өлчөмү бар массив. Массивдин өлчөмүн башкаруу иши коллекцияга жүктөлөт. Көпчүлүк учурда бул биз колдонушубуз керек экенин түшүнүү биз үчүн маанилүү. Өзгөчөлүктөрү:
  • тез издөө жана тез индекс издөө;
  • коллекция индекс боюнча иреттелген, бирок сорттолбойт;
  • RandomAccess интерфейсин ишке ашырат;
  • акырындык менен тизменин ортосуна кошуу.
Мисал:
public class A {

   public static void main(String[] args) {
       ArrayList names = new ArrayList<>();
       names.add("John");
       names.add("John");
       names.add("Roman");
       names.add("Ivan");
   }

}
>> чыгаруу

   [John, John, Roman, Ivan]
Чыгуу бул кайталануучу элементтер экенин көрсөтүп турат. Алар жазылган тартипте көрсөтүлөт. Дагы эмнени окуу керек? Ооба, көп маалымат бар, JavaRushтан чыгуунун деле кереги жок:

Шилтемеленген тизме:

Бул ар бир элементтин мурунку жана кийинки элементтерге шилтемеси бар жыйнак. Бул шилтемелер бир элементтен экинчисине өтүүгө мүмкүндүк берет. Элементти кошууда мурунку жана кийинки элементтерге шилтемелер жөн гана өзгөрөт: Топ 50 Java негизги интервью суроолору жана жооптору.  2-2-бөлүк
  • элементтер бири-бири менен байланышкан, башкача айтканда, кош байланыш тизмеси ишке ашырылат;
  • операциянын жалпы ылдамдыгы ArrayListке караганда байкаларлык төмөн;
  • массивдин ортосуна көп сандагы кыстаруу жана өчүрүүлөр үчүн эң сонун тандоо;
  • Queue жана Deque тизмеси интерфейстерин ишке ашырат, ошондуктан алардын иштөө ыкмаларына ээ.
Мисал:
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("One");
linkedList.add("Two");
linkedList.add("Three");

29. Карта жыйнагы жана анын ишке ашырылышы жөнүндө айтып бериңизчи?

Карта ачкыч-маанилердин жыйнагы. Уникалдуу ачкыч жана ошол мааниге дал келген маани бар. Методдор ачкычтын уникалдуулугун аныктоо үчүн equals()да колдонулат .hashcode()

HashMap:

  • сорттолбогон же иреттелген эмес;
  • тартиби жана сорттоо маанилүү эмес болсо колдонулат;
  • нөл баскычын колдойт.
Мисал:
public class CollectionExample {

   public static void main(String[] args) {
       HashMap positions = new HashMap<>();
       positions.put("junior", "Ivan");
       positions.put("middle", "Roman");
       positions.put("senior", "Vasily");
       positions.put("team lead", "Anton");
       positions.put("arthitect", "Andrew");
       positions.put("senior", "John");
       System.out.println(positions);
   }
}

// вывод в консоль
// {junior=Ivan, middle=Roman, senior=John, team lead=Anton, arthitect=Andrew}
Ачкычтар ар дайым уникалдуу, ошондуктан бир гана улук жазылат.

LinkedHashMap:

  • киргизүү тартибин сактайт;
  • HashMap караганда жайыраак;
  • Итерация HashMapга караганда тезирээк болот деп күтүлүүдө.
Мисал:
public class CollectionExample {

   public static void main(String[] args) {
       LinkedHashMap<String, String> positions = new LinkedHashMap<>();
       positions.put("junior", "Ivan");
       positions.put("middle", "Roman");
       positions.put("senior", "Vasily");
       positions.put("team lead", "Anton");
       positions.put("arthitect", "Andrew");
       positions.put("senior", "John");
       System.out.println(positions);
   }
}

// вывод в консоль
// {junior=Ivan, middle=Roman, senior=John, team lead=Anton, arthitect=Andrew}

TreeMap:

Жазууларды ачкычтарынын табигый тартибине ылайык иреттеп турган картаны ишке ашыруу, же андан да жакшысы, карта түзүлгөндө конструктордо камсыз кылынса, компаратордун жардамы менен. Мисал:
  1. Салыштырмасыз

    public class CollectionExample {
    
       public static void main(String[] args) {
           TreeMap<Integer, String> positions = new TreeMap<>();
           positions.put(1, "Ivan");
           positions.put(3, "Roman");
           positions.put(2, "Vasily");
           positions.put(10, "Anton");
           positions.put(7, "Andrew");
           positions.put(1, "John");
           System.out.println(positions);
       }
    }
    
    // вывод в консоль
    // {1=John, 2=Vasily, 3=Roman, 7=Andrew, 10=Anton}
  2. Салыштыргыч менен

    public class CollectionExample {
    
       public static void main(String[] args) {
           //используем реализацию Strategy Pattern'a и добавим компаратор:
           TreeMap<Integer, String> positions = new TreeMap<>(Comparator.reverseOrder());
           positions.put(1, "Ivan");
           positions.put(3, "Roman");
           positions.put(2, "Vasily");
           positions.put(10, "Anton");
           positions.put(7, "Andrew");
           positions.put(1, "John");
           System.out.println(positions);
       }
    }
    
    // вывод в консоль
    // {10=Anton, 7=Andrew, 3=Roman, 2=Vasily, 1=John}
Өсүү тартибинде сорттоо стандарт катары ишке ашырылганын көрүп жатабыз, бирок муну конструкторго компаратор кошуу менен өзгөртүүгө болот. TreeMap бул жерде жакшы сүрөттөлгөн .

30. Set жыйнагы жана анын ишке ашырылышы жөнүндө айтып бериңизчи?

Set - бул уникалдуу элементтердин жыйындысы жана бул анын негизги өзгөчөлүгү. Башкача айтканда, Set бир эле элементтердин кайталанышына жол бербейт. Бул жерде кошулган an objectтердин ишке ашырылган ыкмасы болушу маанилүү equals .

HashSet:

  • сорттолбогон же иреттелген эмес. Капчыктын астында маани үчүн толтургуч бар HashMap бар. Өзүңүз көрүңүз;)
  • an objectтерди кошуу үчүн hashCode колдонот;
  • Аны уникалдуу an objectтерге ээ болуу керек болгондо колдонуу керек жана алардын тартиби маанилүү эмес.
Мисал:
public class CollectionExample {

   public static void main(String[] args) {
       HashSet<String> positions = new HashSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [senior, middle, team lead, architect, junior]
Бул жерде сиз эки жолу кошулган "кенже" элемент бир гана инстанцияда бар экенин көрө аласыз. Ал эми тартип кошуудагыдай эмес.

LinkedHashSet:

  • HashSetтин иреттелген versionсы;
  • бардык элементтер үчүн эки эселенген тизмени жүргүзөт;
  • Итерацияңызда тартип керек болгондо колдонуңуз.
Мисал:
public class CollectionExample {

   public static void main(String[] args) {
       LinkedHashSet<String> positions = new LinkedHashSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [senior, middle, team lead, architect, junior]

Tree Set:

  • эки сорттолгон коллекциялардын бири;
  • кызыл-кара дарак түзүлүшүн колдонот жана элементтердин өсүү тартибинде болушун камсыздайт;
  • Капоттун астында бул баалуулуктар боюнча такталган TreeMap. Жана TreeSet элементтери TreeMapтын ачкычы болуп саналат (ошондой эле караңыз;)).
Мисал:
public class CollectionExample {

   public static void main(String[] args) {
       TreeSet<String> positions = new TreeSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [architect, junior, middle, senior, team lead]

Өзгөчө учурлар

31. Exception деген эмне?

Exception - бул иштөө убагында пайда болушу мүмкүн болгон көйгөй. Бул кандайдыр бир себептерден улам пайда болгон өзгөчө кырдаал. Өзгөчөлүктү мурастоо диаграммасы ушундай көрүнөт (аны жатка бorшиңиз керек ;)): Топ 50 Java негизги интервью суроолору жана жооптору.  2-3-бөлүкДиаграмма, жалпысынан, бардык өзгөчөлүктөр эки топко бөлүнөрүн көрсөтүп турат - өзгөчөлүктөр жана ката. Ката - JVM'лер каталарды көрсөтүү үчүн колдонулат, андан кийин колдонмонун мааниси жок. Мисалы, StackOverFlowError, анда стек толуп, программа мындан ары иштей алbyte. Exception - codeдо программалык түрдө түзүлгөн өзгөчөлүктөр. Ар кандай өзгөчөлүктөр бар, текшерилген жана текшерилбеген, бирок эң негизгиси, алар бар жана алар кармалып, тиркеме иштей берет. Өзгөчөлүктөр, өз кезегинде, RuntimeException жана башка Exception тукумдарынан мураска алгандарга бөлүнөт. Бул маселе боюнча маалымат жетиштүү. Төмөндө белгиленген/белгисиз өзгөчөлүктөр жөнүндө сүйлөшөбүз.

32. JVM өзгөчө учурларды кантип чечет?

Бул кандай иштейт? Бир жакка өзгөчө учур ташталганда, иштөө убактысы ExcObj катары белгиленет. Ал иш үчүн зарыл болгон бардык маалыматты сактайт - ыргытылган өзгөчөлүктүн өзү жана ал болгон жер. Түзүү ExcObjжана иштөө убактысына өткөрүп берүү "өзгөчө абалды ыргытуудан" башка эч нерсе эмес. ExcObjөзгөчөлүктү таштаган жерге жетүү үчүн колдонула турган ыкмаларды камтыйт. Бул ыкмалар топтому Call Stack деп аталат. Андан кийин, иштөө убактысы системасы Call Stack'тен биздин өзгөчөлүктү чече ала турган ыкманы издейт. Эгерде ал тиешелүү иштеткичти тапса, башкача айтканда, өзгөчө түрү иштеткичтеги түргө дал келсе, баары жакшы. Эгерде ал аны таппаса, анда иштөө убактысы бардыгын демейки өзгөчө иштетүүчүгө өткөрүп берет, ал жооп даярдап, чыгат. Бул көрүнүш мына мындай:
/**
* Пример, в котором показываются две опции — когда находится обработчик для исключения и когда нет.
*/
class ThrowerExceptionExample {

   public static void main(String[] args) throws IllegalAccessException {

       ThrowerExceptionExample example = new ThrowerExceptionExample();

       System.out.println(example.populateString());
   }

   /**
    * Здесь происходит перехват одного из возможных исключений — {@link IOException}.
    * А вот второй будет пробрасываться дальше вверх по вызову.
    */
   private String populateString() throws IllegalAccessException {
       try {
           return randomThrower();
       } catch (IOException e) {
           return "Caught IOException";
       }
   }

   /**
    * Здесь две опции: or бросается {@link IOException} or {@link IllegalAccessException}.
    * Выбирается случайным образом.
    */
   private String randomThrower() throws IOException, IllegalAccessException {
       if (new Random().nextBoolean()) {
           throw new IOException();
       } else {
           throw new IllegalAccessException();
       }
   }
}
Биздин учурда, CallStack схемалык түрдө төмөнкүдөй болот:

randomThrower() => populateString() => main(String[] args)
Эки вариант бар: бир же башка өзгөчөлүк туш келди ыргытылат. IOException үчүн баары жакшы, эгерде ал түзүлсө, анда иштин натыйжасы болот: "Caught IOException". Бирок, иштетүүчүсү жок экинчи өзгөчөлүк болсо, программа төмөнкү натыйжа менен токтойт:

Exception in thread "main" java.lang.IllegalAccessException
  at ThrowerExceptionExample.randomThrower(CollectionExample.java:38)
  at ThrowerExceptionExample.populateString(CollectionExample.java:24)
  at ThrowerExceptionExample.main(CollectionExample.java:15)

33. Программисттер өзгөчө учурларды кантип чечишет?

Жогорудагы суроолордо биз буга чейин айрым ачкыч сөздөрдү өзгөчө учурлар менен иштөө үчүн колдонгонбуз, эми алар жөнүндө кененирээк сөз кылышыбыз керек. Ачкыч сөздөр кандай?
  • аракет кыл
  • кармоо
  • ыргытуу
  • ыргытат
  • акыры
Белгилей кетчү нерсе, кармоо, ыргытуу жана ыргытуу java.lang.Throwable менен гана колдонулушу мүмкүн. Бул башка түрлөрү менен иштебейт. Эми биз аракет кылабыз, кармайбыз жана акырында талкуулайбыз.
  • try-catch-finallyөзгөчө учурду туура кармоого жана иштетүүгө мүмкүндүк берүүчү конструкция.
  • try- бир гана жолу болушу мүмкүн, логика ошол жерде болот;
  • catch— кандайдыр бир өзгөчөлүктү кабыл алган блок; алардын көбү болушу мүмкүн. Мисалы, аракет блогу бири-бирине эч кандай тиешеси жок бир нече өзгөчөлүктү ыргытат;
  • finally- "акыры" бул блок. Бул аракет, кармоодо эмне жасалганына карабастан, кандай болгон күндө да аткарыла турган блок.
Бул көрүнүш мына мындай:
try {
   // сюда передают тот code, который может вызвать исключение.
} catch (IOException e) {
   // первый catch блок, который принимает IOException и все его подтипы(потомки).
   // Например, нет file при чтении, выпадает FileNotFoundException, и мы уже соответствующе
   // обрабатываем это.
} catch (IllegalAccessException e) {
   // если нужно, можно добавить больше одного catch блока, в этом нет проблем.
} catch (OneException | TwoException e) {
   // можно даже объединять несколько в один блок
} catch (Throwable t) {
   // а можно сказать, что мы принимаем ВСЁ))))
} finally {
   // этот блок может быть, а может и не быть.
   // и он точно выполнится.
}
Кылдаттык менен мисалдын сүрөттөмөсүн окуп чыгыңыз жана баары түшүнүктүү болот)

34. Java менен ыргытуу жана ыргытуу

ыргытуу

throwачык түрдө жаңы өзгөчөлүктү түзүү керек болгондо колдонулат. Бул өзгөчөлүктөрдү түзүү жана ыргытуу үчүн колдонулат. Мисалы, валидацияга байланыштуу өзгөчөлүктөр. Адатта, текшерүү үчүн алар мураска алышат RuntimeException. Мисал:
// пример пробрасывания исключения
throw new RuntimeException("because I can :D");
Бул курулушту мураска калган нерсе гана колдоно ала турганы маанилүү Throwable. Башкача айтканда, сиз муну айта албайсыз:
throw new String("How тебе такое, Илон Маск?");
Андан кийин жиптин иши токтотулуп, аны иштете ала турган иштеткичти издөө башталат. Аны таппай калганда, ал аны чакырган ыкмага өтөт, ошондуктан издөө тиешелүү иштеткичти тапканга чейин же тиркемени иштеп калганга чейин чалуулардын линиясында көтөрүлөт. Кел карайбыз:
// Пример, который демонстрирует работу throw
class ThrowExample {

   void willThrow() throws IOException {
       throw new IOException("Because I Can!");
   }

   void doSomething() {
       System.out.println("Doing something");
       try {
           willThrow();
       } catch (IOException e) {
           System.out.println("IOException was successfully handled.");
       }
   }

   public static void main(String args[]) {
       ThrowExample throwExample = new ThrowExample();
       throwExample.doSomething();
   }
}
Эгерде биз программаны иштетсек, төмөнкү натыйжаны алабыз:

Doing something
IOException was successfully handled.

ыргытат

throws— метод бир же бир нече өзгөчөлүктү таштай турган механизм. Алар үтүр менен бөлүнгөн. Келгиле, бул канчалык жеңил жана жөнөкөй экенин карап көрөлү:
private Object willThrow() throws RuntimeException, IOException, FileNotFoundException
Мындан тышкары, белгилей кетүү маанилүү, бул жерде текшерилген жана текшерилбеген өзгөчөлүктөр болушу мүмкүн. Албетте, белгиленбеген өзгөчөлүктөр кошулбашы мүмкүн throws, бирок адеп-ахлак башкасын айтат. Эгерде бул текшерилүүчү болсо, анда аларды түзгөн ыкманы колдонуп, кандайдыр бир жол менен аны иштетүү керек. Эки вариант бар:
  1. try-catchТийиштүү жана жогорудагы мурас өзгөчөлүгү менен жазыңыз .
  2. Башка бирөө бул көйгөйгө ээ болушу үчүн аны throwsдал ушундай колдонуңуз: D

35. Java'да текшерилген жана текшерилбеген өзгөчөлүктөр

Java'да эки түрдүү өзгөчөлүктөр бар - белгиленген жана белгиленбеген.

Текшерилген өзгөчөлүктөр:

Бул компиляция убагында текшерилет өзгөчө учурлар. Эгерде методдогу кандайдыр бир code өзгөчө учур учурунда текшерилген өзгөчөлүктү ыргытса, метод аны же аркылуу иштетиши try-catchже андан ары багыттоосу керек. Мисалы, "/users/romankh3/image.png" жолдон сүрөттү окуган, аны жаңылайт. кандайдыр бир жол менен (биз үчүн бул маанилүү эмес) жана аны кайра сактап калат.
class CheckedImageExample {
   public static void main(String[] args) {
       File imageFile = new File("/users/romankh3/image.png");
       BufferedImage image = ImageIO.read(imageFile);
       updateAndSaveImage(image, imageFile);
   }

   private static void updateAndSaveImage(BufferedImage image, File imageFile) {
       ImageIO.write(image, "png", imageFile);
   }
}
Мындай code компиляцияланbyte, анткени статикалык методдор IOException ImageIO.read()ыргытат , ал текшерилет жана ошого жараша иштетorши керек. ImageIO.write()Бул жерде биз жогоруда талкуулаган эки вариант бар: же колдонуңуз try-catch, же андан ары алдыга жылдырыңыз. Жакшыраак ассимиляция үчүн биз муну жана тигини кылабыз. Башкача айтканда, updateAndSaveбиз аны жөн гана ыкмада жөнөтөбүз, анан аны негизги ыкмада колдонобуз try-catch:
class CheckedImageExample {
   public static void main(String[] args) {
       File imageFile = new File("/users/romankh3/image.png");
       try {
           BufferedImage image = ImageIO.read(imageFile);
           updateAndSaveImage(image, imageFile);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

   private static void updateAndSaveImage(BufferedImage image, File imageFile) throws IOException {
       ImageIO.write(image, "png", imageFile);
   }
}

Текшерилбеген өзгөчөлүктөр:

Бул компиляция стадиясында текшерилбеген өзгөчөлүктөр. Башкача айтканда, метод RuntimeException түзө алат, бирок компилятор аны кандайдыр бир жол менен иштетүүнү эскертпейт. Төмөндө көрсөтүлгөндөй, бизде RuntimeException жана Катадан мураска алынган нерселердин баары бар. Топ 50 Java негизги интервью суроолору жана жооптору.  2-4-бөлүкТөмөнкү Java программасын карап көрөлү. Код жакшы түзүлөт, бирок иштетилгенде өзгөчө учурду жаратат ArrayIndexOutOfBoundsException. Компилятор аны компиляциялоого мүмкүндүк берет, анткени ArrayIndexOutOfBoundsExceptionбул текшерилбеген өзгөчөлүк. Массивдеги жалпы кырдаал, ал төмөнкүлөр болушу мүмкүн:
class CheckedImageExample {
   public static void main(String[] args) {
       int[] array = new int[3];
       array[5] = 12;
   }
}
натыйжасы болот:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
  at main(CheckedImageExample.java:12)
Баса, Javaда эч ким кыска ысымдарды бербестигин байкадыңызбы? Канчалык чоң болсо, ошончолук жакшы. Ал, Spring Framework, бул жагынан абдан ийгorктүү болду: жөн гана BeanFactoryPostProcessor классын алыңыз)))

36. Ресурстар менен аракет кылуу деген эмне?

Бул бардык ресурстарды туура жабуу керек болгон механизм. Бул кандайдыр бир түшүнүксүз, туурабы?) Биринчиден, ресурс деген эмне... Ресурс – бул an object, аны менен иштегенден кийин аны жабуу керек, башкача айтканда, close(). Ресурс интерфейсти ишке ашырган бардык an objectтерге тиешелүү AutoClosable, ал өз кезегинде интерфейсти ишке ашырат Closeable. InputStreamБиз үчүн бардыгы ресурс экенин OutpuStreamжана аны туура жана ийгorктүү чыгаруу керектигин түшүнүү маанилүү . try-with-resourceМына ушундан улам биз структураны колдонушубуз керек . Ал кандай көрүнөт:
private void unzipFile(File zipFile) throws IOException {
   try(ZipInputStream zipOutputStream = new ZipInputStream(new FileInputStream(zipFile))) {
       ZipEntry zipEntry = zipOutputStream.getNextEntry();
       while (zipEntry != null) {

       }
   }
}

private void saveZipEntry(ZipEntry zipEntry) {
   // логика сохранения
}
Бул мисалда ресурс болуп саналат ZipInputStream, аны менен иштегенден кийин аны жабуу керек. Ал эми методду чакыруу жөнүндө ойлонбош үчүн close(), биз бул өзгөрмөнү мисалда көрсөтүлгөндөй, аракет блогунда аныктайбыз жана бул блоктун ичинде биз керектүү нерселердин баарын жасайбыз. Мисал эмне кылат? Ал ZIP архивин ачат. Бул үчүн сиз 'om колдонушуңуз керек InputStream. Сиз бир нече өзгөрмө аныктай аласыз; алар чекиттүү үтүр менен бөлүнгөн. көйгөй эмнеде? finallyБирок сиз блокту колдоно аласыз , сиз айта аласыз. Бул жерде бул ыкманын көйгөйлөрүн чагылдырган макала бар . Ал ошондой эле бул дизайнды колдонууга кайдыгер караган адамдын башына келе турган мүчүлүштүктөрдүн толук тизмесин сүрөттөйт. Мен аны окууну сунуштайм;) Жыйынтыктоочу бөлүгүндө Multithreading темасы боюнча суроолор/жооптор бар. Менин GitHub профorм
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION