JavaRush /Java Blogu /Random-AZ /Səviyyə 26. Səviyyə mövzusu üzrə müsahibə suallarına cava...
zor07
Səviyyə
Санкт-Петербург

Səviyyə 26. Səviyyə mövzusu üzrə müsahibə suallarına cavablar. Hissə 1. 1-5, 10-cu suallar.

Qrupda dərc edilmişdir
Səviyyə 26. Səviyyə mövzusu üzrə müsahibə suallarına cavablar.  Hissə 1. Suallar 1-5, 10. - 1Xü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 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.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)
Mənbələr:

2. Comparator interfeysindən necə istifadə etmək olar?

İnterfeys Comparatoriki metodu compare(Object obj1, Object obj2)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ğ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 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 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); // [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 = { new Object(), new Object(), new Object()};
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()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.0
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.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ə: 2-ci hissə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION