以前看过一些关于Java集合类的内容,可是过段时间不用有些就忘记了,如今整理下之后看也方便,只是给本身当笔记看的~~~~html
(转载了一些注明:http://www.cnblogs.com/leeplogs/p/5891861.html)java
通常地,咱们经常使用的集合类有这几种:数组
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类框架
Map结构的集合类:HashMap类,Hashtable类dom
Set结构的集合类:HashSet类,TreeSet类spa
Queue结构的集合:Queue接口3d
首先呢,咱们来看看为何要用集合类,这就要说说集合类与数组的关系了。数组(能够存储基本数据类型)是用来存现对象的一种容器,可是数组的长度固定,不适合在对象数量未知的状况下使用。code
集合(只能存储对象,对象类型能够不同)的长度可变,可在多数状况下使用。 集合的底层,是如何实现可变长度的,这里咱们后面再来分析,。。。htm
一.Java集合框架图可见下图(实线边框的是实现类,折线边框的是抽象类,而点线边框的是接口)对象
在Java类库中,集合类的基本接口是Collection接口。这个接口有两个基本方法:
public interface Collection<E> { boolean add(E element); Iterator<E> iterator();
... }
add()方法就是添加元素了,而Iterator方法用于返回一个实现了Iterator接口的对象。 咱们能够使用这个迭代器的对象一次访问集合中的元素。
而Iterator接口包含4个方法:
public interface Iterator<E> { E next(); boolean hasNext(); void remove(); default void forEachRemaning(Consumer<? super E> action); }
经过反复调用next方法,能够逐个访问集合中的每一个元素。 若是到了集合末尾,next方法将会抛出一个NoSuchElementException.因此在调用next以前须要先调用一下hasNext()方法。
例如:
Collection<String> c = ...; Iterator<String> itra = c.iterator(); while(itra.hasNext()) { String element = itra.next(); do something with element... }
或者用foreach:
for(element:c) { do something with element; }
二. 集合有两个基本接口: Collection 和 Map
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。可是却让其被继承产生了两个接口,就是Set和List。Set中不能包含重复的元素。List是一个有序的集合,能够包含重复的元素,提供了按索引访问的方式。
Map是Java.util包中的另外一个接口,它和Collection接口没有关系,是相互独立的,可是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,可是能够包含相同的value。
三.几个具体的接口和实现类
1. List(有序,可重复)
相似于顺序表,元素会增长到容器中的特定位置,能够采用两种方式访问元素:1.迭代器 2.使用一个整数索引来访问。 后一种方式称为随机访问(random access),由于这样能够按任意顺序访问元素。List 查询数据快,可是插入,删除数据时速度很慢。
List 总用于随机访问的方法:
void add(int index. E element) void remove(int index) E get(int index) E set(int index, E element)
2.Set(无序,不可重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
3.Map(键值对,键惟一,值不惟一)
Map集合中存储的是键值对,键不能重复,值能够重复。根据键获得值,对map集合遍历时先获得键的set集合,对set集合进行遍历,获得相应的值。
对好比下:
四.具体的集合
1. LinkedList 链表
在java中,全部的链表实际都是双向连接的(doubly linked), 即每一个结点还存放着指向前驱结点的引用。
下面的代码中先是添加了3个元素,而后删去第二个位置的元素:
1 List<Integer> staff = new LinkedList<>(); 2 staff.add(10); 3 staff.add(25); 4 staff.add(48); 5 Iterator iter = staff.iterator(); 6 int a = (int) iter.next(); 7 int b = (int) iter.next(); 8 iter.remove();
LinkedList.add方法将对象添加到链表的尾部,可是,咱们经常须要将元素添加到链表中间,这时候咱们就须要用到迭代器了。
LinkedList类的 ListIteration方法 返回 一个实现了ListIterator接口的迭代器对象。 接下来演示一下越过链表中的第一个元素,在第二个元素以前添加元素。
List<String> staff =new LinkedList<>(); staff.add("A"); staff.add("B"); staff.add("C"); ListInterator<String> iter = staff.listIterator(); iter.next(); iter.add("D");
set方法:
1 List<String> staff =new LinkedList<>(); 2 staff.add("A"); 3 staff.add("B"); 4 staff.add("C"); 5 ListIterator<String> iter = staff.listIterator(); 6 iter.next(); 7 iter.add("D"); 8 iter.add("E"); 9 String oldValue = iter.next(); 返回的上一个元素 10 iter.set("F"); 11 System.out.println(oldValue); //B ADEFC
get方法:
List<String> staff =new LinkedList<>(); String bb = staff.get(2); System.out.println(bb);
固然这种方法效率极低,由于这是链表啊,。。
最后,分析下咱们为何要使用链表呢?
由于使用链表能够减小在列表中间插入或者删除元素所付出的代价,若是元素较少,那么彻底能够使用ArrayList。 若是须要对集合中的元素进行随机访问,那么就使用ArrayList()或者数组。
篇幅过长,换一页吧: http://www.cnblogs.com/lzynuaa/p/7256833.html 。