Ringkesan kasebut dadi rada rumit, mula aku dibagi dadi rong bagean. Bagian kapindho ngemot jawaban kanggo pitakonan babagan kankarency lan multithreading. Pérangan pisanan ngandhut sisa. Nulis cukup angel. Aku isih ora ngerti akeh, mula kaya biasane, komentar, komentar, tambahan diwenehake)
1. Carane nggunakake antarmuka Comparable?
Antarmuka
Comparable
ngumumake mung siji cara
compareTo(Object obj)
, dirancang kanggo ngleksanakake urutan obyek kelas. Iku trep kanggo nggunakake nalika ngurutake dhaptar dhawuh utawa susunan obyek. Cara iki mbandhingake obyek sing diarani
obj. Beda karo metode
equals
, sing ngasilake
bener utawa
salah ,
compareTo
ngasilake:
- 0 yen nilai padha;
- Nilai negatif yen callee kurang saka parameter;
- Positif yen callee luwih saka parameter.
Iku utamané migunani kanggo ngurutake dhaptar dhawuh (
java.util.List
) lan susunan obyek. Yen dhaptar / larik ngemot unsur sing ngetrapake antarmuka iki, mula bisa diurutake kanthi otomatis kanthi
java.util.Collections.sort(List)/Arrays.sort(Object[])
. Konsep urutan alami digandhengake karo antarmuka
Comparable
, amarga nggawe urutan alami kanggo kelas apa wae sing ngetrapake antarmuka iki. Ing tembung liya, urutan (x, y) cocog karo kaleksanan kondisi
x.compareTo(y) <= 0
. Aturan implementasine
Comparable
, utawa luwih, metode kasebut,
compareTo(Object)
kaya ing ngisor iki (x lan y minangka conto saka kelas sing ngetrapake
Comparable
):
x.compareTo(y)
ngasilake -1 utawa 1 yen x kudu sadurunge utawa sawise y, mungguh. Yen cara ngasilake 0, banjur pesenan (x, y) lan (y, x) padha karo.
- Yen
sign(a)
fungsi sing ngasilake -1,0,1 kanggo a, mungguh, kurang saka 0, padha karo 0 lan luwih saka 0, banjur kesetaraan kudu wareg sign(x.compareTo(y))==-sign(y.compareTo(x))
. Sing logis: yen x sadurunge y, banjur y kudu sawise x, lan kosok balene.
- Yen
x.compareTo(y) > 0
lan y.compareTo(z) > 0
, banjur x.compareTo(z) > 0
- hubungan transitivity saka inequalities.
- Yen
x.compareTo(y) == 0
, banjur sign(x.compare(z)) == sign(y.compareTo(z))
, kanggo sembarang z.
- Telpon
x.compareTo(null)
kudu mbuwang pengecualian NullPointerException
. Iki minangka bedo karo logika implementasine equals
(ayo kula ngelingake sampeyan, x.equals(null)
bali palsu ).
- Yen jinis y ora bisa dibandhingake karo x, banjur telpon
x.compareTo(y)
kudu mbuwang pangecualian ClassCastException
.
(x.compareTo(y) == 0) == x.equals(y)
, i.e. telpon x.compareTo(y)
kudu bali 0 yen lan mung yen x.equals(y)
bali bener . Iki minangka aturan konsistensi lan penting banget kanggo ditimbang.
Sumber:
2. Carane nggunakake antarmuka Comparator?
Antarmuka
Comparator
ngumumake rong cara
compare(Object obj1, Object obj2)
lan
equals(Object obj)
. Nalika nggunakake antarmuka
Comparator
, logika kanggo mbandhingaké pasangan obyek ora umpetaken nang kelas / obyek, nanging dipun ginakaken ing kelas kapisah. Cara kasebut
compare(x,y)
persis padha karo telpon
x.compareTo(y)
. Kabeh aturan kudu ditindakake kanthi cara sing padha karo aturan kanggo ngetrapake metode
compareTo(Object)
antarmuka
Comparable
.
Comparator
bisa digunakake ing ngendi wae yen perlu ngurutake. Ing kasus iki, pisanan, keluwesan sing dibutuhake katon - kemampuan kanggo ngetrapake sawetara aturan ngurutake. Lan kapindho, obyek sing diurutake bisa uga ora ngleksanakake
Comparable
. Yen dheweke nindakake,
Comparator
dheweke duwe prioritas. Antarmuka
Comparator
uga nemtokake cara
equals(Object)
, kanthi paradoks kaya sing katon. Cara iki mbandhingake conto antarmuka dhewe
Comparator
lan mung kudu bali
yen obyek sing dibandhingake nyedhiyakake urutan urutan sing padha. Nanging, mesthi aman kanggo ninggalake implementasi asli
Object.equals(Object)
utuh
Sumber:
3. Metode apa sing diduweni kelas Koleksi?
public static <T> boolean addAll(Collection<? super T> c, T... elements)
Cara kasebut nambahake unsur array
elements
menyang koleksi
Collection<? super T> c
. Unsur bisa ditemtokake kanthi individu utawa minangka array. Nalika unsur kasebut ditemtokake kanthi individu, cara iki menehi kemampuan kanggo nambah kabeh unsur menyang koleksi sing ana:
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)
Loro-lorone cara nggoleki dhaptar sing dilewati ing parameter kanggo obyek sing dilewati ing parameter nggunakake algoritma telusuran binar. Ngasilake indeks saka unsur yen ana unsur kuwi ing dhaftar, digunakake indeks saka unsur pisanan dhaftar luwih saka
key
, yen kabeh unsur kurang saka
key
, bali
list.size()
. Sadurunge nggunakake cara kasebut, dhaptar kudu diurutake. Ing kasus sing sepisanan, diurutake kanthi urutan munggah ing urutan "alami" saka unsur dhaptar (padha nalika nggunakake
Collections.sort(list)
). Ing kasus kapindho, dhaptar kudu diurutake kanthi urutan munggah ing urutan sing diwenehake dening komparator liwati (urutan sing padha nalika nggunakake
Collections.sort(list, c)
[kene "karo" minangka komparator saka paramèter metode sing diterangake])
public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)
Preamble: mekanisme generik ing basa kasebut nyedhiyakake pamriksa jinis wektu kompilasi. Biasane iki cukup, nanging ana wektu sing ora. Contone, kita nransfer koleksi kita menyang kode perpustakaan, nang endi wae ora dingerteni kanggo kita, lan kita pancene pengin kode iki "perpustakaan pihak katelu" ora nglebokake unsur saka jinis salah menyang koleksi kita. Iki kemungkinan masalah nomer 1. Kemungkinan masalah nomer 2 yaiku ing ngisor iki. Ayo program kita menehi pesen
ClassCastException
sing ngandhani yen ana unsur sing salah dilebokake ing koleksi kasebut. Sayange, istiméwa iki bisa dibuwang sawayah-wayah sawise unsur salah wis dilebokake, lan biasane menehi informasi sethitik utawa ora bab sumber masalah. Nggunakake metode metode
checkedCollection
kita bisa nylametake awake dhewe saka masalah siji lan loro, amarga cara iki nggawe koleksi sing bisa diverifikasi nalika runtime. Ngatasi masalah nomer loro nggunakake cara iki: Contone, kita duwe iki, lan tiba metu
ClassCastException
.
Collection<String> c = new HashSet<String>();
Kode ing ndhuwur bisa diganti sementara karo:
Collection<String> c = Collections.checkedCollection(
new HashSet<String>(), String.class);
Nalika kita mbukak program maneh, kita localize baris kode sing nglebokake unsur saka jinis salah menyang koleksi kita. Cara sing gegandhengan miturut pendapatku:
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)
Cara nyalin unsur src menyang dest. indeks saka unsur disalin bakal padha.
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)
cara bali minimal / unsur maksimum ing koleksi ing syarat-syarat "urutan alam" (antarmuka Comparable) utawa supaya comparator liwati.
public static boolean disjoint(Collection<?> c1,Collection<?> c2)
Ngasilake
bener yen koleksi ora duwe unsur sing padha.
<T> List <T> emptyList(), <K,V> Map <K,V> emptyMap(),
<T> Set <T> emptySet()
- bali dhaptar kosong, peta lan nyetel, mungguh;
<T> void fill(List<? super T> list, T obj)
- ngisi dhaptar kanthi unsur sing diwenehake;
int frequency(Collection<?> c, Object o)
- ngasilake jumlah kedadeyan saka unsur tartamtu ing koleksi;
<T> List <T> nCopies(int n, T o)
– ngasilake dhaptar
n unsur sing ditemtokake;
<T> boolean replaceAll(List<T> list, T oldVal, T newVal)
- ngganti kabeh unsur sing ditemtokake karo sing anyar;
void reverse(List<?> list)
- "mbalikke" dhaptar;
void rotate(List<?> list, int distance)
- ngganti dhaptar kanthi siklus kanthi jumlah unsur tartamtu;
void shuffle(List<?> list)
- ngacak unsur dhaptar;
<T> Set <T> singleton(T o), singletonList(T o), singletonMap(K key, V value)
- nggawe set, dhaptar lan peta tampilan sing dumadi saka siji unsur;
<T extends Comparable<? super T>> void sort(List<T> list),
<T> void sort(List<T> list, Comparator<? super T> c)
- ngurutake dhaptar, kanthi urutan alami lan nggunakake
Comparator
sesuai;
void swap(List<?> list, int i, int j)
- ngganti unsur dhaptar ing posisi sing ditemtokake.
Sumber:
4. Apa cara kelas Array duwe?
Dhaptar lengkap metode kelas Array bisa dideleng ing
dokumentasi . Ing ringkesan iki aku mung bakal nyebutake sawetara. [translated cara saka dokumentasi, lan sayangé ilang paling terjemahan sandi. Iku isin, lan aku ora pengin sampah wektu ing bab sing padha, aku bakal nempel apa aku googled]
public static <T> List<T> asList(T... a)
ngasilake dhaftar adhedhasar Uploaded. Array digunakake kanggo perwakilan internal dhaptar. Iki njaga sambungan antarane dhaptar lan array asli: owah-owahan ing array bakal dibayangke ing dhaptar:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list);
a[0] = "aaa";
System.out.println(list);
owah-owahan ing dhaptar bakal dibayangke ing array:
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));
Yen larik ngemot obyek, mesthine larik lan dhaptar kasebut bakal ngrujuk marang kedadeyan sing padha:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0));
int binarySearch(параметры)
- cara sing kakehan kanggo ngatur telusuran binar kanggo nilai ing array saka jinis primitif lan obyek. Ngasilake posisi pertandhingan pisanan;
void fill(параметры)
- cara sing kakehan kanggo ngisi array kanthi macem-macem jinis lan primitif;
void sort(parameter) - cara overloaded kanggo ngurutake array utawa bagean nggunakake antarmuka Comparator lan tanpa iku;
static <T> T[] copyOf(T[] original, int newLength)
- ngisi array kanthi dawa tartamtu, mbuwang unsur utawa ngisi null yen perlu;
static <T> T[] copyOfRange(T[] original, int from, int to)
- nyalin area sing ditemtokake saka array menyang array anyar;
<T> List<T> asList(T… a)
– cara sing nyalin unsur array menyang obyek saka jinis List<T>.
Sumber:
5. Apa jeneng urutan digunakake nalika nelpon Collections.sort ()?
Saka dokumentasi : Implementasine minangka adaptasi saka dhaptar dhaptar Python Tim Peters (TimSort). Implementasi iki mbucal dhaptar menyang larik, ngurutake larik, banjur ulangi dhaptar lan ngisi maneh saben unsur dhaptar saka unsur larik sing cocog. Iki ngindhari kerumitan n*n log(n) sing bakal muncul saka nyoba ngurutake dhaptar sing disambung langsung
Saka wiki : Timsort minangka algoritma pangurutan hibrida sing nggabungake urut-urutan sisipan lan nggabung, diterbitake ing 2002 dening Tim Peters. Timsort saiki minangka algoritma pangurutan standar ing Python, OpenJDK 7 lan diimplementasikake ing Android JDK 1.5. Ide utama algoritma kasebut yaiku ing jagad nyata, susunan data sing bisa diurutake asring ngemot subarray sing diurutake. Ing data kasebut, Timsort luwih cepet tinimbang akeh algoritma pangurutan.
10. Apa iku iterator?
Antarmuka sing dikenalake ing release JDK 1.2 saka basa Jawa
java.util.Iterator
ngidini pengulangan kelas wadhah. Saben Iterator ngleksanakake metode
next()
lan
hasNext()
opsional bisa ndhukung a
remove()
. Iterator digawe dening kelas wadhah sing cocog, biasane dening
iterator()
. Cara kasebut
next()
nerusake iterator menyang nilai sabanjure lan ngasilake nilai kasebut menyang iterator. Nalika wiwitan digawe, iterator nuduhake nilai khusus sadurunge unsur pisanan, supaya unsur pisanan mung bisa dijupuk sawise telpon pisanan kanggo
next()
. Kanggo nemtokake wayahe nalika kabeh unsur ing wadhah wis diulang, cara tes digunakake
hasNext()
. Conto ing ngisor iki nuduhake panggunaan iterator sing gampang:
Iterator iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
Kanggo koleksi jinis sing ndhukung iki, cara iterator
remove()
mbusak unsur 'dibukak' pungkasan saka wadhah. Meh kabeh jinis modifikasi wadhah liyane sajrone pengulangan ora aman. Kajaba iku, kanggo
java.util.List
ana
java.util.ListIterator
karo API padha, nanging ngidini pengulangan maju lan mundur, nyediakake definisi indeks saiki ing dhaftar lan pindhah menyang unsur dening posisi.
Sumber:
Bagean 2
GO TO FULL VERSION