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ş Comparableyalnı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
falseequals 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.ListO, 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) > 0və 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)
2. Comparator interfeysindən necə istifadə etmək olar?
İnterfeys
Comparatoriki 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ə,
Comparatorprioritetdir. İnterfeys həm də paradoksal göründüyü kimi
Comparatormetodu 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ğruComparator 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)
public static <T> boolean addAll(Collection<? super T> c, T... elements) Metod
elementskolleksiyaya 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 ClassCastExceptionkolleksiyaya 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 =newHashSet<String>();
Yuxarıdakı kod müvəqqəti olaraq aşağıdakılarla əvəz edilə bilər:
Collection<String> c =Collections.checkedCollection(newHashSet<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ğrupublic 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)Comparatorvoid swap(List<?> list, int i, int j)
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);// [foo, bar, baz]
a[0]="aaa";System.out.println(list);// [aaa, bar, baz]
siyahıdakı dəyişikliklər massivdə əks olunacaq:
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]
Ə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 ={newObject(),newObject(),newObject()};List<Object> list =Arrays.asList(a);System.out.println(a[0]== list.get(0));// true
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.Iteratorkonteyner 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();//Iterator<MyType> iter = list.iterator(); в J2SE 5.0while(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.Listmö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ə:
GO TO FULL VERSION