Collections :它的出現給集合操作提供了更多的功能。這個類不需要創建對象,內部提供的都是靜態方法。 Arrays :用於操作數組對象的工具類,方法皆為靜態方法。 ...
Collections :
它的出現給集合操作提供了更多的功能。這個類不需要創建對象,內部提供的都是靜態方法。
一般方法
Collections. sort (list);
list 集合進行元素的自然順序排序。
Collections. sort(list, new AComparator ());
按指定的比較器方法排序。
class AComparatorByLen implements Comparator<String>{
public int compare(String s1,String s2){
int temp = s1.length()-s2.length();
return temp == 0 ? s1.compareTo(s2) : temp;
}
}
Collections. max (list);
返回 list 中自然順序最大的元素。
Collections. max (list, new AComparator());
根據指定比較器產生的順序,返回list 中最大的元素。
Collections. min(list);
//返回 list 中自然順序最小的元素。
Collections. max (list, new AComparator());
根據指定比較器產生的順序,返回list 中最小的元素。
Collections. binarySearch (list,"zz");
二分查找,返回角標。
Collections. reverseOrder ();
逆向反轉排序。
Collections. shuffle (list);
使用預設隨機源對指定列表進行置換。
Collections.nCopies(int n, T o)
返回由指定對象的 n 個副本組成的不可變列表
//字元串只存儲了一次,付出的儲存代價很小。
List<String> settings = Collections.nCopies(100, "DEFAULT");
Collections.singleton(T o)
返回一個只包含指定對象的不可變的單元素集 set。不需要付出建立數據結構的開銷,相似還有,singletonList(T o)
與singletonMap(K key, V value)
返回不可修改視圖
static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
返回指定 collection 的不可修改視圖。
static <T> List<T> unmodifiableList(List<? extends T> list)
返回指定列表的不可修改視圖。
static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
返回指定映射的不可修改視圖。
static <T> Set<T> unmodifiableSet(Set<? extends T> s)
返回指定 set 的不可修改視圖。
static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m)
返回指定有序映射的不可修改視圖。
static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
返回指定有序 set 的不可修改視圖。
List <String> staff = new LinkedList<>();
...
lookAt(Collections.unmodifiableList(staff));
Collections.unmodifiableList
方法將返回一個實現了List
介面的對象。其訪問器方法從staff
集合中讀取值。lookAt
方法也可以調用List
介面中的所有方法,但所有的更改器方法功能已經被重新定義成了只拋出UnsupportedOperationException異常。- 由於視圖只是包裝了介面,所以只能訪問介面中定義的方法。例如
addFirst
和addLast
它們不是List
介面中的方法,而是LinkedList
類中的方法。
同步視圖
類庫的設計者使用視圖機制來確保常規集合的線程安全,而不是使用實現了線程安全的集合類。
原理:定義一個類,將集合所有的方法加同一把鎖後返回。
static <T> Collection<T> synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步(線程安全的)collection。
static <T> List<T> synchronizedList(List<T> list)
返回指定列表支持的同步(線程安全的)列表。
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
返回由指定映射支持的同步(線程安全的)映射。
static <T> Set<T> synchronizedSet(Set<T> s)
返回指定 set 支持的同步(線程安全的)set。
static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
返回指定有序映射支持的同步(線程安全的)有序映射。
static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
返回指定有序 set 支持的同步(線程安全的)有序 set。
檢查視圖
ArrayList<String> strings = new ArrayList<>();
ArrayList rawList = strings;
rawList.add(new Employee("tommy")); //now strings contains a Employee object.
System.out.println(rawList.get(0));
outPut:
Employee [name=tommy, getName()=tommy, getClass()=class collections.Employee, hashCode()=118352462, toString()=collections.Employee@70dea4e]
檢查視圖可以探測到這類問題:
List<String> safeStrings = Collections.checkedList(strings, String.class);
ArrayList rawList2 = safeStrings;
System.out.println(rawList2);
outPut:
java.lang.ClassCastException: Attempt to insert class java.util.Date element into collection with element type class java.lang.String
視圖局限性:
- 通常可能只能讀、無法改變大小、只支持刪除不支持插入。
Collection 和Collections 的區別 :
- Collections 是個
java.util
下的類,是針對集合類的一個工具類,提供一系列靜態方法,實現對集合的查找、排序、替換、線程安全化(將非同步的集合轉換成同步的)等操作。 - Collection 是個
java.util
下的介面,它是各種集合結構的父介面,繼承於它的介面主要有 Set 和 List,提供了關於集合的一些操作,如插入、刪除、判斷一個元素是否其成員、遍歷等。
Arrays :
用於操作數組對象的工具類,方法皆為靜態方法。
- asList(T... a) 方法
返回普通Java數組的List包裝器,返回的對象不是ArrayList
,而是一個帶有訪問底層數組的get 和set方法的視圖對象。改變底層數組的所有方法,如與迭代器相關的add
和remove
方法,會直接拋出不支持操作異常UnsupportedOperationException
。
String[] values = {"aaa","bbb","ccc","ddd"}; //a array
List<String> list = Arrays.asList(values); //a list
HashSet<String> staff = new HashSet<>(Arrays.asList(values)); //a set
- 將數組轉換成集合有什麼好處呢?
用asList(T... a)
方法,將數組轉換成集合後可以用集合中的方法來操作數組中的元素:isEmpty()
、contains(Object o)
、indexOf(Object o)
、set(int index, E element)
。 - 如果數組中存儲的是引用數據類型,這些引用對象直接作為列表的元素。
- 如果數組中存儲的是基本數據類型,
asList(T... a)
會將這個數組對象作為參數傳入方法中,這樣,列表中就僅有一個元素。
int[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
System.out.println("the size of list is:" + list.size());
outPut:
the size of list is:1
asList(T... a)
接受的參數是一個泛型的變長參數,我們知道基本數據類型是無法髮型化的,也就是說 8 個基本類型是無法作為asList(T... a)
的參數的, 要想作為泛型參數就必須使用其所對應的包裝類型。這裡, int 類型的數組當做其參數,而在 Java 中數組是一個對象,它是可以泛型化的,所以列表的長度為1.
//將 int 改變為 Integer
Integer[] ints = {1,2,3,4,5};
List list = Arrays.asList(ints);
System.out.println("list'size:" + list.size());
outPut:
the size of list is:5
- 集合轉數組: 用的是 Collection 介面中的 toArray()方法;
String[] val = staff.toArray(new String[0]); //a array
- 如果給 toArray 傳遞的指定類型的數據長度小於了集合的 size,那麼
toArray
方法,會自定再創建一個該類型的數據,長度為集合的 size。 - 如果傳遞的指定的類型的數組的長度大於了集合的 size,那麼
toArray
方法,就不會創建新數組,直接使用該數組,並將集合中的元素存儲到數組中,其他為存儲元素的位置預設值 null。所以,在傳遞指定類型數組時,最好的方式就是指定的長度和 size 相等的數組。 - 將集合轉成數組的好處是限制了集合中的元素的增刪操作。
(-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)不要剋制,喜歡就頂(୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