Java集合

分类

集合类主要分为两大类,即Collection和Map;
Collection又分为List、Set和Queue;

集合


实现原理

List接口

ArrayList

arraylist

Vector

LinkedList

Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.peek();
queue.poll();

特点:添加删除快,读取指定位置元素慢

linkedlist


Map接口

HashMap

hashmap

为什么数组长度必须为2的整数次幂

根据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);
}

LinkedHashMap

linkedhashmap

上图中,黑色的表示HashMap,红色的表示双向链表

TreeMap

HashTable & ConcurrentHashMap


Set


Comparable vs Comparator

两者都是接口,前者是类实现这个接口后(重写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;
        }
    }
});