List 介面
List 繼承自 Collection 介面。List 是有序的 Collection,List 允許有重複元素,實現 List 介面的常用類有 LinkedList,ArrayList,Vector 和 Stack。
-
ArrayList
ArrayList 實現了可變大小的陣列。它允許所有元素,包括 null。ArrayList 沒有同步
List list = Collections.synchronizedList(new ArrayList(...)); 複製程式碼
ArrayList 遍歷輸出
public static void main(String[] args) {
List<String> mList = new ArrayList<String>();
mList.add("hello");
mList.add("張三");
mList.add("李四");
mList.add("王五");
// 方法一
for (int i = 0; i < mList.size(); i++) {
System.out.println(mList.get(i));
}
// 方法二
for (String string : mList) {
System.out.println(string);
}
// 方法三
Iterator<String> it = mList.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 把字串內容挨個輸出
String str = "ABCDEFG";
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
複製程式碼
- LinkedList
LinkedList 實現了 List 介面,允許null元素,LinkedList 沒有同步方法
List list = Collections.synchronizedList(new LinkedList(...));
複製程式碼
- Vector
Vector 非常類似 ArrayList,但是 Vector 是同步的
Set 介面
Set 繼承自 Collection 介面。Set 是一種不能包含有重複元素的集合,Set 最多有一個 null元素
- HashSet
此類實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證集合的迭代順序;特別是它不保證該順序恆久不變。集合元素可以是 null,但只能放入一個 null,存入 HashSet 的物件必須定義 hashCode()。
Set s = Collections.synchronizedSet(new HashSet(...));
複製程式碼
- TreeSet
TreeSet 是 SortedSet 介面(Set 的子介面)的唯一實現類,TreeSet 可以確保集合元素處於排序狀態,TreeSet 支援自然排序(Comparable)和定製排序(Comparator),
Map 介面
Map 和 Collection 是2種不同的集合。Collection 可以看作是(value)的集合,而 Map 可以看作是(key,value)的集合
- Hashtable
Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。Hashtable 是同步的(線性安全)。
- HashMap
HashMap 和 Hashtable 類似,不同之處在於 HashMap 是非同步的,並且允許 null,即 null value 和null key
對 HashMap 排序,用 Collections 中的方法
public class HaspMapTest {
public static void main(String[] args) {
HashMap<Integer, Users> hashMap = new HashMap<Integer, Users>();
hashMap.put(1, new Users(22, "小娟"));
hashMap.put(3, new Users(21, "秀秀"));
hashMap.put(2, new Users(28, "小列"));
HashMap<Integer, Users> sortedHashMap = sortedHashMap(hashMap);
System.out.println("排序後:");
System.out.println(sortedHashMap);
}
private static HashMap<Integer, Users> sortedHashMap(HashMap<Integer, Users> hashMap) {
// 首先拿到 map 的鍵值對集合
Set<Entry<Integer,Users>> entrySet = hashMap.entrySet();
// 將 set 集合轉為 List 集合,為什麼,為了使用工具類的排序方法
ArrayList<Entry<Integer, Users>> list = new ArrayList<Entry<Integer,Users>>(entrySet);
Collections.sort(list, new Comparator<Entry<Integer,Users>>() {
@Override
public int compare(Entry<Integer, Users> o1, Entry<Integer, Users> o2) {
///按照要求根據 User 的 age 的倒序進行排
return o2.getValue().getAge()-o1.getValue().getAge();
}
});
LinkedHashMap<Integer,Users> linkedHashMap = new LinkedHashMap<Integer, Users>();
//將 List 中的資料儲存在 LinkedHashMap 中
for (Entry<Integer, Users> entry : list) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
return linkedHashMap;
}
}
複製程式碼
但凡是對集合的操作, 我們應該保持一個原則就是能用 JDK 中的 API 就有 JDK 中的 API, 比如排序演算法我們不應該 去 用 冒 泡 或 者 選 擇 , 而 是 首 先 想 到 用 Collections 集 合 工 具 類
HashMap 的遍歷輸出
public static void main(String[] args) {
Map<Integer, Student> hm = new HashMap<Integer, Student>();
hm.put(1001, new Student("張三"));
hm.put(1002, new Student("熊無"));
hm.put(1003, new Student("林之海"));
//方法一
Iterator<Integer> it = hm.keySet().iterator();
while (it.hasNext()) {
int key = it.next();
Student values = hm.get(key);
System.out.println("key-->"+key+"\tvalues-->"+values);
}
////方法二(推薦)
Iterator<Entry<Integer, Student>> it = hm.entrySet().iterator();
while (it.hasNext()) {
Entry<Integer, Student> entry = it.next();
int key = entry.getKey();
Student s = entry.getValue();
System.out.println("key-->"+key+"\tvalues-->"+s);
}
}
複製程式碼
判斷一個字串中相同的字元有多少個(用HashMap)
public static Map<Character, Integer> CountsCharacter(String str) {//str:要判斷的字串
Map<Character, Integer> hm = new HashMap<Character, Integer>();
char[] ch = str.toCharArray();
for (Character c : ch) {
if (hm.containsKey(c)) {
int values = hm.get(c);
System.out.println(values);
hm.put(c, values + 1);
} else {
hm.put(c, 1);
}
}
return hm;
}複製程式碼