Xulosa 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
Comparable
faqat 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.List
Bu, 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) > 0
va 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
Comparator
ikkita 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
.
Comparator
saralash 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,
Comparator
u ustuvor ahamiyatga ega. Interfeys , shuningdek , paradoksal tuyulishi mumkin bo'lgan
Comparator
usulni 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
elements
to'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
checkedCollection
biz 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);
a[0] = "aaa";
System.out.println(list);
ro'yxatdagi o'zgarishlar massivda aks ettiriladi:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list);
list.set(0, "bbb");
System.out.println(Arrays.toString(a));
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));
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.Iterator
konteyner 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();
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.List
mavjud
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
GO TO FULL VERSION