JavaRush /Java blogi /Random-UZ /26-daraja. Daraja mavzusi bo'yicha suhbat savollariga jav...
zor07
Daraja
Санкт-Петербург

26-daraja. Daraja mavzusi bo'yicha suhbat savollariga javoblar. 1-qism. 1-5, 10-savollar.

Guruhda nashr etilgan
26-daraja. Daraja mavzusi bo'yicha suhbat savollariga javoblar.  1-qism. 1-5, 10-savollar. - 1Xulosa juda og'ir bo'lib chiqdi, shuning uchun men uni ikki qismga ajratdim. Ikkinchi bo'limda kankarentlik va ko'p ish zarralariga oid savollarga javoblar mavjud. Birinchi qism qolganlarini o'z ichiga oladi. Yozish juda qiyin edi. Men hali ham ko'p narsani tushunmayapman, shuning uchun har doimgidek, sharhlar, izohlar, qo'shimchalar qabul qilinadi)

1. Taqqoslanadigan interfeysdan qanday foydalaniladi?

Interfeys Comparablefaqat bitta usulni e'lon qiladi compareTo(Object obj), sinf ob'ektlarini tartiblashni amalga oshirish uchun mo'ljallangan. Ob'ektlarning tartiblangan ro'yxatlarini yoki massivlarini saralashda foydalanish qulay. Bu usul chaqirilgan ob'ektni bilan solishtiradi obj. true yoki false equals ni qaytaradigan usuldan farqli o'laroq , qaytaradi: compareTo
  • qiymatlar teng bo'lsa 0;
  • Qo'ng'iroq qiluvchi parametrdan kichik bo'lsa, salbiy qiymat;
  • Qo'ng'iroq qiluvchi parametrdan katta bo'lsa, ijobiy.
java.util.ListBu, birinchi navbatda, tartiblangan ro'yxatlar ( ) va ob'ektlar massivlarini saralash uchun foydalidir . Agar ro'yxat/massiv ushbu interfeysni amalga oshiradigan elementlarni o'z ichiga olsa, ular avtomatik ravishda java.util.Collections.sort(List)/Arrays.sort(Object[]). Tabiiy tartiblash tushunchasi interfeys bilan bog'liq Comparable, chunki u ushbu interfeysni amalga oshiradigan har qanday sinf misollari uchun tabiiy tartibni o'rnatadi. Boshqacha qilib aytganda, tartib (x, y) shartning bajarilishiga mos keladi x.compareTo(y) <= 0. Amalga oshirish qoidalari Comparable, aniqrog'i, uning usuli compareTo(Object)quyidagicha (x va y -ni amalga oshiradigan sinf misollari Comparable):
  • x.compareTo(y)Agar x mos ravishda y dan oldin yoki keyin bo'lishi kerak bo'lsa -1 yoki 1 ni qaytaradi. Agar usul 0 ni qaytarsa, u holda (x, y) va (y, x) tartiblari ekvivalentdir.
  • Agar sign(a)funktsiya a uchun -1,0,1 qaytaradigan bo'lsa, mos ravishda 0 dan kichik, 0 ga teng va 0 dan katta bo'lsa, tenglik bajarilishi kerak sign(x.compareTo(y))==-sign(y.compareTo(x)). Bu mantiqiy: agar x y dan oldin kelsa, u holda y x dan keyin kelishi kerak va aksincha.
  • Agar x.compareTo(y) > 0va bo'lsa y.compareTo(z) > 0, u holda x.compareTo(z) > 0- tengsizliklarning tranzitivlik munosabati.
  • Agar x.compareTo(y) == 0, u holda sign(x.compare(z)) == sign(y.compareTo(z))har qanday z uchun.
  • Qo'ng'iroq x.compareTo(null)istisno qilish kerak NullPointerException. Bu amalga oshirish mantig'i bilan nomuvofiqlikdir equals(sizga eslatib o'taman, x.equals(null)u false ni qaytaradi ).
  • Agar y turini x bilan taqqoslab bo'lmasa, qo'ng'iroq x.compareTo(y)istisno qilishi kerak ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y), ya'ni. qo'ng'iroq x.compareTo(y)0 ni qaytarishi kerak, agar va faqat rostx.equals(y) bo'lsa . Bu izchillik qoidasi va e'tiborga olish juda muhimdir.
Manbalar:

2. Comparator interfeysidan qanday foydalaniladi?

Interfeys Comparatorikkita usulni e'lon qiladi compare(Object obj1, Object obj2)va equals(Object obj). Interfeysdan foydalanganda Comparator, bir juft ob'ektni taqqoslash mantig'i sinf/ob'ekt ichida yashirin emas, balki alohida sinfda amalga oshiriladi. Usul compare(x,y)qo'ng'iroq bilan mutlaqo bir xil x.compareTo(y). compareTo(Object)Barcha qoidalar, interfeys usulini amalga oshirish qoidalari bilan bir xil tarzda bajarilishi kerak Comparable. Comparatorsaralash zarur bo'lgan har qanday joyda ishlatilishi mumkin. Bunday holda, birinchi navbatda, kerakli moslashuvchanlik paydo bo'ladi - bir nechta tartiblash qoidalarini amalga oshirish qobiliyati. Ikkinchidan, tartiblangan ob'ektlar Comparable. Agar ular buni amalga oshirsalar, Comparatoru ustuvor ahamiyatga ega. Interfeys , shuningdek , paradoksal tuyulishi mumkin bo'lgan Comparatorusulni belgilaydi . equals(Object)Bu usul interfeys misollarini solishtiradi va solishtirilayotgan ob'ektlar bir xil tartiblash tartibini ta'minlasagina, true Comparator qiymatini qaytarishi kerak . Biroq, asl dasturni buzilmasdan qoldirish har doim xavfsizdir Manba: Object.equals(Object)

3. Collections sinfida qanday usullar mavjud?

public static <T> boolean addAll(Collection<? super T> c, T... elements) Usul elementsto'plamga massiv elementlarini qo'shadi Collection<? super T> c. Elementlar alohida yoki massiv sifatida belgilanishi mumkin. Elementlar alohida ko'rsatilganda, bu usul barcha elementlarni mavjud to'plamga qulay tarzda qo'shish imkoniyatini beradi: 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) Ikkala usul ham ikkilik qidiruv algoritmi yordamida parametrda o'tgan ob'ekt uchun parametrda o'tkazilgan ro'yxatni qidiradi. Ro'yxatda shunday element mavjud bo'lsa, element indeksini qaytaradi, aks holda ro'yxatning birinchi elementining indeksi dan katta key, agar barcha elementlar kichik bo'lsa key, ni qaytaradi list.size(). Ushbu usullarni qo'llashdan oldin ro'yxatlarni tartiblash kerak. Birinchi holda, ular ro'yxat elementlarining "tabiiy" tartibida o'sish tartibida saralanadi (foydalanishda bo'lgani kabi Collections.sort(list)). Ikkinchi holda, ro'yxat o'tgan taqqoslagich tomonidan taqdim etilgan tartibda o'sish tartibida saralanishi kerak ( Collections.sort(list, c)bu erda "bilan" tasvirlangan usulning parametrlaridan solishtirgichni ishlatishda bo'lgani kabi bir xil tartib) public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) Preambula: umumiy mexanizm. tilda kompilyatsiya vaqti turini tekshirishni ta'minlaydi. Odatda bu etarli, ammo bunday bo'lmagan paytlar ham bor. Misol uchun, biz o'z kollektsiyamizni o'zimizga noma'lum bo'lgan kutubxona kodiga o'tkazamiz va biz ushbu "uchinchi tomon kutubxonasi" kodi bizning kollektsiyamizga noto'g'ri turdagi elementni kiritmasligini xohlaymiz. Bu mumkin bo'lgan muammo raqami 1. Mumkin bo'lgan muammo raqami 2 quyidagilar. Aytaylik, dasturimiz bizga ClassCastException noto'g'ri turdagi element to'plamga kiritilganligi haqida xabar beradi. Afsuski, bu istisno noto'g'ri element kiritilgandan so'ng istalgan vaqtda tashlanishi mumkin va odatda bizga muammoning manbai haqida kam yoki umuman ma'lumot bermaydi. Usul usuli yordamida checkedCollectionbiz o'zimizni bir va ikkinchi muammolardan qutqara olamiz, chunki bu usul ish vaqtida tekshirilishi mumkin bo'lgan to'plamni yaratadi. 2-raqamli muammoni ushbu usul yordamida yechish: Masalan, bizda bu bor va u tushib ketdi ClassCastException.
Collection<String> c = new HashSet<String>();
Yuqoridagi kodni vaqtincha quyidagi bilan almashtirish mumkin:
Collection<String> c = Collections.checkedCollection(
         new HashSet<String>(), String.class);
