今天来理顺一下Java里面的Collection集合以及里面的子集合,请看下面这张图片:
Collectio集合有两个子接口:List和Set
List的特点:元素是有序的,元素可以重复,因为该集合体系有索引
Set的特点:元素是无序的,元素不能重复
List集合底下的三个子接口;
ArrayList:底层使用的是数组结构,特点:查询速度很快,还有修改,但是增删稍慢,线程不同步
LinkedList:底层使用的是链表结构 特点:增删速度很快,查询速度稍慢
Vector:底层是数组数据结构,线程同步,无论增删,还是查询效率都慢,被ArrayList取代了
先来说一下List集合的公共方法:
增:add(index,element);
删:remove(index);
改:set(index,element);
查:get(index); && subList(from,to); && listIterator();
其中listIterator是List特有的迭代器,ListIterator是Iterator的子接口。在迭代时,不能通过集合对象的方法操作集合中的元素,因为会产生ConcurrentModificationException异常,所以在迭代时只能用迭代器的方法去操作元素,可是Iterator的方法是有限的,只能进行元素的查询,删除,判断操作,如果想要 其他的操作。如添加,修改,就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。
分别说一下三个子接口:
ArrayList接口的相关代码:
import java.util.*;
public class Test01{
public static void main(String[] args){
method_get();
}
public static void sop(Object obj){
System.out.println(obj);
}
public static void base_method(){
ArrayList a = new ArrayList();
//添加
a.add("a");
a.add("b");
a.add("c");
a.add("d");
//获取元素个数
sop(a.size());
//打印集合
sop(a);
//删除元素
a.remove("a");
sop(a);
//判断元素
sop(a.contains("b"));
//清空集合
//a.clear();
//集合是否为空
sop(a.isEmpty());
}
public static void method_2(){
ArrayList a1 = new ArrayList();
a1.add("1");
a1.add("2");
a1.add("3");
a1.add("4");
ArrayList a2 = new ArrayList();
a2.add("3");
a2.add("4");
a2.add("5");
a2.add("6");
//a1.retainAll(a2);//取交集
a1.removeAll(a2);//去掉和a2中相同的元素
sop(a1);
sop(a2);
}
/*
什么是迭代器:
是用于取出集合中元素的一种方式
*/
public static void method_get(){
ArrayList a1 = new ArrayList();
a1.add("java01");
a1.add("java02");
a1.add("java03");
a1.add("java04");
Iterator it = a1.iterator();//获取迭代器,用于取出集合中的元素
/*
sop(it.hasNext());//有元素返回的是true,没有元素返回的是false
sop(it.next());
sop(it.next());
sop(it.next());
sop(it.next());
*/
while(it.hasNext()){
sop(it.next());
}
}
}
LinkedList接口的相关代码:
/*
使用linkedlist模拟一个堆栈和队列的数据结构
堆栈:先进先出,如同一个杯子
队列:先进后出,如同一个水管
*/
import java.util.*;
public class linkedlist2{
public static void main(String[] args){
DuiLie li = new DuiLie();
li.myAdd("java01");
li.myAdd("java02");
li.myAdd("java03");
li.myAdd("java04");
while(!li.isNull()){
System.out.println(li.myGet());
}
}
}
class DuiLie{
private LinkedList link;
public DuiLie(){//一初始化就创建对象
link = new LinkedList();
}
public void myAdd(Object obj){
link.addFirst(obj);
}
public Object myGet(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}
Vector的相关代码:
import java.util.*;
/*
枚举就是Vector特有取出方式
发现枚举和迭代器很像:其实枚举和迭代是一样的
因为枚举的名称和其方法的名称都过长了,所以被迭代给取代了
*/
public class Vector{
public static void main(String[] args){
Vector v = new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en = v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElements());
}
}
}