当前位置: 首页 > 教程 > Java集合 >

什么是Java集合

精华
小牛编辑
348浏览
2023-03-14

1 什么是Java集合

Java中的Collection是一个框架,提供了用于存储和操作对象组的体系结构。

Java Collections可以完成您对数据执行的所有操作,例如搜索,排序,插入,操作和删除。

Java Collection表示单个对象单元。Java Collection框架提供了许多接口(Set,List,Queue,Deque)和类(ArrayList,Vector,LinkedList,PriorityQueue,HashSet,LinkedHashSet,TreeSet)。

2 Java集合层次结构

3 Java Collection接口的方法

在Collection接口中声明了许多方法。如下:

方法 描述
public boolean add(E e) 用于在此集合中插入元素。
public boolean addAll(Collection<? extends E> c) 用于在调用集合中插入指定的集合元素。
public boolean remove(Object element) 用于从集合中删除元素。
public boolean removeAll(Collection<?> c) 用于从调用集合中删除指定集合的​​所有元素。
default boolean removeIf(Predicate<? super E> filter) 用于删除集合中所有满足指定谓词的元素。
public boolean retainAll(Collection<?> c) 用于删除调用集合中除指定集合之外的所有元素。
public int size() 返回集合中元素的总数。
public void clear() 从集合中删除元素总数。
public boolean contains(Object element) 用于搜索元素。
public boolean containsAll(Collection<?> c) 用于搜索集合中的指定集合。
public Iterator iterator() 返回一个迭代器。
public Object[] toArray() 将集合转换为数组。
public <T> T[] toArray(T[] a) 将集合转换为数组。返回数组的运行时类型是指定数组的运行时类型。
public boolean isEmpty() 检查集合是否为空。
default Stream<E> parallelStream() 以集合为源返回可能并行的Stream。
default Stream<E> stream() 返回一个以集合为源的顺序Stream。
default Spliterator<E> spliterator() 在集合中的指定元素上生成拆分器。
public boolean equals(Object element) 匹配两个集合。
public int hashCode() 返回集合的哈希码编号。

4 Iterator接口

Iterator接口提供迭代元素的功能。

Iterator接口中只有三种方法。分别是:

方法 描述
public boolean hasNext() 如果迭代器有更多元素,则返回true,否则返回false。
public Object next() 返回该元素,并将光标指针移动到下一个元素。
public void remove() 删除迭代器返回的最后一个元素。

5 Iterable接口

Iterable接口是所有集合类的根接口。Collection接口继承了Iterable接口,因此Collection接口的所有子类也实现了Iterable接口。

Iterable接口仅包含一种抽象方法:

Iterator<T> iterator()  
  • 返回类型T的元素上的迭代器。

6 Collection接口

Collection接口是由集合框架中的所有类实现的接口。它声明每个集合所包含的方法。换句话说,Collection接口是集合框架依赖的基础。

Collection接口的一些方法是Boolean add ( Object obj), Boolean addAll ( Collection c), void clear()等,它们由Collection接口的所有子类实现。

7 List接口

List接口是Collection接口的子接口。我们可以在List中存储对象的有序集合,且可以有重复的值。

List接口由ArrayList,LinkedList,Vector和Stack类实现。

要实例化List接口,我们必须使用:

List <data-type> list1= new ArrayList();  
List <data-type> list2 = new LinkedList();  
List <data-type> list3 = new Vector();  
List <data-type> list4 = new Stack();  

List接口中有多种方法可用于插入,删除和访问List中的元素。

6 ArrayList

