Java List - zhongjiajie/zhongjiajie.github.com GitHub Wiki

Java-List

List基础

常用方法

  • set: 替换List中对应index的元素,list.set(index, element)
  • add: 增加元素list.add(E e)
  • remove: 删除元素list.remove(Object o)
  • for: 遍历列表for (Object o: list)
  • removeAll: 対两个列表做减法list1.removeAll(list2),将list2中的全部元素在list1中移除

功能实现

初始化list

// 初始化空list
List myList = new ArrayList();
// 初始化一个非空固定长度的list
List<Integer> list = Arrays.asList(1, 2);
// 初始化一个非空非固定长度list
List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));

ArrayList

实现了List接口,底层使用的是数组,存储空间上是相邻的,所以查询起来会很方便,查询效率也会比LinkedList要高,除了List抽象类通用方法外还有isEmpty方法

LinkedList

实现了List接口,底层使用的是使用双向链表,存储的数据在空间上很可能不相邻,但是他们都有一个引用连在一起,所以增删起来会很方便,除了List通用方法外的常用的方法有insert,这些方法可以使得其变成堆栈(stack),队列(queue)或双向队列(deque)

Vector

与ArrayList十分相似,区别就是就是vector是一种线程安全类,它的方法都带有Synchronized关键字,实际中很少用到.如果遇到多线程的问题,java提供了一个Collections工具类,可以把ArrayList转换成线程安全的类

FAQ

  • 获取最后的element: Object element = list.get(list.size() - 1);

判断list是否相等

参考: 先做特殊性判断, 然后再排序equals

public  boolean equalLists(List<String> one, List<String> two){
    if (one == null && two == null){
        return true;
    }

    if((one == null && two != null)
      || one != null && two == null
      || one.size() != two.size()){
        return false;
    }

    // to avoid messing the order of the lists we will use a copy
    // as noted in comments by A. R. S.
    one = new ArrayList<String>(one);
    two = new ArrayList<String>(two);

    Collections.sort(one);
    Collections.sort(two);
    return one.equals(two);
}

使用Iterator遍历列表

使用迭代器Iterator类来完成遍历.主要有两个方法,基于这两个方法就能进行遍历操作:next()方法来获取序列的下一个元素,hasNext()检查序列中是否还有元素

public static void remove(long id) {
    Iterator<Post> iterator = posts.iterator();
    while (iterator.hasNext()) {
        Post post = iterator.next();
        if (post.getId() == id) {
            posts.remove(post);
            return;
        }
    }
}

两个list找到仅存在于一个list中的元素

找到只在list1中出现不在list2中出现的唯一对象

Set<Date> setA = new HashSet<Date>(a);
Set<Date> setB = new HashSet<Date>(b);
setA.removeAll(setB);

// 其实简化版可以不创建bd对象,直接
Set<Date> setA = new HashSet<Date>(a);
setA.removeAll(bd);

对非基础对象的列表进行排序

一般使用Collections中的sort功能, 并且自定义一个Comparator进行指定数据的排序

List<Map<String, String>> list = new ArrayList<>();
//Add entries
Collections.sort(list, new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        Collection<String> values1 = o1.values();
        Collection<String> values2 = o2.values();
        if(!values1.isEmpty() && !values2.isEmpty()){
            return values1.iterator().next().compareTo(values2.iterator().next());
        }else{
            return 0;
        }
    }
});

BTW: compare中的源码是返回-1 0 1的值,源码如下

// this.values < other.value 返回 -1 默认升序
public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

⚠️ **GitHub.com Fallback** ⚠️