集合两大接口:Collection(集合的根接口),Map(映射集合的根接口)
1.Collection:来源于Java.util包,Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子
接口”如List和Set。
1.1.List :有序集合,包含重复的元素的Collection
1.1.1.可以使用索引(类似数组中的下标),访问List指定位置的元素
list.get(i)//获得List集合中的元素
1.1.2.允许集合中有相同的元素和null元素
1.1.3.实现List接口的常用类有LinkedList,ArrayList(常用),Vector(Stack是Vector的子类)
1.1.4.查找元素效率高
1.2.Set:无序集合,不包含重复的元素的Collection
1.2.1.最多有一个null元素
1.2.2.传入的Collection参数不能包含重复的元素,如果添加已存在元素,会覆盖
1.2.3.实现类主要有HashSet和TreeSet
1.2.4.删除,插入元素效率高
1.3.Queue:用于模拟队列这种数据结构,先进先出
1.3.1.在处理之前保存元素的集合(List,Set属于同级别);
1.3.2.除了具有Collection接口基本的操作能力之外还提供了额外的插入,移除,检查操作
1.3.3.每个Queue方法都有两种形式:
(1)如果操作失败则抛出异常(插入:add(e),移除:remove(),检查:element())
(2)如果操作失败,则返回特殊值[null或false,具体取决于操作](插入:offer(e),移除:poll(),检查:peek())
1.3.4.队列的头部都是通过调用remove或poll移除的元素(无论使用什么排序)
1.3.5.队列通常以以FIFO(先进先出)方式对元素进行排序
1.3.6.在FIFO队列中,所有新元素都插入队列的尾部
1.3.7.常用实现类有LinkedList,PriorityQueue
使用队列Queue时注意两点:
(1)队列的实现通常不允许插入null值,尽管LinkedList允许插入null值,但是实践中尽量避免!!
(2)队列的实现通常不需要重写该类的equasl和hashCode方法,代替使用Object类默认的定义,因为在队列里面一样的元
素可能拥有不同的排序属性,每个Queue实现都必须指定其排序属性
1.4.Deque:Deque是Queue的子接口
1.3.1.是双端队列,双端队列是元素的线性集合,支持在两个端点处插入和移除,检索元素
1.3.2.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者
1.3.3.实现接口实现类用ArrayDeque(总体ArrayDeque要比LinkedList更优越)
2.Map:来源于Java.util包,Map没有继承Collection接口,是java定义的一种键值对映射的数据结构接口
2.1.一个Map中不能包含相同的key,每个key只能映射一个value
2.2.key不要求有序,不允许重复;value同样不要求有序,但可以重复
2.3.Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射
2.4.实现Map接口的常用类有Hashtable (是同步的),HashMap(非同步的),WeakHashMap,LinkedHashMap,TreeMap
2.3.1.WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
2.5.Map提供key到value的映射
总结:Set和List的区别(3点)
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
扩展:迭代器 (简单说就是为了计数用的!!!)
1.遍历集合方法(3种)
1.1.一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架
1.2.采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口。
2.迭代器(Iterator),使你能够通过循环来得到或删除集合的元素。
3.ListIterator 继承了Iterator,以允许双向遍历列表和修改元素
4.ListIterator 与Iterator区别:
4.1.不同点
4.1.1.Iterator比较通用,List,Set,Map均可以使用,ListIterator 只能用于List集合中
4.1.2.ListIterator有add()方法,可以向List中添加对象,而Iterator不能
4.1.3.ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历,Iterator就不可以
4.1.4.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现,Iterator没有此功能
4.1.5.ListIterator是Iterator 的子接口,添加了一些方法
4.1.6.ListIterator可以实现对象的修改,set()方法可以实现,Iierator仅能遍历,不能修改。
4.2.相同点
4.2.1.都可实现删除对象
4.2.2. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历
4.2.2.1.hasNext():集合中有元素就返回true
4.2.2.2.next():集合中的下一个元素
4.3.总结:
4.3.1.ListIterator是一个比 Iterator更加强大的迭代工具
4.3.2.ListIterator唯一不足就是只能用于List集合
4.3.3.在单线程的遍历过程中,如果要进行 remove 操作,可以调用迭代器的 remove 方法而不是集合类的 remove 方法
5.常用代码示例:
5.1.向集合中添加元素,使用ListIterator的add() 方法
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);//获取元素集合[aaa,bbb,ccc]
System.out.println(list.get(0));//获取下标为0的元素[aaa]
//Iterator 接口(没有add()方法)
//Iterator<String> it = list.iterator();
ListIterator<String> it = list.listIterator();
while(it.hasNext()){
String s = it.next();
//向指定元素后面添加(如果不指定,将在每个元素后面都加"1")
if(s.equals("aaa")){
it.add("1");
}
}
System.out.println(list);//[aaa,1,bbb,ccc]
}
5.2.删除集合中的元素(ListIterator和Iterator均可)
//Iterator 接口(没有add()方法)
//Iterator<String> it = list.iterator();
ListIterator<String> it = list.listIterator();
while(it.hasNext()){
String s = it.next();
//删除集合元素aaa
if("aaa".equals(s)){
it.remove();
}
}
System.out.println(list);//输出移除后的元素集合[bbb,ccc]
}
5.3.重新设置集合中的元素,使用ListIterator的set() 方法
//Iterator 接口(没有set()方法)
//Iterator<String> it = list.iterator();
ListIterator<String> it = list.listIterator();
while(it.hasNext()){
String s = it.next();
//将集合元素aaa设置为AAA
if("aaa".equals(s)){
it.set("AAA");
}
}
System.out.println(list);//输出重置后的元素集合[AAA,bbb,ccc]
}
下一步会逐个介绍,集合接口中的那些实现类(用法,区别等)