14天-01-集合框架
集合类出现:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组与集合类同是容器,有何不同?
数组长度是固定的,集合长度是可变的;数组中只可以存储基本数据类型,集合可以存储对象。
迭代器其实就是集合的取出元素的方式,用于循环遍历。
集合迭代器Iterator:
在集合中,把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容,判断和取出,那么就将这些共性抽取,这个就是Iterator,对外提供iterator();方法,hasNext();判断是否还有元素,next();获取下一个元素,remove();移除此元素。
Collection 接口 add,remove,contains,clear,iterator
List: 元素是有序的,元素可以重复,因为该集合体系有索引。
ArrayList:底层使用的是数组数据结构。特点:查询、修改操作很快,增加、删除慢。线程非同步
LinkList:底层使用的是链表数据结构。特点:增加、删除、修改操作快,查询慢。
Vector:底层使用的是数组数据结构。特点:线程同步,被ArrayList代替了。
Set: 元素是无序的(存入和取出的顺序不一致),元素不可以重复。
HashSet:底层使用的是哈希表数据结构。线程非同步。保证元素唯一性的原理:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的equals方法。
TreeSet:底层使用的是二叉树数据结构。保证元素唯一性的原理:比较compareTo方法return -1,0,1。可以对Set集合中的元素排序。
List:特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增 add(index,element); addAll(index,Collection);
删 remove(index);
改 set(index,element);
查 get(index); subList(from,to); //包括开始,不包括结束元素 listIterator();
Listiterator:该接口只能通过List集合的listIterator()方法获取。
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModifyException异常。所以,在迭代器时,只能用迭代器的删取操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他操作如添加,修改等,就需使用其子接口:ListIterator
Vector:
枚举就是Vector特有的取出方式,其实枚举和迭代器是一样的,因为枚举的名称以及方法名称都过长,所以被迭代器取代了。Enumeration<E> elements()获取Vector枚举元素类似Iterator,hasMoreElements();//判断是否有下一个元素 nextElement();//获取下一个元素
LinkedList:
LinkedList特有方法:
addFirst(); addLast(); //添加元素
getFirst(); getLast(); //获取元素,不删除元素
removeFirst(); removeLast(); //删除元素,并获取元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法:
offerFirst(); offerLast(); //添加元素
peekFirst(); peekLast(); //获取元素,不删除元素。如果集合中没有元素,会返回null
pollFirst(); pollLast(); //删除元素,并获取元素。如果集合中没有元素,会返回null
List集合判断元素是否相同,依据元素的equals方法。
1 /* 2 使用LinkedList模拟一个堆栈和队列数据结构 3 堆栈:先进后出。队列:先进先出。 4 */ 5 //队列:先进先出 6 class Queue 7 { 8 private LinkedList link; 9 10 Queue() 11 { 12 link = new LinkedList(); 13 } 14 15 public void add(Object object) 16 { 17 link.addFirst(object); 18 } 19 20 public Object get() 21 { 22 return link.removeLast(); 23 } 24 25 public boolean isEmpty() 26 { 27 return link.isEmpty(); 28 } 29 } 30 //堆栈:先进后出 31 class Stack 32 { 33 private LinkedList link; 34 35 Stack() 36 { 37 link = new LinkedList(); 38 } 39 40 public void add(Object object) 41 { 42 link.addFirst(object); 43 } 44 45 public Object get() 46 { 47 return link.removeFirst(); 48 } 49 50 public boolean isEmpty() 51 { 52 return link.isEmpty(); 53 } 54 }