集合类主要分为两大类,即Collection和Map;
Collection又分为List、Set和Queue;
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.peek();
queue.poll();
特点:添加删除快,读取指定位置元素慢
put()
操作的时候,计算key的hashCode,并对其再次进行hash运算,使最后结果在[0,当前数组长度)范围,然后到数组这个位置的链表中遍历,看是否已经存在了这个key,如果确实没有则追加到链表尾部。get()
操作的时候也类似,就是计算key的hash找到链表,遍历找到key,将Entry取出。根据hash值得到数组下标,最简单的方式是hashCode % length
,HashTable就是这么做的。但是取模算法计算速度较慢,所以HashMap中将算法优化为hashCode & (length-1)
,当length取值为2的整数次幂时,即可得到一个符合条件的下标值,且计算速度更快。
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
HashMap + 一个双向链表
上图中,黑色的表示HashMap,红色的表示双向链表
两者都是接口,前者是类实现这个接口后(重写compareTo(T t)),就可以通过Arrays.sort或Collections.sort对这个类组成的数组或集合进行排序。
后者则是如果类本身没有实现Comparable,且不方便改类的时候,可以通过写一个比较器类实现Comparator(重写compare(T t1,T t2)),将这个比较器传入sort方法中,也可以完成排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
//自定义 用户类型 排序方式,按年龄
public class User implements Comparable<User>{
private int age;
private String name;
//实现Comparable接口必须重写compareTo方法
@Override
public int compareTo(User user) {
if(this.age==user.age){
return 0;
}else if(this.age>user.age){
return 1;
}else{
return -1;
}
}
//===getter and setter======
}
//将用户列表list按年龄排序
List<User> list = new ArrayList<>();
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User user1, User user2) {
if(user1.getAge() == user2.getAge()){
return 0;
}else if(user1.getAge() > user2.getAge()){
return 1;
}else{
return -1;
}
}
});