ArrayList类实现List接口。它使用动态数组来存储不同数据类型的重复元素。ArrayList类保持插入顺序,并且是不同步的。可以随机访问ArrayList类中存储的元素。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;
class TestJavaCollection1{
    public static void main(String args[]){
        ArrayList<String> list=new ArrayList<String>();//创建ArrayList
        list.add("eric");//往ArrayList存入元素
        list.add("jack");
        list.add("lucy");
        list.add("rose");
        //迭代ArrayList的元素
        Iterator itr=list.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
lucy
rose

7 LinkedList

LinkedList实现Collection接口。它在内部使用双向链表来存储元素。它可以存储重复的元素。它保持插入顺序,并且不同步。在LinkedList中,由于不需要进行移位,因此操作很快。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java LinkedList的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        LinkedList<String> al=new LinkedList<String>();
        al.add("eric");
        al.add("jack");
        al.add("lucy");
        al.add("rose");
        Iterator<String> itr=al.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
lucy
rose

8 Vector

Vector使用动态数组来存储数据元素。它类似于ArrayList。但是,它是同步的,并且包含不属于Collection框架的许多方法。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java Vector的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        Vector<String> v=new Vector<String>();
        v.add("eric");
        v.add("jack");
        v.add("lucy");
        v.add("rose");
        Iterator<String> itr=v.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
lucy
rose

9 Stack

Stack是Vector的子类。它实现了后进先出的数据结构。Stack包含Vector类的所有方法,还提供定义其属性的方法,如 boolean push(), boolean peek(), boolean push(object o)。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java Stack的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        Stack<String> stack = new Stack<String>();
        stack.push("eric");
        stack.push("jack");
        stack.push("mark");
        stack.push("rose");
        stack.push("lucy");
        stack.pop();
        Iterator<String> itr=stack.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
mark
rose

10 Queue接口

Queue接口保持先进先出顺序。可以将其定义为用于容纳将要处理的元素的有序列表,有许类(例如PriorityQueue,Deque和ArrayDeque)实现了Queue接口。

Queue接口可以实例化为:

Queue<String> q1 = new PriorityQueue();  
Queue<String> q2 = new ArrayDeque();  

有多种实现Queue接口的类。

11 PriorityQueue

PriorityQueue类实现Queue接口。它包含要按其优先级处理的元素或对象。PriorityQueue不允许将空值存储在队列中。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java PriorityQueue的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        PriorityQueue<String> queue=new PriorityQueue<String>();
        queue.add("eric");
        queue.add("rose");
        queue.add("jack");
        queue.add("lucy");
        System.out.println("head:"+queue.element());
        System.out.println("head:"+queue.peek());
        System.out.println("迭代队列的元素:");
        Iterator itr=queue.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
        queue.remove();
        queue.poll();
        System.out.println("移除队列的两个元素:");
        Iterator<String> itr2=queue.iterator();
        while(itr2.hasNext()){
            System.out.println(itr2.next());
        }
    }
}

输出结果为:

head:eric
head:eric
迭代队列的元素:
eric
lucy
jack
rose
移除队列的两个元素:
lucy
rose

12 Deque接口

Deque接口扩展了Queue接口。在Deque中,我们可以从两侧移除和添加元素。Deque代表双端队列,它使我们能够在两端执行操作。

Deque队列可以实例化为:

Deque d = new ArrayDeque();  

13 ArrayDeque

ArrayDeque类实现Deque接口。它有助于我们使用双端队列。与队列不同,我们可以从两端添加或删除元素。

ArrayDeque比ArrayList和Stack更快,并且没有容量限制。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java ArrayDeque的例子
 */
import java.util.*;

public class Demo{

    public static void main(String[] args) {
        //创建ArrayDeque对象,添加元素
        Deque<String> deque = new ArrayDeque<String>();
        deque.add("eric");
        deque.add("jack");
        deque.add("lucy");
        //访问队列元素
        for (String str : deque) {
            System.out.println(str);
        }
    }
}

输出结果为:

eric
jack
lucy

14 Set接口

Java中的Set接口存在于java.util软件包中。Set接口继承了Collection接口。它代表无序的元素集,不允许我们存储重复元素。我们最多可以在Set中存储一个空值。Set由HashSet,LinkedHashSet和TreeSet实现。

Set接口可以实例化为:

Set<data-type> s1 = new HashSet<data-type>();  
Set<data-type> s2 = new LinkedHashSet<data-type>();  
Set<data-type> s3 = new TreeSet<data-type>();  

15 HashSet

HashSet类实现Set接口。它表示使用哈希表进行存储的集合。HashSet用于将元素存储在HashSet中。HashSet存储唯一的元素。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java HashSet的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        //创建HashSet对象,放入元素
        HashSet<String> set=new HashSet<String>();
        set.add("eric");
        set.add("rose");
        set.add("mark");
        set.add("lucy");
        //访问元素
        Iterator<String> itr=set.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
rose
lucy
mark

16 LinkedHashSet

LinkedHashSet类是Set接口的LinkedList实现。它继承了HashSet类并实现Set接口。像HashSet一样,它也包含唯一元素。它保持插入顺序并允许空元素。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java LinkedHashSet的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        LinkedHashSet<String> set=new LinkedHashSet<String>();
        set.add("eric");
        set.add("jack");
        set.add("rose");
        set.add("lucy");
        Iterator<String> itr=set.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
rose
lucy

17 SortedSet接口

SortedSet是Set接口的替代方法,它提供其元素的总体排序。SortedSet的元素以升序排列。SortedSet提供了其他禁止元素自然排序的方法。

SortedSet可以实例化为:

SortedSet<data-type> set = new TreeSet();  

18 TreeSet

Java TreeSet类实现了Set接口,该接口使用树进行存储。与HashSet一样,TreeSet也包含唯一元素。但是,TreeSet的访问和检索时间非常快。TreeSet中的元素以升序存储。

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 * Java TreeSet的例子
 */
import java.util.*;

public class Demo{

    public static void main(String args[]){
        //创建TreeSet集合,添加元素
        TreeSet<String> set=new TreeSet<String>();
        set.add("eric");
        set.add("jack");
        set.add("mark");
        set.add("rose");
        //访问元素
        Iterator<String> itr=set.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
mark
rose