總結起來相當繁瑣,所以我把它分成兩個部分。第二部分包含有關 kankarency 和多線程問題的答案。第一部分包含其餘部分。寫作是相當困難的。還是不太明白,所以一如既往,歡迎留言、留言、補充)
1.如何使用Comparable介面?
此介面
Comparable
僅聲明一種方法
compareTo(Object obj)
,旨在實現類別物件的排序。在對有序列表或物件數組進行排序時使用起來很方便。該方法將被呼叫的物件與
對象。
equals
與傳回
true或
false 的方法相反,
compareTo
傳回:
- 若值相等則為 0;
- 若被呼叫者小於參數,則為負值;
- 如果被呼叫者大於參數,則為正。
它主要用於對有序列表 (
java.util.List
) 和物件數組進行排序。如果列表/陣列包含實現此介面的元素,那麼它們可以通過
java.util.Collections.sort(List)/Arrays.sort(Object[])
. 自然排序的概念與介面相關聯
Comparable
,因為它為實作該介面的任何類別的實例建立了自然順序。換句話說,順序 (x, y) 對應於條件 的滿足
x.compareTo(y) <= 0
。實作的規則
Comparable
,或更確切地說,其方法的規則
compareTo(Object)
如下(x 和 y 是實作 的類別的實例
Comparable
):
x.compareTo(y)
如果 x 應位於 y 之前或之後,則分別傳回 -1 或 1。如果此方法傳回 0,則階數 (x, y) 和 (y, x) 相等。
- 如果
sign(a)
是函數,對於 a 分別傳回 -1,0,1,小於 0,等於 0 和大於 0,則必須滿足等式sign(x.compareTo(y))==-sign(y.compareTo(x))
。這是合乎邏輯的:如果 x 在 y 之前,那麼 y 必須在 x 之後,反之亦然。
- 如果
x.compareTo(y) > 0
和y.compareTo(z) > 0
,那麼x.compareTo(z) > 0
– 不等式的傳遞性關係。
- 如果
x.compareTo(y) == 0
,則sign(x.compare(z)) == sign(y.compareTo(z))
,對於任意 z。
- 該調用
x.compareTo(null)
必須拋出異常NullPointerException
。這與實作邏輯有差異equals
(讓我提醒你,x.equals(null)
它回傳false)。
- 如果 y 的類型無法與 x 進行比較,則呼叫
x.compareTo(y)
必須拋出異常ClassCastException
。
(x.compareTo(y) == 0) == x.equals(y)
, IE。x.compareTo(y)
當且僅當x.equals(y)
傳回true時,該呼叫必須傳回 0 。這是一個一致性規則,考慮起來非常重要。
資料來源:
2. 比較器介面如何使用?
此接口
Comparator
聲明了兩個方法
compare(Object obj1, Object obj2)
和
equals(Object obj)
。使用介面時
Comparator
,比較一對物件的邏輯並不隱藏在類別/物件內部,而是在單獨的類別中實作。方法
compare(x,y)
與呼叫完全一樣
x.compareTo(y)
。
compareTo(Object)
所有規則都必須遵循與實作介面方法的規則完全相同的方式
Comparable
。
Comparator
可以在任何需要排序的地方使用。在這種情況下,首先出現了必要的彈性—實現多個排序規則的能力。其次,被排序的物件可能不實現
Comparable
. 如果他們確實實施了,
Comparator
則具有優先權。該介面
Comparator
還定義了一個方法
equals(Object)
,這看起來很矛盾。此方法比較介面實例本身,並且僅當被比較的物件提供相同的排序順序時才
Comparator
應傳回
true 。但是,保持原始實現
Object.equals(Object)
不變 始終是安全的
來源:
3. Collections類別有哪些方法?
public static <T> boolean addAll(Collection<? super T> c, T... elements)
此方法將數組元素添加
elements
到集合中
Collection<? super T> c
。元素可以單獨指定或作為數組指定。當單獨指定元素時,此方法提供了將所有元素方便地添加到現有集合中的功能:
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)
兩種方法都使用二分搜尋演算法在參數中傳遞的列表中搜尋參數中傳遞的物件。如果清單中存在該元素,則傳回該元素的索引,否則傳回清單中第一個大於 的元素的索引
key
,如果所有元素都小於
key
,則傳回
list.size()
。在使用這些方法之前,必須先對清單進行排序。在第一種情況下,它們會依照清單元素的「自然」順序升序排序(與使用時相同
Collections.sort(list)
)。在第二種情況下,列表必須按照傳遞的比較器提供的順序按升序排序(與使用
Collections.sort(list, c)
[此處“with”是來自所描述方法的參數的比較器]時的順序相同)
public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)
前言:泛型機制在語言中提供編譯時類型檢查。通常這已經足夠了,但有時還不夠。例如,我們將集合轉移到我們未知的地方的庫程式碼中,我們確實希望這個「第三方函式庫」的程式碼不要將錯誤類型的元素插入到我們的集合中。這是可能的問題 1。可能的問題 2 如下。假設我們的程式向我們發出訊息
ClassCastException
,通知我們將錯誤類型的元素插入集合中。不幸的是,在插入不正確的元素後,此異常可能隨時拋出,並且通常很少或根本不提供有關問題根源的信息。 使用方法方法
checkedCollection
我們可以避免問題一和問題二,因為 此方法會建立一個可在運行時驗證的集合。使用此方法解決第二個問題:例如,我們有這個,它會掉下來
ClassCastException
。
Collection<String> c = new HashSet<String>();
上面的程式碼可以暫時替換為:
Collection<String> c = Collections.checkedCollection(
new HashSet<String>(), String.class);
當我們再次運行程式時,我們本地化將錯誤類型的元素插入集合中的程式碼行。我認為相關方法:
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)
該方法將 src 元素複製到 dest。複製元素的索引將相同。
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)
方法依照「自然順序」(Comparable 介面)或傳遞的比較器的順序傳回集合中的最小/最大元素。 如果集合不具有相同的元素,
public static boolean disjoint(Collection<?> c1,Collection<?> c2)
則傳回
true 。
<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)
– 傳回給定元素在集合中出現的次數;
– 傳回n個
<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類別有哪些方法?
Arrays 類別的方法的完整清單可以在文件中看到。在本摘要中,我將僅引用其中的一些內容。[翻譯了文件中的方法,不幸的是我遺失了大部分翻譯。真是可惜,我不想在同一件事上浪費時間,所以我將貼上我在谷歌搜尋到的內容]
public static <T> List<T> asList(T... a)
產生一個基於數組的列表。數組用於列表的內部表示。這保留了列表和原始數組之間的連接:數組中的更改將反映在列表中:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list);
a[0] = "aaa";
System.out.println(list);
列表中的更改將反映在數組中:
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));
如果數組包含對象,顯然數組和列表都會引用相同的實例:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0));
int binarySearch(параметры)
– 一種重載方法,用於組織對基本類型和物件類型陣列中的值進行二分搜尋。返回第一個匹配的位置;
void fill(параметры)
– 以各種類型和原語的值填入陣列的重載方法;
void sort(parameters) – 一種重載方法,用於使用 Comparator 介面或不使用 Comparator 介面對陣列或其一部分進行排序;
static <T> T[] copyOf(T[] original, int newLength)
– 填滿一定長度的數組,必要時丟棄元素或填充 null;
static <T> T[] copyOfRange(T[] original, int from, int to)
– 將陣列的指定區域複製到新數組;
<T> List<T> asList(T… a)
– 將陣列元素複製到 List<T> 類型的物件中的方法。
來源:
5. 呼叫 Collections.sort() 時使用的排序名稱是?
來自文件:該實作是 Tim Peters 的 Python 清單排序 (TimSort) 的改編。此實作將列表轉儲到數組中,對數組進行排序,然後迭代列表並從相應的數組元素中重新載入每個列表元素。這避免了嘗試直接對鍊錶進行排序時出現的 n*n log(n) 複雜性 來自
wiki:Timsort 是一種結合了插入排序和合併排序的混合排序演算法,由 Tim Peters 於 2002 年發布。Timsort 目前是 Python、OpenJDK 7 中的標準排序演算法,並在 Android JDK 1.5 中實作。該演算法的主要思想是,在現實世界中,可排序的資料數組通常包含有序的子數組。在此類資料上,Timsort 比許多排序演算法快得多。
10.什麼是迭代器?
Java 語言的 JDK 1.2 版本中引入的介面
java.util.Iterator
允許容器類別的迭代。每個迭代器都實作方法
next()
,並且
hasNext()
可以選擇支援
remove()
. 迭代器由相應的容器類別創建,通常由
iterator()
. 此方法
next()
將迭代器前進到下一個值並將指定值傳回給迭代器。最初創建時,迭代器指向第一個元素之前的特殊值,因此只有在第一次調用
next()
. 為了確定容器中所有元素都被迭代的時刻,使用了測試方法
hasNext()
。下面的例子示範了迭代器的簡單使用:
Iterator iter = list.iterator();
while (iter.hasNext())
System.out.println(iter.next());
對於支援此功能的類型集合,迭代器方法
remove()
會從容器中刪除最後一個「存取」的元素。迭代期間幾乎所有其他類型的容器修改都是不安全的。此外,for
java.util.List
contains
java.util.ListIterator
具有類似的 API,但允許向前和向後迭代,提供清單中當前索引的定義並按其位置移動到元素。
來源:
第2部分
GO TO FULL VERSION