JavaRush /Java блогы /Random-KK /Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына ж...
zor07
Деңгей
Санкт-Петербург

Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар. 1-бөлім. 1-5, 10 сұрақтар.

Топта жарияланған
Деңгей 26. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар.  1-бөлім. 1-5, 10 сұрақтар. - 1Түйіндеме өте қиын болып шықты, сондықтан мен оны екі бөлікке бөлдім. Екінші бөлімде канкаренция және көп ағындылыққа қатысты сұрақтарға жауаптар бар. Бірінші бөлімде қалғандары бар. Жазу өте қиын болды. Мен әлі көп нәрсені түсінбеймін, сондықтан әрқашан түсініктемелер, ескертулер, толықтырулар қабылданады)

1. Салыстырмалы интерфейсті қалай пайдалануға болады?

Интерфейс Comparableтек бір әдісті жариялайды compareTo(Object obj), сынып нысандарының ретін енгізуге арналған. Ол an objectілердің реттелген тізімдерін немесе массивтерін сұрыптау кезінде қолдануға ыңғайлы. Бұл әдіс шақырылған нысанды салыстырады an object. true немесе false мәнін қайтаратын equalsәдістен айырмашылығы мынаны қайтарады: compareTo
  • 0 мәндері тең болса;
  • Теріс мән, егер шақырушы параметрден аз болса;
  • Қоңырау шалушы параметрден үлкен болса, оң.
Ол ең алдымен реттелген тізімдерді ( java.util.List) және нысандар массивтерін сұрыптау үшін пайдалы. Тізімде/массивте осы интерфейсті жүзеге асыратын элементтер болса, оларды автоматты түрде 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 сәйкесінше у алдында немесе кейін болса. Егер әдіс 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(еске сала кетейін, ол falsex.equals(null) қайтарады ).
  • Егер 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). Интерфейсті пайдаланған кезде Comparatoran objectілер жұбын салыстыру логикасы сынып/нысан ішінде жасырын емес, бірақ бөлек сыныпта жүзеге асырылады. Әдіс compare(x,y)қоңыраумен бірдей x.compareTo(y). compareTo(Object)Барлық ережелерді интерфейс әдісін енгізу ережелерімен бірдей орындау керек Comparable. Comparatorсұрыптау қажет кез келген жерде қолдануға болады. Бұл жағдайда, біріншіден, қажетті икемділік пайда болады - бірнеше сұрыптау ережелерін жүзеге асыру мүмкіндігі. Екіншіден, сұрыпталатын нысандар орындамауы мүмкін Comparable. Егер олар оны жүзеге асырса, Comparatorол басымдыққа ие болады. Интерфейс Comparatorсонымен қатар әдісті анықтайды equals(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) Екі әдіс екілік іздеу алгоритмі арқылы параметрде жіберілген нысан үшін параметрде жіберілген тізімді іздейді. Тізімде мұндай элемент болса, элементтің индексін қайтарады, әйтпесе -нен үлкен тізімнің бірінші элементінің индексі 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біз өзімізді бірінші және екінші мәселелерден құтқара аламыз, өйткені бұл әдіс орындау уақытында тексерілетін жинақты жасайды. Осы әдіс арқылы №2 есепті шешу: Мысалы, бізде мынау бар, ол шығып қалды 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) әдістер «табиғи рет» (Салыстырмалы интерфейс) немесе өткізілген компаратордың реті тұрғысынан жинақтағы минималды/максималды элементті қайтарады. Жинақтардың бірдей элементтері болмаса, true мәнін 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 класының әдістерінің толық тізімін құжаттамада көруге болады . Бұл түйіндемеде мен олардың бірнешеуін ғана келтіремін. [құжаттамадағы әдістерді аудардым және өкінішке орай аудармамның көп бөлігін жоғалтты. Бұл ұят және мен дәл сол нәрсеге уақытты жоғалтқым келмейді, сондықтан мен 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]
Егер массив нысандарды қамтыса, массив де, тізім де бірдей даналарға сілтеме жасайтыны анық:
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 типтерінің массивтеріндегі мәнді екілік іздеуді ұйымдастырудың шамадан тыс жүктелген әдісі. Бірінші сәйкестіктің орнын қайтарады; void fill(параметры)– массивтерді әртүрлі типтегі және примитивтердің мәндерімен толтырудың шамадан тыс жүктелген әдісі; void sort(параметрлер) – компаратор интерфейсін пайдаланып және онсыз массивті немесе оның бір бөлігін сұрыптаудың шамадан тыс жүктелген әдісі; 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 тілінің 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