Dasturni qayta ishga tushirganimizda, biz to'plamimizga noto'g'ri turdagi elementni kiritadigan kod qatorini lokalizatsiya qilamiz. Tegishli usullar mening fikrimcha: 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) Usul src elementlarini destga ko'chiradi. ko'chirilgan elementlarning indekslari bir xil bo'ladi. 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) usullar to'plamdagi minimal/maksimal elementni "tabiiy tartib" (qiyoslanadigan interfeys) yoki o'tgan taqqoslash tartibi bo'yicha qaytaradi. To'plamlarda bir xil elementlar bo'lmasa, true qiymatini public static boolean disjoint(Collection<?> c1,Collection<?> c2) qaytaradi . – mos ravishda bo‘sh ro‘yxat, xarita va to‘plamni qaytarish; – ro‘yxatni berilgan element bilan to‘ldiradi; – to‘plamda berilgan elementning takrorlanish sonini qaytaradi; – ko‘rsatilgan n ta element ro‘yxatini qaytaradi ; – barcha belgilangan elementlarni yangilari bilan almashtiradi; - ro'yxatni "teskari" qiladi; – roʻyxatni elementlarning belgilangan soni boʻyicha davriy ravishda oʻzgartiradi; – ro‘yxat elementlarini aralashtirib yuboradi; – bitta elementdan iborat to‘plam, ro‘yxat va xaritani ko‘rsatish; – ro‘yxatni tabiiy tartibda saralash va shunga muvofiq foydalanish; - ro'yxat elementlarini belgilangan pozitsiyalarga almashtiradi. Manbalar: <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 sinfi qanday usullarga ega?

Arrays klassi usullarining to'liq ro'yxatini hujjatlarda ko'rish mumkin . Ushbu xulosada men ulardan faqat bir nechtasini keltiraman. [hujjatlardan usullarni tarjima qildim va afsuski tarjimalarimning ko'p qismini yo'qotib qo'ydim. Bu sharmandalik va men bir xil narsaga vaqt sarflashni xohlamayman, shuning uchun men googleda qidirgan narsamni qo'yaman] public static <T> List<T> asList(T... a) massiv asosida ro'yxat yaratadi. Massiv ro'yxatning ichki ko'rinishi uchun ishlatiladi. Bu roʻyxat va asl massiv oʻrtasidagi aloqani saqlab qoladi: massivdagi oʻzgarishlar roʻyxatda aks etadi:
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]
ro'yxatdagi o'zgarishlar massivda aks ettiriladi:
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]
Agar massivda ob'ektlar bo'lsa, massiv ham, ro'yxat ham bir xil holatlarga ishora qiladi:
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(параметры)- ibtidoiy va ob'ekt tipidagi massivlardagi qiymat uchun ikkilik qidiruvni tashkil qilishning ortiqcha yuklangan usuli. Birinchi o'yinning pozitsiyasini qaytaradi; void fill(параметры)- massivlarni har xil turdagi va ibtidoiy qiymatlar bilan to'ldirishning haddan tashqari yuklangan usuli; void sort(parametrlar) – massivni yoki uning bir qismini Comparator interfeysi yordamida va unsiz saralashning haddan tashqari yuklangan usuli; static <T> T[] copyOf(T[] original, int newLength)- ma'lum uzunlikdagi massivni to'ldiradi, elementlarni tashlab yuboradi yoki kerak bo'lganda null bilan to'ldiradi; static <T> T[] copyOfRange(T[] original, int from, int to)– massivning belgilangan maydonini yangi massivga nusxalaydi; <T> List<T> asList(T… a)– massiv elementlarini List<T> tipidagi obyektga nusxalash usuli. Manba:

5. Collections.sort() ga qo'ng'iroq qilishda foydalaniladigan sort qanday nomlanadi?

Hujjatlardan : Amalga oshirish Tim Petersning Python ro'yxatini (TimSort) moslashtirishdir. Ushbu dastur ro'yxatni massivga tashlaydi, massivni saralaydi, so'ngra ro'yxat bo'ylab takrorlanadi va har bir ro'yxat elementini tegishli massiv elementidan qayta yuklaydi. Bu bogʻlangan roʻyxatni toʻgʻridan-toʻgʻri saralashdan kelib chiqadigan n*n log(n) murakkabligidan qochadi. Wiki dan : Timsort — qoʻshish va birlashtirish tartibini birlashtirgan gibrid tartiblash algoritmi boʻlib, 2002 yilda Tim Peters tomonidan chop etilgan. Timsort hozirda Python, OpenJDK 7 da standart tartiblash algoritmi bo'lib, Android JDK 1.5 da joriy qilingan. Algoritmning asosiy g'oyasi shundan iboratki, haqiqiy dunyoda saralanadigan ma'lumotlar massivlari ko'pincha tartiblangan pastki qatorlarni o'z ichiga oladi. Bunday ma'lumotlarga ko'ra, Timsort ko'plab tartiblash algoritmlariga qaraganda ancha tezroq.

10. Iterator nima?

Java tilining JDK 1.2 versiyasida taqdim etilgan interfeys java.util.Iteratorkonteyner sinflarini takrorlash imkonini beradi. Har bir Iterator usullarni amalga oshiradi next()va hasNext()ixtiyoriy ravishda remove(). Iteratorlar mos keladigan konteyner sinflari tomonidan, odatda iterator(). Usul next()iteratorni keyingi qiymatga o'tkazadi va belgilangan qiymatni iteratorga qaytaradi. Dastlab yaratilganda, iterator birinchi elementdan oldin maxsus qiymatga ishora qiladi, shuning uchun birinchi elementni faqat birinchi chaqiruvdan keyin olish mumkin next(). Idishdagi barcha elementlar takrorlangan vaqtni aniqlash uchun sinov usuli qo'llaniladi hasNext(). Quyidagi misol iteratorlardan oddiy foydalanishni ko'rsatadi:
Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator(); в J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());
Buni qo'llab-quvvatlaydigan turdagi to'plam uchun iterator usuli remove()oxirgi "tashrif buyurilgan" elementni konteynerdan olib tashlaydi. Iteratsiya paytida konteynerni o'zgartirishning deyarli barcha boshqa turlari xavflidir. Bundan tashqari, for o'xshash API bilan java.util.Listmavjud java.util.ListIterator, lekin oldinga va orqaga iteratsiyaga imkon beradi, ro'yxatdagi joriy indeksning ta'rifini ta'minlaydi va uning pozitsiyasi bo'yicha elementga o'tadi. Manba: 2-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION