Java集合 还是比较重要的一部分内容吧,主要是由Collection接口以及它的子接口List、Set、Queue、抽象类以及这些子接口的实现类构成,Collection接口主要是单列集合,而Map接口以及它的实现类主要是Key、Value形式的键值对也就是双列集合。最后就是和集合相关的Collections工具类,这是一个包含了大量集合相关操作的静态的方发的工具类。

1.Collection接口

先看一下Collection接口的继承和实现关系图,从图上可以更加直观的弄明白这些接口或者类之间的关系。

Collection接口主要有三个子接口,分别是List、Set、Queue;三个实现它的抽象类 AbstractList、AbstractSet、AbstractQueue;整体上我们用常用的实现类有ArratList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、PriorityQueue。

在Collection接口中定义了下面一些方法,它的所有子接口或者实现类都包含下面一些常用的的方法,这里只列举了一部分:

  1. add()
  2. remove()
  3. clear()
  4. size()
  5. contains()
  6. isEmpty()
  7. iterator()

2.ArrayList

ArrayList是List的一个实现类,List继承于Collection接口,所以ArrayList实现了Collection接口中定义的所有方法。由ArrayList这个名字就能猜出来ArrayList的底层实际是由数组实现的。

基本

  1. 它继承于AbstractList,实现了List,RandomAccess[随机问],Cloneable[可克隆], java.io.Serializable[序列化]这些接口。
  2. ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能
  3. ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。
  4. ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆
  5. ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输

方法

增加操作

  1. add(E e):添加一个元素到列表的末尾。
  2. add( int index, E element ) :在指定的位置添加元素
  3. addAll( Collection<? extends E> c ):添加一个集合到元素的末尾.以上返回类型是boolean
  4. ensureCapcity(int minCapcity):确保列表中含有minCapcity的最小容量

删除操作

  1. remove(Object o):删除列表中第一个出现O的元素
  2. remove( int index):删除列表中指定位置的元素
  3. removeAll(Collection<?> c):删除列表中包含C的所有元素
  4. removeIf(Predictcate<? super E> filter):删除列表中给定谓词的所有元素
  5. removeRange( int from,int to ):删除从from到to的所有元素clear():清除所有的元素。返回类型为void

更改操作

  1. retainAll( Collection<?> c ):仅仅保留列表中和C相同的元素,相当于&运算
  2. set(int index,E element):用element替换index位置上的元素。
  3. size():返回此列表的元素数
  4. sort(Comparator<? super E> c):按照指定的排序规则排序
  5. subList( int from , int to ):返回从from到to之间的列表
  6. toArray():将列表转化为数组
  7. trimToSize( ):修改当前实例的容量是列表的当前大小。

查操作

  1. contains(Object o):如果包含元素o,则返回为true
  2. get(int index):返回指定索引的元素
  3. ndexOf( Object o ):返回此列表中指定元素的第一次出现的索引,如果列表不包含此元素,返回-1
  4. lastindexOf( Object o ):返回此列表中指定元素的最后一次出现的索引,如果列表不包含此元素,返回-1
  5. isEmpty():如果列表为空,返回true.

总结

  1. ArrayList 本质上是一个可改变大小的数组.当元素加入时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问.元素顺序存储 ,随机访问很快删除非头尾元素慢新增元素慢而且费资源 ,较适用于无频繁增删的情况 ,比数组效率低,如果不是需要可变数组,可考虑使用数组 ,非线程安全

3.LinkedList

LinkedList结构

特点

  1. 底层由双向链表实现,查找需要遍历整个链表知道找到指定的元素。
  2. 适合增加、删除操作多的场景,因为查询效率比较低。
  3. 线程不安全。

方法

LinkedList也是最终也相是实现了Collection接口,所以LinkedList中也包含了Collection接口中常用的方法。

4.Vector

Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:

  1. Vector 是同步访问的,但因此效率会低一些。
  2. Vector 包含了许多传统的方法,这些方法不属于集合框架。

5.HashSet

HashSet实现了Set接口,而Set接口继承自Collection接口,所以他也包含了Collection接口中定义的基本方法。Set最大的特点就是不允许元素重复,如果放入重复的元素

特点

  1. 它存储唯一元素并允许空值
  2. 它由HashMap支持
  3. 它不保持插入顺序
  4. 它不是线程安全的

HashSet的内部实质上是一个HashMap,当我们调用它的无参构造创建一个HashSet,它会调用下面的无参构造方法:

private transient HashMap<E,Object> map;
//默认构造器
public HashSet() {
    map = new HashMap<>();
}
//将传入的集合添加到HashSet的构造器
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
//明确初始容量和装载因子的构造器
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
//仅明确初始容量的构造器(装载因子默认0.75)
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

它的其他的相关方法也是调用了HashMap相关的一些方法实现的

6.TreeSet

  1. TreeSet继承于AbstractSet,并且实现了NavigableSet接口。
  2. TreeSet是一个包含有序的且没有重复元素的集合,通过TreeMap实现。TreeSet中含有一个"NavigableMap类型的成员变量"m,而m实际上是"TreeMap的实例"。

TreeSet在对自定义对象排序有下面自己方式,自定义类(Person)实现Comparable接口重写ComparaTo()方法即可,也可以在创建TreeSet的时候用Lambda表达式实现 Comparable接口来设置比较的条件。

package Collection;

import org.jetbrains.annotations.NotNull;

public class Person {
    private String name;
    private int age;

    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package Collection;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
    //先按照Person的name长度比较,相同再按照age逆序排序
        Collection<Person> collection6 =new TreeSet(((o1, o2) -> {
            int num1=((Person)o1).getName().length()-((Person)o2).getName().length();
            int num2=num1==0?((Person)o2).getAge()-((Person)o1).getAge(): num1;
            return num2;
        }));
        collection6.add(new Person("Yremp",1));
        collection6.add(new Person("Yremp1",2));
        collection6.add(new Person("Yremp2",3));
        collection6.add(new Person("Yremp11",3));
        Iterator iterator =collection6.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().toString());
        }
    }
}
"E:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
Person{name='Yremp', age=1}
Person{name='Yremp2', age=3}
Person{name='Yremp1', age=2}
Person{name='Yremp11', age=3}

7.LinkedHashSet

LinkedHashSet继承自HashSet,源码更少、更简单,唯一的区别LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,即遍历序和插入序是一致的。

8.PriorityQueue

PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。PriorityQueue 队列的头指排序规则最小的那个元素。如果多个元素都是最小值则随机选一个。下面简单的写个代码演示

package Collection;

import java.util.Iterator;
import java.util.PriorityQueue;

public class PriorityQueueTest {
    public static void main(String[] args) {
        //直接用Lambda表达式实现Comparable接口,按照数值大小升序设置优先级
        PriorityQueue priorityQueue = new PriorityQueue(((o1, o2) -> (int)o1-(int)o2));
        priorityQueue.add(5);
        priorityQueue.add(7);
        priorityQueue.add(4);
        priorityQueue.add(9);
        priorityQueue.add(1);
        Iterator  iterator = priorityQueue.iterator();
        while (iterator.hasNext()){
            System.out.println(priorityQueue. poll());
        }
    }
}

输出如下

"E:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
1
4
5
7
9

标签云

ajax AOP Bootstrap cdn Chevereto CSS Docker Editormd GC Github Hexo IDEA JavaScript jsDeliver JS樱花特效 JVM Linux Live2D markdown Maven MyBatis MyBatis-plus MySQL Navicat Oracle Pictures QQ Sakura SEO Spring Boot Spring Cloud Spring Cloud Alibaba SpringMVC Thymeleaf Vue Web WebSocket Wechat Social WordPress Yoast SEO 代理 分页 图床 小幸运 通信原理

Java Collection集合接口
Java Collection集合接口