JavaRush /Java блогу /Random-KY /26-деңгээл. Деңгээлдеги тема боюнча интервью суроолоруна ...
zor07
Деңгээл
Санкт-Петербург

26-деңгээл. Деңгээлдеги тема боюнча интервью суроолоруна жооптор. 1-бөлүк. 1-5, 10-суроолор.

Группада жарыяланган
26-деңгээл. Деңгээлдеги тема боюнча интервью суроолоруна жооптор.  1-бөлүк. 1-5, 10-суроолор. - 1Жыйынтык бир топ түйшүктүү болуп чыкты, ошондуктан мен аны эки бөлүккө бөлдүм. Экинчи бөлүктө kankarency жана multithreading боюнча суроолорго жооп бар. Биринчи бөлүгү калганын камтыйт. Жазуу абдан кыйын болду. Мен дагы деле көп нерсени түшүнбөйм, андыктан ар дайымкыдай комментарийлер, эскертүүлөр, толуктоолор кабыл алынат)

1. Салыштырылуучу интерфейсти кантип колдонсо болот?

Интерфейс класс an objectилеринин тартибин ишке ашыруу үчүн иштелип чыккан Comparableбир гана методду жарыялайт . compareTo(Object obj)Ал an objectтердин иреттелген тизмелерин же массивдерин сорттоодо колдонууга ыңгайлуу. Бул ыкма чакырылган an object менен салыштырылат обж. true же false equals кайтарган методдон айырмаланып , кайтарып берет: compareTo
  • 0 эгерде маанилер бирдей болсо;
  • Эгерде чалуучу параметрден аз болсо, терс маани;
  • Эгер чалуучу параметрден чоңураак болсо, оң.
Ал биринчи кезекте java.util.Listan objectтердин иреттелген тизмелерин ( ) жана массивдерин сорттоо үчүн пайдалуу. Эгерде тизмеде/массивде бул интерфейсти ишке ашыруучу элементтер бар болсо, анда алар автоматтык түрдө java.util.Collections.sort(List)/Arrays.sort(Object[]). Табигый иреттөө түшүнүгү интерфейс менен байланышкан Comparable, анткени ал бул интерфейсти ишке ашырган ар кандай класстын мисалдары үчүн табигый тартипти орнотот. Башкача айтканда, тартип (x, y) шарттын аткарылышына туура келет x.compareTo(y) <= 0. Ишке ашыруу эрежелери Comparable, тагыраак айтканда, анын ыкмасы compareTo(Object)төмөнкүдөй (x жана y - ишке ашырган класстын мисалдары Comparable):
  • x.compareTo(y)-1 же 1 кайтарат, эгерде x тиешелүүлүгүнө жараша y алдында же кийин болушу керек. Эгерде метод 0 кайтарса, анда буйруктар (x, y) жана (y, x) эквиваленттүү.
  • Эгерде sign(a)а үчүн -1,0,1 кайтаруучу функция болсо, тиешелүүлүгүнө жараша 0дөн кичине, 0гө барабар жана 0дөн чоңу болсо, анда теңдик аткарылышы керек sign(x.compareTo(y))==-sign(y.compareTo(x)). Бул логикалуу: эгерде х удан мурун келсе, анда у хтан кийин келиши керек жана тескерисинче.
  • Эгерде x.compareTo(y) > 0жана болсо y.compareTo(z) > 0, анда x.compareTo(z) > 0– теңсиздиктердин өтмөлүүлүгүнүн катышы.
  • Эгерде x.compareTo(y) == 0, анда sign(x.compare(z)) == sign(y.compareTo(z)), каалаган z үчүн.
  • Чалуу x.compareTo(null)өзгөчө учурду жаратышы керек NullPointerException. Бул ишке ашыруу логикасына дал келбегендик equals(эске сала кетейин, x.equals(null)ал false кайтарып берет ).
  • Эгерде y түрүн x менен салыштыруу мүмкүн болбосо, анда чалуу x.compareTo(y)өзгөчө учурду ташташы керек ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y), б.а. чалуу x.compareTo(y)0 кайтарышы керек, эгерде x.equals(y)ал чын болсо гана . Бул ырааттуулуктун эрежеси жана эске алуу абдан маанилүү.
