Java
– 集合類
Collection
Collection
是最基本的集合接口,一個Collection
代表一組Object
,即Collection
的元素(Elements
)。Java SDK
不提供直接繼承自Collection
的類,Java SDK
提供的類都是繼承自Collection
的子接口如List
和Set
。
Map
Map
提供了一個更通用的元素存儲方法。 Map
集合類用於存儲元素對(稱作鍵和值),其中每個鍵映射到一個值。
整理對比
是否有序 | 是否允許元素重複 | ||
List | ArrayList | ✔ | ✔ |
LinkedList | ✔ | ✔ | |
Set | HashSet | ✘ | ✘ |
TreeSet | ✘ | ✘ | |
LinkedHashSet | ✔ | ✘ | |
Map | HashMap | ✘ | ✘ |
TreeMap | ✘ | ✘ | |
LinkedHashMap | ✔ | ✘ | |
IdentityHashMap | ✔ | ✘ | |
WeakHashMap | ✔ | ✘ |
HashMap
和 Hashtable
HashMap | Hashtable | |
版本 | since jdk1.1 | since jdk1.2 |
是否支持 Null Key & Null Value | ✔ | ✘ |
默認的初始大小 | 11 | 16 |
擴充公式 | 2n+1 | 2n |
線程安全 | ✔ | ✘ |
注:
Hashtable
中的t
是小寫的,不是大寫的注:
JDK 1.8
中使用了紅黑樹來存儲,從而大大加速了其查找效率。注:如果需要線程安全,那麼使用
ConcurrentHashMap
。HashTable
已經被淘汰了,不要在新的代碼中再使用它。
ArrayList
和 LinkedList
ArrayList | LinkedList | |
數據結構 | 動態數組 | 鏈表 |
默認的初始大小 | 10 | - |
擴充公式 | n+n/2 + 1 | - |
ArrayList
的存儲結構是數組,所以在數組末尾添加一個元素的開銷是固定的。
LinkedList
的存儲結構是鏈表,所以在鏈表中插入或者刪除一個元素的開銷是固定的。因此,
ArrayList
更適合查找,LinkedList
更適合增刪改運算。
操作
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.ven.java8.method.references.CreateFactory;
/**
* 測試使用java8 操作List/Map
*
*/
public class TestCollections {
public static void main(String[] args) {
// 操作Map部分
Map<String, Integer> items = new LinkedHashMap<>();
items.put("Name1", 10);
items.put("Name2", 20);
items.put("Name3", 30);
items.put("Name4", 40);
items.put("Name5", 50);
items.put("Name6", 60);
for (Map.Entry<String, Integer> entry : items.entrySet()) {
System.err.println("使用java8之前的版本 姓名 : " + entry.getKey() + " 分數 : " + entry.getValue());
}
//java8版本
items.forEach((k,v)->{
System.err.println("使用java8循環 /姓名 : " +k + " 分數 : " + v);
});
items.forEach((k,v)->{
if(k.equals("Name2")){
System.out.println("hello "+k);
}
});
System.out.println("------分割線-----");
//操作List部分
List<User> itemsList = new ArrayList<>();
User user1 =CreateFactory.create(User::new);
user1.setId("1");
user1.setUserName("Name4");
user1.setAge("12");
itemsList.add(user1);
User user2 =CreateFactory.create(User::new);
user2.setId("2");
user2.setUserName("Name5");
user2.setAge("23");
itemsList.add(user2);
for(User item : itemsList){
System.out.println(item.getId()+"-"+item.getUserName()+"-"+item.getAge());
}
System.out.println("------分割線-----");
//java8版本
itemsList.forEach(item->{
System.out.println(item.getUserName());
});
//條件過濾
itemsList.forEach(item->{
String userName = item.getUserName();
if(userName.equals("Name2")){
System.out.println("大家好我是"+userName);
}
});
//方法的引用
itemsList.forEach(System.out::println);
//stream and filter
itemsList.stream().filter(itemuser->itemuser.getUserName().equals("Name6")).forEach(item ->{
System.out.println("...........split........");
System.err.println(item.getUserName());
});
}
}