Xülasə olduqca çətin oldu, ona görə də onu iki hissəyə ayırdım. İkinci hissədə kankarency və multithreading ilə bağlı suallara cavablar var. Birinci hissə qalanları ehtiva edir. Yazmaq olduqca çətin idi. Hələ də çox şey başa düşmürəm, buna görə də həmişə olduğu kimi şərhlər, qeydlər, əlavələr qəbul olunur)
1. Müqayisəli interfeysdən necə istifadə etmək olar?
İnterfeys sinif obyektlərinin sıralanmasını həyata keçirmək üçün nəzərdə tutulmuş
Comparable
yalnız bir metodu elan edir .
compareTo(Object obj)
Obyektlərin sifarişli siyahılarını və ya massivlərini çeşidləyərkən istifadə etmək rahatdır. Bu üsul çağırılan obyekti ilə müqayisə edir
obyekt.
true və ya
false
equals
qaytaran metoddan fərqli olaraq , qaytarır:
compareTo
- dəyərlər bərabər olduqda 0;
- Zəng edən parametrdən azdırsa, mənfi dəyər;
- Zəng edən parametrdən böyükdürsə, müsbətdir.
java.util.List
O, ilk növbədə sıralanmış siyahıları ( ) və obyektlərin massivlərini çeşidləmək üçün faydalıdır . Siyahıda/massivdə bu interfeysi həyata keçirən elementlər varsa, onlar avtomatik olaraq
java.util.Collections.sort(List)/Arrays.sort(Object[])
. Təbii sifariş anlayışı interfeys ilə əlaqələndirilir
Comparable
, çünki o, bu interfeysi həyata keçirən hər hansı bir sinfin nümunələri üçün təbii nizam yaradır. Başqa sözlə, sıra (x, y) şərtin yerinə yetirilməsinə uyğundur
x.compareTo(y) <= 0
. İcra qaydaları
Comparable
, daha doğrusu, metodu
compareTo(Object)
aşağıdakı kimidir (x və y həyata keçirən sinfin nümunələridir
Comparable
):
x.compareTo(y)
x müvafiq olaraq y-dən əvvəl və ya sonra olmalıdırsa -1 və ya 1 qaytarır. Metod 0 qaytarırsa, (x, y) və (y, x) sıraları ekvivalentdir.
- Əgər
sign(a)
a üçün -1,0,1 qaytaran funksiyadırsa, müvafiq olaraq 0-dan kiçik, 0-a bərabər və 0-dan böyükdürsə, onda bərabərlik təmin edilməlidir sign(x.compareTo(y))==-sign(y.compareTo(x))
. Hansı məntiqlidir: əgər x y-dən əvvəl gəlirsə, onda y x-dən sonra gəlməlidir və əksinə.
- Əgər
x.compareTo(y) > 0
və olarsa y.compareTo(z) > 0
, onda x.compareTo(z) > 0
– bərabərsizliklərin keçidlilik əlaqəsi.
- Əgər
x.compareTo(y) == 0
, onda sign(x.compare(z)) == sign(y.compareTo(z))
, hər hansı z üçün.
- Zəng
x.compareTo(null)
bir istisna atmalıdır NullPointerException
. Bu, icra məntiqi ilə uyğunsuzluqdur equals
(xatırlatmaq istərdim, o, yalanıx.equals(null)
qaytarır ).
- Əgər y növü x ilə müqayisə oluna bilmirsə, çağırış
x.compareTo(y)
istisna təşkil etməlidir ClassCastException
.
(x.compareTo(y) == 0) == x.equals(y)
, yəni. zəng yalnız və yalnız doğru olduqda x.compareTo(y)
0 qaytarmalıdır . Bu, ardıcıllıq qaydasıdır və nəzərə alınması çox vacibdir.x.equals(y)
Mənbələr:
2. Comparator interfeysindən necə istifadə etmək olar?
İnterfeys
Comparator
iki metodu
compare(Object obj1, Object obj2)
və
equals(Object obj)
. İnterfeysdən istifadə edərkən
Comparator
, bir cüt obyektin müqayisəsi üçün məntiq sinif/obyekt daxilində gizlənmir, lakin ayrıca sinifdə həyata keçirilir. Metod
compare(x,y)
zənglə tamamilə eynidir
x.compareTo(y)
.
compareTo(Object)
Bütün qaydalara interfeys metodunun tətbiqi qaydaları ilə eyni şəkildə əməl edilməlidir
Comparable
.
Comparator
çeşidləmə lazım olan hər yerdə istifadə edilə bilər. Bu vəziyyətdə, ilk növbədə, lazımi çeviklik görünür - bir neçə çeşidləmə qaydasını həyata keçirmək imkanı. İkincisi, çeşidlənən obyektlər
Comparable
. Əgər bunu həyata keçirirlərsə,
Comparator
prioritetdir. İnterfeys həm də paradoksal göründüyü kimi
Comparator
metodu müəyyən edir .
equals(Object)
Bu üsul interfeys nümunələrinin özlərini müqayisə edir və yalnız müqayisə edilən obyektlər eyni sıralama qaydasını təmin etdikdə
doğru
Comparator
qayıtmalıdır . Bununla belə, orijinal tətbiqi toxunulmaz tərk etmək həmişə təhlükəsizdir
Mənbə:
Object.equals(Object)
3. Collections sinfi hansı metodlara malikdir?
public static <T> boolean addAll(Collection<? super T> c, T... elements)
Metod
elements
kolleksiyaya massiv elementləri əlavə edir
Collection<? super T> c
. Elementlər fərdi və ya massiv şəklində göstərilə bilər. Elementlər ayrı-ayrılıqda göstərildikdə, bu üsul bütün elementləri mövcud kolleksiyaya rahat şəkildə əlavə etmək imkanı verir:
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)
Hər iki üsul ikili axtarış alqoritmindən istifadə edərək parametrdə ötürülən obyekt üçün parametrdə ötürülən siyahıda axtarış aparır. Siyahıda belə bir element varsa elementin indeksini qaytarır, əks halda siyahının birinci elementinin indeksi -dən böyük
key
, bütün elementlər -dən kiçikdirsə
key
, qaytarır
list.size()
. Bu üsullardan istifadə etməzdən əvvəl siyahılar çeşidlənməlidir. Birinci halda, onlar siyahı elementlərinin “təbii” sırası ilə artan qaydada sıralanır (istifadə edərkən olduğu kimi
Collections.sort(list)
). İkinci halda, siyahı keçən müqayisəçi tərəfindən verilən ardıcıllıqla artan qaydada çeşidlənməlidir (
Collections.sort(list, c)
burada "ilə" təsvir olunan metodun parametrlərindən bir müqayisədir] istifadə edərkən eyni sıra)
public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)
Preambula: generik mexanizm dildə kompilyasiya vaxtı növünün yoxlanılmasını təmin edir. Adətən bu kifayətdir, lakin elə vaxtlar olur ki, bu kifayət deyil. Məsələn, biz kolleksiyamızı bizə məlum olmayan kitabxana koduna köçürürük və həqiqətən də bu “üçüncü tərəf kitabxanasının” kodunun kolleksiyamıza yanlış tipli element daxil etməməsini istəyirik. Bu 1 nömrəli mümkün problemdir. 2 nömrəli mümkün problem aşağıdakılardır. Deyək ki, proqramımız
ClassCastException
kolleksiyaya səhv tipli elementin daxil edildiyini bildirən bir mesaj verir. Təəssüf ki, bu istisna istənilən vaxt yanlış element daxil edildikdən sonra atilə bilər və adətən problemin mənbəyi haqqında bizə çox az və ya heç bir məlumat vermir. Metod metodundan istifadə edərək
checkedCollection
özümüzü birinci və ikinci problemlərdən xilas edə bilərik, çünki bu üsul icra zamanı yoxlanıla bilən kolleksiya yaradır. Bu üsuldan istifadə edərək 2 nömrəli problemin həlli: Məsələn, bizdə bu var və o düşür
ClassCastException
.
Collection<String> c = new HashSet<String>();
Yuxarıdakı kod müvəqqəti olaraq aşağıdakılarla əvəz edilə bilər:
Collection<String> c = Collections.checkedCollection(
new HashSet<String>(), String.class);
Proqramı yenidən işə saldıqda, kolleksiyamıza səhv tipli element daxil edən kod xəttini lokallaşdırırıq. Mənim fikrimcə əlaqəli üsullar:
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)
Metod src elementlərini dest-ə kopyalayır. kopyalanan elementlərin indeksləri eyni olacaq.
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)
üsullar kolleksiyadakı minimum/maksimum elementi “təbii qayda” (Müqayisəli interfeys) və ya ötürülən müqayisəçinin sırası baxımından qaytarır. Kolleksiyalarda eyni elementlər yoxdursa,
doğru
public static boolean disjoint(Collection<?> c1,Collection<?> c2)
qaytarır . – müvafiq olaraq boş siyahı, xəritə və dəsti qaytarın; – siyahını verilmiş elementlə doldurur; – kolleksiyada verilmiş elementin baş vermə sayını qaytarır;
– müəyyən edilmiş n elementin siyahısını qaytarır ; – bütün göstərilən elementləri yeniləri ilə əvəz edir; – siyahını “əksinə çevirir”; – siyahısı müəyyən sayda elementə görə dövri olaraq dəyişir; – siyahı elementlərini qarışdırır; – bir elementdən ibarət çoxluq, siyahı yaratmaq və xəritəni göstərmək; – siyahının təbii qaydada çeşidlənməsi və müvafiq olaraq istifadə edilməsi; – müəyyən edilmiş mövqelərdə siyahı elementlərini dəyişdirir.
Mənbələr:
<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 hansı metodlara malikdir?
Arrays sinfinin metodlarının tam siyahısını sənədlərdə görmək
olar . Bu xülasədə onlardan yalnız bir neçəsini qeyd edəcəyəm. [sənədlərdən metodları tərcümə etdi və təəssüf ki, tərcüməmin çoxunu itirdim. Bu ayıbdır və mən eyni şeyə vaxt itirmək istəmirəm, ona görə də google-da axtardıqlarımı yapışdıracağam]
public static <T> List<T> asList(T... a)
massiv əsasında siyahı yaradır. Massiv siyahının daxili təsviri üçün istifadə olunur. Bu, siyahı ilə orijinal massiv arasındakı əlaqəni qoruyur: massivdəki dəyişikliklər siyahıda əks olunacaq:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list);
a[0] = "aaa";
System.out.println(list);
siyahıdakı dəyişikliklər massivdə əks olunacaq:
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));
Əgər massiv obyektləri ehtiva edirsə, şübhəsiz ki, həm massiv, həm də siyahı eyni nümunələrə istinad edəcək:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0));
int binarySearch(параметры)
– primitiv və obyekt tipli massivlərdə bir dəyər üçün ikili axtarışın təşkili üçün həddindən artıq yüklənmiş üsul. İlk matçın mövqeyini qaytarır;
void fill(параметры)
– massivləri müxtəlif növ və primitivlərin dəyərləri ilə doldurmaq üçün həddindən artıq yüklənmiş üsul;
void sort(parametrlər) – Komparator interfeysindən istifadə edərək massivi və ya onun bir hissəsini onsuz çeşidləmək üçün həddindən artıq yüklənmiş üsul;
static <T> T[] copyOf(T[] original, int newLength)
– müəyyən uzunluqdakı massivi doldurur, elementləri atır və ya lazım olduqda null ilə doldurur;
static <T> T[] copyOfRange(T[] original, int from, int to)
– massivin müəyyən edilmiş sahəsini yeni massivə köçürür;
<T> List<T> asList(T… a)
– massiv elementlərini List<T> tipli obyektə köçürən metod.
Mənbə:
5. Collections.sort() çağırarkən istifadə olunan çeşidin adı nədir?
Sənədlərdən : Tətbiq Tim Petersin Python siyahısı növünün (TimSort) uyğunlaşdırılmasıdır. Bu tətbiq siyahını massilə köçürür, massivi çeşidləyir, sonra siyahıda təkrarlanır və hər bir siyahı elementini müvafiq massiv elementindən yenidən yükləyir. Bu, birbaşa əlaqəli siyahını çeşidləmək cəhdindən yarana biləcək n*n log(n) mürəkkəbliyindən qaçır.
Vikidən : Timsort, 2002-ci ildə Tim Peters tərəfindən nəşr edilmiş daxiletmə və birləşmə növünü birləşdirən hibrid çeşidləmə alqoritmidir. Timsort hazırda Python, OpenJDK 7-də standart çeşidləmə alqoritmidir və Android JDK 1.5-də həyata keçirilir. Alqoritmin əsas ideyası ondan ibarətdir ki, real dünyada çeşidlənən məlumat massivləri çox vaxt sıralanmış alt massivlərdən ibarətdir. Belə məlumatlarda Timsort bir çox çeşidləmə alqoritmlərindən xeyli sürətlidir.
10. İterator nədir?
Java dilinin JDK 1.2 buraxılışında təqdim edilən interfeys
java.util.Iterator
konteyner siniflərinin təkrarlanmasına imkan verir. Hər bir İterator metodları həyata keçirir
next()
və
hasNext()
isteğe bağlı olaraq
remove()
. İteratorlar müvafiq konteyner sinifləri tərəfindən, adətən
iterator()
. Metod
next()
iteratoru növbəti dəyərə irəliləyir və müəyyən edilmiş dəyəri iteratora qaytarır. İlkin yaradıldıqda, iterator ilk elementdən əvvəl xüsusi bir dəyərə işarə edir, buna görə də ilk element yalnız -ə ilk zəngdən sonra alına bilər
next()
. Konteynerdəki bütün elementlərin təkrarlandığı anı müəyyən etmək üçün test üsulundan istifadə olunur
hasNext()
. Aşağıdakı nümunə iteratorların sadə istifadəsini nümayiş etdirir:
Iterator iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
Bunu dəstəkləyən tip kolleksiyası üçün iterator metodu
remove()
konteynerdən sonuncu "ziyarət edilən" elementi çıxarır. İterasiya zamanı konteyner modifikasiyasının demək olar ki, bütün digər növləri təhlükəlidir. Bundan əlavə, for oxşar API ilə
java.util.List
mövcuddur
java.util.ListIterator
, lakin irəli və geri iterasiyaya imkan verir, siyahıda cari indeksin tərifini təmin edir və mövqeyinə görə elementə keçir.
Mənbə:
2-ci hissə
GO TO FULL VERSION