Булактары:

2. Comparator интерфейсин кантип колдонуу керек?

Интерфейс Comparatorэки ыкманы жарыялайт compare(Object obj1, Object obj2)жана equals(Object obj). Интерфейсти колдонууда Comparator, жуп an objectтерди салыштыруу логикасы класстын/an objectтин ичинде жашырылbyte, бирок өзүнчө класста ишке ашырылат. Метод compare(x,y)чалууга так эле окшош x.compareTo(y). compareTo(Object)Бардык эрежелер интерфейс ыкмасын ишке ашыруу эрежелериндей так аткарылышы керек Comparable. Comparatorсорттоо керек болгон жерде колдонсо болот. Бул учурда, биринчиден, керектүү ийкемдүүлүк пайда болот - бир нече сорттоо эрежелерин ишке ашыруу мүмкүнчүлүгү. Экинчиден, сорттолгон an objectтер Comparable. Эгерде алар аны ишке ашырышса, Comparatorанда ал артыкчылыкка ээ. Интерфейс дагы парадоксалдуу көрүнгөн Comparatorыкманы аныктайт . equals(Object)Бул ыкма интерфейс инстанцияларынын өзүн салыштырат жана салыштырылып жаткан an objectтер бирдей сорт тартибин камсыз кылганда гана чындыкты Comparator кайтарышы керек . Бирок, баштапкы ишке ашырууну сактап калуу ар дайым коопсуз Булак : Object.equals(Object)

3. Collections классында кандай методдор бар?

public static <T> boolean addAll(Collection<? super T> c, T... elements) Метод elementsколлекцияга массивдин элементтерин кошот Collection<? super T> c. Элементтер өзүнчө же массив катары көрсөтүлүшү мүмкүн. Элементтер өз-өзүнчө көрсөтүлгөндө, бул ыкма бардык элементтерди учурдагы коллекцияга ыңгайлуу кошуу мүмкүнчүлүгүн камсыз кылат: Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) Эки ыкма тең экorк издөө алгоритминин жардамы менен параметрде өткөн an object үчүн параметрде өткөн тизмеден издейт. Тизмеде ушундай элемент бар болсо, элементтин индексин кайтарат, антпесе тизменин биринчи элементинин индексинен чоңураак key, эгерде бардык элементтер тен кичине болсо key, кайтарат list.size(). Бул ыкмаларды колдонуудан мурун тизмелер иреттелиши керек. Биринчи учурда, алар тизменин элементтеринин "табигый" тартибинде өсүү тартибинде иргелет (колдонгондогудай эле Collections.sort(list)). Экинчи учурда тизме өткөн компаратор тарабынан берилген тартипте өсүү тартибинде иреттелиши керек (колдонгондогудай тартип Collections.sort(list, c)[бул жерде “мен” – сүрөттөлгөн ыкманын параметрлеринен салыштыруучу]) public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) Преамбула: генериктердин механизми тилде компиляция убактысынын түрүн текшерүүнү камсыз кылат. Адатта, бул жетиштүү, бирок андай эмес учурлар да болот. Мисалы, биз коллекциябызды бизге белгисиз болгон китепкана codeуна өткөрүп беребиз жана бул “үчүнчү тараптын китепканасынын” codeу биздин коллекциябызга туура эмес түрдөгү элементти киргизбөөсүн каалайбыз. Бул мүмкүн болгон көйгөй №1. Мүмкүн болгон №2 көйгөй төмөндөгүдөй. ClassCastException Биздин программа бизге туура эмес түрдөгү элемент коллекцияга киргизилгенин кабарлаган билдирүүнү берет дейли . Тилекке каршы, бул өзгөчөлүк туура эмес элемент киргизилгенден кийин каалаган убакта ташталышы мүмкүн жана адатта бизге көйгөйдүн булагы жөнүндө аз же такыр маалымат бербейт. Метод ыкмасын колдонуу менен checkedCollectionбиз өзүбүздү биринчи жана экинчи көйгөйлөрдөн сактай алабыз, анткени бул ыкма иштөө учурунда текшерилүүчү коллекцияны түзөт. Экинчи маселени ушул ыкманы колдонуу менен чечүү: Мисалы, бизде бул бар жана ал чыгып кетти ClassCastException.
Collection<String> c = new HashSet<String>();
Жогорудагы code убактылуу менен алмаштырылышы мүмкүн:
Collection<String> c = Collections.checkedCollection(
         new HashSet<String>(), String.class);
Программаны кайра иштеткенде, биз коллекциябызга туура эмес түрдөгү элементти киргизген code сабын локализациялайбыз. Менин оюмча байланыштуу ыкмалар: public static <E> List<E> checkedList(List<E> list,Class<E> type) public static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType,Class<V> valueType) public static <E> Set<E> checkedSet(Set<E> s,Class<E> type) public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m,Class<K> keyType,Class<V> valueType) public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,Class<E> type) public static <T> void copy(List<? super T> dest,List<? extends T> src) Метод src элементтерин destке көчүрөт. көчүрүлгөн элементтердин индекстери бирдей болот. public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) public static <T> T min(Collection<? extends T> coll,Comparator<? super T> comp) public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp) ыкмалар коллекциядагы минималдуу/максималдуу элементти "табигый тартип" (Салыштырлуучу интерфейс) же өткөн салыштыргычтын тартиби боюнча кайтарат. Коллекцияларда окшош элементтер жок болсо, чындыкты public static boolean disjoint(Collection<?> c1,Collection<?> c2) кайтарат . – тиешелүүлүгүнө жараша бош тизмени, картаны жана топтомду кайтаруу; – тизмени берилген элемент менен толтурат; – коллекцияда берилген элементтин кайталануу санын кайтарат; – n көрсөтүлгөн элементтердин тизмесин кайтарат ; – бардык көрсөтүлгөн элементтерди жаңылары менен алмаштырат; – тизмени “тескери” түзөт; – тизмени цикл боюнча элементтердин белгиленген санына жылдырат; – тизменин элементтерин аралаштырат; – бир элементтен турган картаны, тизмени жана көрсөтүүнү түзүү; – тизмени табигый тартипте иреттөө жана ошого жараша колдонуу; – тизменин элементтерин белгиленген позицияларга алмаштырат. Булактары: <T> List <T> emptyList(), <K,V> Map <K,V> emptyMap(), <T> Set <T> emptySet() <T> void fill(List<? super T> list, T obj) int frequency(Collection<?> c, Object o) <T> List <T> nCopies(int n, T o) <T> boolean replaceAll(List<T> list, T oldVal, T newVal) void reverse(List<?> list) void rotate(List<?> list, int distance) void shuffle(List<?> list) <T> Set <T> singleton(T o), singletonList(T o), singletonMap(K key, V value) <T extends Comparable<? super T>> void sort(List<T> list), <T> void sort(List<T> list, Comparator<? super T> c) Comparator void swap(List<?> list, int i, int j)

4. Arrays классынын кандай методдору бар?

Arrays классынын методдорунун толук тизмесин documentациядан көрүүгө болот . Бул резюмеде мен алардын айрымдарын гана келтирем. [documentтерден методдорду которгон жана тилекке каршы котормолорумдун көбүн жоготту. Бул уят, мен бир эле нерсеге убакыт короткум келбейт, андыктан мен Google издегенимди чаптайм] public static <T> List<T> asList(T... a) массивдин негизинде тизме түзөт. Массив тизменин ички көрүнүшү үчүн колдонулат. Бул тизме менен баштапкы массивдин ортосундагы байланышты сактайт: массивдеги өзгөрүүлөр тизмеде чагылдырылат:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

a[0] = "aaa";
System.out.println(list); // [aaa, bar, baz]
тизмедеги өзгөрүүлөр массивде чагылдырылат:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

list.set(0, "bbb");
System.out.println(Arrays.toString(a)); // [bbb, bar, baz]
Эгерде массив an objectтерди камтыса, массив да, тизме дагы бирдей учурларга кайрылат:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0)); // true
int binarySearch(параметры)– примитивдүү жана an objectтик типтеги массивдердеги маанини экorк издөөнү уюштуруунун ашыкча жүктөлгөн ыкмасы. Биринчи дал келген позицияны кайтарат; void fill(параметры)– ар кандай типтеги жана примитивдердин маанилери менен массивдерди толтуруунун ашыкча жүктөлгөн ыкмасы; void sort(параметрлер) – массивди же анын бир бөлүгүн Comparator интерфейсинин жардамы менен жана ансыз сорттоо үчүн ашыкча жүктөлгөн ыкма; static <T> T[] copyOf(T[] original, int newLength)– белгилүү бир узундуктагы массивди толтурат, элементтерди жокко чыгарат же зарыл болсо нөл менен толтурат; static <T> T[] copyOfRange(T[] original, int from, int to)– массивдин көрсөтүлгөн аянтын жаңы массивге көчүрөт; <T> List<T> asList(T… a)– массивдин элементтерин List<T> түрүндөгү an objectке көчүрүүчү ыкма. Булак:

5. Collections.sort() чакырганда колдонулган сорттун аты кандай?

Документтен : Ишке ашыруу Тим Петерстин Python тизмек түрүнүн (TimSort) адаптациясы. Бул ишке ашыруу тизмени массивге таштайт, массивди иреттейт, андан кийин тизмени кайталайт жана ар бир тизме элементин тиешелүү массив элементинен кайра жүктөйт. Бул шилтемеленген тизмени түздөн-түз иреттөө аракетинен келип чыккан n*n log(n) татаалдыгынан качат. Викиден : Timsort — 2002-жылы Тим Питерс тарабынан басылып чыккан кыстаруу жана бириктирүү сортторун бириктирген гибрид сорттоо алгоритми. Timsort учурда Python, OpenJDK 7де стандарттуу сорттоо алгоритми жана Android JDK 1.5те ишке ашырылган. Алгоритмдин негизги идеясы чыныгы дүйнөдө сорттолуучу маалымат массивдеринде көбүнчө иреттелген ички массивдер болот. Мындай маалыматтар боюнча, Timsort көптөгөн сорттоо алгоритмдерине караганда бир кыйла ылдамыраак.

10. Итератор деген эмне?

Java тorнин JDK 1.2 релизинде киргизилген интерфейс java.util.Iteratorконтейнер класстарын итерациялоого мүмкүндүк берет. Ар бир Итератор ыкмаларды ишке ашырат next()жана hasNext()ыктыярдуу түрдө remove(). Итераторлор тиешелүү контейнер класстары тарабынан түзүлөт, адатта iterator(). Метод next()итераторду кийинки мааниге жылдырат жана көрсөтүлгөн маанини кайталоочуга кайтарат. Башында түзүлгөндө, итератор биринчи элементтин алдындагы өзгөчө маанини көрсөтөт, андыктан биринчи элементти биринчи чакыруудан кийин гана алууга болот next(). Контейнердеги бардык элементтер итерацияланган учурду аныктоо үчүн сыноо ыкмасы колдонулат hasNext(). Төмөнкү мисал итераторлорду жөнөкөй колдонууну көрсөтөт:
Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator(); в J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());
Муну колдогон типтүү коллекция үчүн, итератор ыкмасы remove()контейнерден акыркы "зыярат кылган" элементти алып салат. Итерация учурунда контейнерди өзгөртүүнүн дээрлик бардык башка түрлөрү кооптуу. Кошумчалай кетсек, for окшош API менен java.util.Listбар java.util.ListIterator, бирок алдыга жана артка итерацияга мүмкүндүк берет, тизмедеги учурдагы индекстин аныктамасын камсыз кылат жана анын орду боюнча элементке жылат. Булак: 2 бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION