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());
});
}
}