什么是Java集合
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