java高级集合部分
- 格式:doc
- 大小:135.00 KB
- 文档页数:13
集合框架Key Point* Collection 接口、Set 接口、List 接口基本操作:一)集合框架:Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类)。
所有抽象出来的数据结构和操作(算法)统称为集合框架。
三)集合框架的接口(规范)Collection接口:存储一组不唯一,无序的对象List接口:存储一组不唯一,有序的对象Set接口:存储一组唯一,无序的对象Map接口:存储一组键值对象,提高键(key)到值(value)的映射(四)各种接口的实现类:List接口的2个常用实现类:ArrayList和LinkedListArrayList类:在它的底层代码中,实际是有一个Object型数组,通过一些方法实现数组的扩容,数组本身长度是在定义的时候就不能改变,JDK的源码底层就是通过新创建一个数组,长度比原来的长,把之前原数组的每个元素复制过来,然后把新数组的首地址赋值给了原数组的引用,就这样实现了可变长度数组;所以ArrayList的特点就是:遍历和随机访问的速度快,插入对象和删除对象的效率就低,因为底层的实现是通过数组来实现LinkedList类:底层通过结点来实现的,它有2个Node结点属性,一个根结点first,一个尾结点last。
添加的元素是保存在Node结点属性中item,看下面JDK源码,然后通过Node还有2个属性next和prev分别指向后一个保存元素的结点和指向前一个保存元素的结点;就这样形成一条逻辑上的一条链,它们在堆内存中内存是不连续的;所以LinkedList 类的特点:访问元素的效率不高,但是插入和删除元素的效率高,因为通过结点改变指向就可以实现了。
HashMap底层就是通过结点数组(数组+结点)来实现的,为什么put()方法存key和value 的时候,key不能重复,重复的话value会覆盖原先的value,key值在底层是通过它的hashCode 来保证唯一性同样的来讲解一下HashSet,给大家看看一个它的JDK源码,map是HashMap 类型,把数据存储到map的key中,所以说HashSet存储的元素是不能重复的* List 接口及其实现类:List接口及其实现类:特点:其元素以线性方式存储;元素可重复;元素有序;可以对元素的位置精确控制;实现类:ArrayListLinkedListVectorStackList接口常用的方法:booleanadd(E e): 向列表尾部添加指定的元素;voidadd(int index, E element): 在列表指定位置插入指定元素;booleanaddAll(Collection c): 添加指定的collection中的所有元素到此列表的结尾;booleanaddAll(int index,Collection c): 将指定的collection中的所有元素插入到列表中的指定位置;设置元素:Eset(int index, E element):用指定的元素替换列表中的指定位置的元素获取元素:Eget(int index): 返回列表中指定位置的元素;intindexOf(Object o): 返回此列表中第一次出现的指定元素的索引,否则返回-1;intlastIndexOf(Object o): 返回次列表中最后出现的指定元素的索引,否则返回-1;List<E>subList(int formIndex, int toIndex): 返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的子列表;移除元素:Eremove(int index):移除列表中指定位置的元素;booleanremove(Object o):从此列表中移除第一次出现的指定的元素(如果存在);voidclear():从列表中移除所有元素;相关判断方法:boolean contains(Objecto):如果列表包含指定的元素,则返回true;booleancontaionsAll(Coollection c):如果列表包含指定collection的所有元素,则返回true; booleanequals(Object o):比较指定的对象与列表是否相等;boolean isEmpty():如果列表不包含元素,则返回true;* Set 接口及其实现类:接口Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足(e2)==false.()的约定:a.在程序的一次执行中,无论何时在同一个java对象上重复调用hashcode(),都必须一致地返回同一个整数值,并不像()那样提供Object是否被修改了的信息,但这个整数值不必在同一个应用程序的多次运行之间保持一致.b.如果两个Object通过equals()判断是相等的,那么,在这两个Object上调用hashcode()必返回相同的值.c.如果两个Object通过equals()判断是不相等的,那么,并不要求这两个()返回不同的整数值. 实现HashSet是使用一个哈希表存储元素的,是非排序的,可以随机访问,是Set的最优性能实现.TreeSet实现了SortedSet接口,使用一个红黑树来存储元素,提供了元素的有序存储和访问. HashSetHashSet在底层实现上依赖于HashMap.TreeSetSet接口有一个子接口:SortedSet,提供了集合元素的顺序存储,其中元素保持升序排列.为了在加入一个元素到SortedSet实现时能对这些元素排序,元素类型必须实现Comarable接口,或者建立SortedSet时使用Comparator.否则程序在运行时将抛出ClassCastException.3.使用Set的注意事项如果Set中存储了可变对象,当这些对象出现重复元素,从而从根本上违反了Set的约定,Set 的行为也变得不确定.所以,在Set中存储可变对象时,一定要十分小心.同样,对于Map中的key 也一样,因为Map中的key也是不允许重复的.* 迭代遍历* Comparable 接口:1.什么是Comparable接口此接口强行对实现它的每个类的对象进行整体排序。
此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过(和)进行自动排序。
实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
强烈推荐(虽然不是必需的)使自然排序与equals 一致。
所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 ((Object)e2) == 0) 与((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与equals 一致。
2.实现什么方法int compareTo(T o)比较此对象与指定对象的顺序。
如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
强烈推荐(y)==0) == (y)) 这种做法,但不是严格要求这样做。
一般来说,任何实现Comparable 接口和违背此条件的类都应该清楚地指出这一事实。
推荐如此阐述:“注意:此类具有与equals 不一致的自然排序。
”参数:o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
与Comparator的区别Comparator位于包下,而Comparable位于包下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。
如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
* Map 接口及其实现类:Map 接口:Map是从键到值的映射,键不允许重复,每个键最多能映射一个值Entry接口及实现Map是键到值的映射,Java集合框架在实现上采用一个个来封装每一个键值对,这样,Map 中的元素就变成了的集了,这似乎预示着Map和Set有某种相通性.实际上,在HashSet实现中,HashSet的实现中,HashSet的元素存储在底层就是借助于HashMap来进行的(在部分情况下使用了LinkedHashMap).Map的实现在java 2集合框架中的Map接口有两个通用实现:HashMap和TreeMap. HashMap是采用哈希表实现,是Map接口的最好的全面实现.TreeMap实现了Map的子接口SortedMap,采用红黑树作为底层存储结构,提供了按照键排序的Map存储.和Hashtable的对比:HashMap Hashtable键和值是否允许空允许不允许是否多线程同步否是但是HashMap可以通过如下方式方便地得到HashMap的一个同步视图:Map synMap = (new HashMap(...));Hashtable已经经过再造,这是为了保持向后的兼容,保证老版本的程序能够继续正常允许;同时也方便Hashtable和新集合框架进行互操作(新的Hashtable实现了Map接口).正是因为Hashtable经过这些修改,反而使得它混合了新旧的很多特性,过于复杂,臃肿.新的Map接口采用了比原来Hashtable采用的Enumeration功能更加强大的Iterator遍历工具.Enumeration现在也不推荐使用, 不仅是因为Enumeration没有提供遍历键或值时安全删除Hashtable中的元素的途径;并且Enumeration的名称也不符合Sun的Java命名规范(采用Enumeration更加合适).而Hashtable为了兼容两者,在实现时,不得不提供同时实现了Enumeration和Iterator接口的Enumeration内部类.所以推荐大家用HashMap.TreeMapTreeMap中的Tree是一颗平衡二叉树,即每个内部节点都有一个前导节点或者说或者说父节点和两个子节点.存储后继节点的那个成员被命名为left和right. 二叉树在平衡时或者叶子节点到根结点的高度在一定的范围内时工作起来是最有效的.平衡一个二叉树的原因是为了缩短从根结点(这是在TreeMap类中惟一能够被直接引用的结点)至每个叶子节点的距离.距离越短,访问那个节点所需时间就会越少.平衡树的定义因实现而异.java2 集合框架中的树采用红黑树.红黑树是一种平衡树,这个平衡树的定义是没有一个叶子节点跟其他叶子节点的深度差超过两步.这个名字就是由于树的每个节点都被着上红色和黑色,节点所着的颜色被用来检测树的平衡性.在对节点插入和删除的操作中,可能会被旋转来保持树的平衡性.一般和最坏情况插入,删除,查找时间都是O(lgn).Map实现的选用在不需要有序存储时,可以采用高效的HashMap;如果需要有序存储,可以采用TreeMap,但是由于TreeMap是以红黑树进行存储的,需要比HashMap更多的空间和时间的开销.* 遍历Map:Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。