List
簡介
常用方法
ArrayList VS LinkedList
遍歷List
List和Array轉換
List轉爲Array
Array轉爲List
重寫equals方法
總結
Map
映射
遍歷Map
HashMap
SortedMap
equals()和hashCode()方法
總結
Properties
讀取配置
總結
List
簡介
List是一種有序鏈表:
- List內部按照放入元素的先後順序存放
- 每個元素都可以通過索引確定自己的位置
- 類似數組,但大小可變
常用方法
- void add(E e) 在末尾添加一個元素
- Void add(int index, E e) 在指定索引處添加一個元素
- int remove(int index) 刪除指定索引的元素
- int remove(Object e) 刪除某個元素
- E get(int index) 獲取指定索引的元素
- int size() 獲取鏈表大小(包含元素的個數)
- boolean contains(Object o) 是否包含某個元素
- int indexOf(Object o) 某個元素的索引位置
ArrayList VS LinkedList
遍歷List
- 使用get(int index)
List<String> list = ...
for (int i=0; i<list.size(); i++) {
String s = list.get(i);
}
- 使用Iterator
List<String> list = ...
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
}
- 使用foreach
List<String> list = ...
for (String s : list) {
...
}
List和Array轉換
List轉爲Array
- Object[] toArray()
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Object[] array = list.toArray();
// {1, 2, 3}
- T[] toArray(T[] a)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] array = list.toArray(new Integer[3]);
// Integer[] {1, 2, 3}
Number[] ns = list.toArray(new Number[3]);
// Number[] {1, 2, 3}
Array轉爲List
- List Arrays.asList(T…a)
Integer[] array = {1, 2, 3};
List<Integer> list = Array.asList(array);
// 返回的list不是ArrayList,是一個List對象,只讀不可寫
list.add(4); // UnsupportedOperationException
// 如果想轉換成一個ArrayList對象,可以創建一個新的ArrayList對象,然後把List對象的數據都添加進去
List<Integer> arrayList = new ArrayList<>();
arrayList.addAll(list);
// 代碼簡寫爲
Integer[] array = {1, 2, 3}
List<Integer> arrayList = new ArrayList(Arrays.asList(array));
重寫equals方法
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Score score1 = (Score) o;
return score == score1.score && Objects.equals(name, score1.name);
}
總結
List的特點:
- 按索引順序訪問的長度可變的鏈表
- 優先使用ArrayList而不是LinkedList
- 可以直接使用for…each遍歷
- 可以和Array相互轉換
如果要在List中查找元素:
- List的實現類通過元素的equals方法比較兩個元素
- 放入的元素必須正確覆寫equals方法(JDK提供的String、Integer等已經覆寫了equals方法)
- 編寫equals方法可藉助Objects.equals()判斷
如果不在List中查找元素:
- 不必覆寫equals方法
Map
映射
Map<K, V>是一種鍵-值(Key-Value)映射表:
- 可以通過Key快速查找Value(元素)
Map<String, Student> map = ...
Student stu = map.get("XiaoMing");
- V put(K key, V value) 把Key-Value放入Map
- V get(K key) 通過Key獲取Value
- boolean containsKey(K key) 判斷Key是否存在
遍歷Map
- 遍歷Key可以使用for…each循環遍歷keySet()
Map<String, Integer> map = ...
for (String key : map.keySet()) {
Integer value = map.get(key);
}
- 同時遍歷Key和Value可以使用for…each循環遍歷entrySet()
Map<String, Integer> map = ...
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
}
HashMap
最常用的實現類是HashMap,HashMap內部存儲不保證有序
- 遍歷時的順序不一定是put放入的順序,也不一定是Key的排序順序
Map<String, Integer> map = new HashMap<>();
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
System.out.println(key + "->" + map.get(key));
}
// B -> 78 A -> 59 C -> 89
SortedMap
SortedMap保證遍歷時以Key的順序排序
- SortedMap的實現類是TreeMap
Map<String, Integer> map = new TreeMap<>();
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
System.out.println(key + "->" + map.get(key));
}
// A -> 59 B -> 78 C -> 89
自定義排序需要創建TreeMap時傳入一個Comparator
Map<String, Integer> map = new TreeMap<>(new Comparator<String>() {
public int compare(String o1, String o2) {
// 倒序
return o2.compareTo(o1);
}
});
map.put("A", 59);
map.put("B", 78);
map.put("C", 89);
for (String key : map.keySet()) {
System.out.println(key + "->" + map.get(key));
}
// C -> 89 B -> 78 A -> 59
equals()和hashCode()方法
正確使用Map必須保證:
- 作爲Key的對象必須正確覆寫equals()方法,例如:String、Integer…
class Person {
private String name;
private int age;
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Person) {
Person p = (Person)obj;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
}
- 作爲Key的對象必須正確覆寫hashCode()方法:
- 如果兩個對象相等,則兩個對象的hashCode()必須相等
- 如果兩個對象不相等,則兩個對象的hashCode() 不需要相等
public int hashCode() {
// 保證name和age相同時,兩個對象時相同的
return Objects.hash(this.name, this.age);
}
如果一個對象覆寫了equals()方法,就必須正確覆寫hashCode()方法:
- 如果a.equals(b) == true, 則a.hashCode() == b.hashCode()
- 如果a.equals(b) == false, 則a和b的hashCode()儘量不要相等
總結
- Map<K, V> 是一種映射表,可以通過Key快速查找Value
- 可以通過for…each遍歷keySet()
- 可以通過for…each遍歷entrySet()
- 需要對Key排序時使用TreeMap
- 通常使用HashMap
- 作爲Key的對象必須正確覆寫equals和hashCode方法
- 一個類如果覆寫了equals,就必須覆寫hashCode方法
- hashCode可以通過Objects.hash()輔助方法實現
Properties
讀取配置
Properties用來讀取配置:
- .properties文件只能使用ASCII編碼
- 可以從文件系統讀取.properties文件
// 獲取文件路徑
String path = "C:\\conf\\setting.properties";
// 創建Properties對象
Properties props = new Properties();
// 加載文件
props.load(new FileInputStream(path));
// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");
- 可以從ClassPath讀取.properties文件
Properties props = new Properties();
// 從ClassPath下讀取文件
props.load(getClass().getResourceAsStream("/common/setting.properties"));
// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");
-
可以讀取多個.properties文件
-
後讀取的Key-Value會覆蓋已讀取的Key-Value
Properties props = new Properties();
// 從ClassPath下加載配置
props.load(getClass().getResourceAsStream("/common/setting.properties"));
// 從文件中讀取加載配置
props.load(new FileInputStream("C:\\conf\\setting.properties"));
// 讀取配置
String url = props.getProperty("url");
// 設置默認值,當key不存在是返回默認值
String desc = props.getProperty("description", "default description");
Properties實際上是從Hashtable派生:
- String getProperty(String key)
- void setProperty(String key, String Value)
Object get(Object key)繼承下來的方法,不要使用void put(Object key, Object value)繼承下來的方法,不要使用
總結
- Properties用於讀寫配置文件xxx.properties
- .properties文件只能使用ASCII編碼
- 可以從ClassPath或文件系統讀取.properties文件
- 讀寫Properties時:
- 僅使用getProperty() / setProperty()方法
- 不要使用繼承而來的get() / put() 方法