JAVA集合

来源:互联网 发布:办公室网络维护 编辑:程序博客网 时间:2024/05/17 07:09

又把这个文章回顾了下,顺便做了简单的修改,现在看来真的是简单。

java集合的类:

1) Collection:存储一组的元素,通常这些元素都服从某种规则   1.1) List必须保持元素特定的顺序(有序,可重复)   1.2) Set不能有重复元素(无序("其实不一定无序"),不可重复)   1.3) Queue保持一个队列(先进先出)的顺序2) Map:一组成对的"键值对"对象

Collection和Map的区别在于容器中每个位置保存的元素个数:

1) Collection 每个位置只能保存一个元素(对象)2) Map保存的是"键值对",就像一个小型数据库。我们可以通过"键"找到该键对应的"值"

Java集合类架构层次关系

Iterable:迭代器接口,这是Collection类的父接口。实现这个Iterable接口的对象允许使用for each进行遍历,也就是说,所有的Collection集合对象都具有"for each可遍历性"。    这个Iterable接口只有一个方法:iterator()。它返回一个代表当前集合对象的泛型<T>迭代器,用于之后的遍历操作(只能单向移动)    1)使用Iterator()要求容器返回一个Iterator.Iterator将准备好返回序列的第一个元素    2)使用next()获得序列中的下一个元素    3)使用hasNext()检查序列中是否还有元素    4)使用remove()将迭代器新近返回的元素删除CollectionCollection是最基本的集合接口,一个Collection代表一组Object的集合,这些Object被称作Collection的元素。Collection是一个接口,用以提供规范定义,不能被实例化使用以下是collection的方法:"查看图①"1) List    List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引        2.1) ArrayList        ArrayList是基于数组实现的List类,它封装了一个动态的增长的(初始长度为10)、允许再分配的Object[]数组。        2.2) Vector        Vector和ArrayList在用法上几乎完全相同,但是线程安全的            2.2.1) Stack            Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出,书上都这样说,但我测试结果不是这样不清楚到底怎么会事)        2.3) LinkedList        实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列     使用。自然也可以被当作"栈来使用"2) Set(通过包装了一个所有value都为null的Map就实现了Set集合)"查看图②"   Set不保存重复元素。Set继承自Collection接口,不能包含有重复元素(记住,这是整个Set类层次的共有属性)。   Set判断两个对象相同不是使用"=="运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。   因为Set的这个制约,在使用Set集合的时候,应该注意两点:1、 为Set集合里的元素的实现类实现一个有效的equals(Object)方法、2、对Set的构造函数,传入的Collection参数不能包含重复的元素    1.1) HashSet(为了快速查找)    HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。    当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。(此处有一点需要注意"相等hashcode值的规定只是说如果两个对象相等,必须有相同的hashcode值,但是没有关于不相等对象的任何规定",即不同的对象可以有相同的hashcode值)       1.1.1) LinkedHashSet(有hash的查询速度,且内部使用链表维护元素顺序)       LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但和HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。    当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。       LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)    1.2) SortedSet        此接口主要用于排序操作,即实现此接口的子类都属于排序的子类("SortedSet的意思是'按对象的比较函数对元素进行排序',而不是指'元素插入的次序',插入顺序可以用LinkedHashSet来保存")         1.2.1) TreeSet(保持次序的set)         TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态(元素必需实现Comparable接口)    1.3) EnumSet        EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的,     它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序 3) Queue(并发编程中特别重要)    Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(使用offer()方法)到队列的尾部,   访问元素(poll())操作会返回队列头部的元素,队列不允许随机访问队列中的元素。结合生活中常见的排队就会很好理解这个概念        3.1) PriorityQueue(优先级队列)        PriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序,这点从它的类名也可以看出来MapMap用于保存具有"映射关系"的数据,因此Map集合里保存着两组值key和value。key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false.Map的这些实现类和子接口中key集的存储形式和Set集合完全相同(即key不能重复)Map的这些实现类和子接口中value集的存储形式和List非常类似(即value可以重复、根据索引来查找)"查看图③"    1) HashMap(取代了hashtable)    和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true、同时两个key的hashCode值也必须相等        1.1) LinkedHashMap        LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)    2) Hashtable    是一个古老的Map实现类,已被hashMap代替        2.1) Properties         Properties对象在处理属性文件时特别方便(windows平台上的.ini文件),Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入到属性文件中,也可以把属性文件中的"属性名-属性值"加载到Map对象中    3) SortedMap    正如Set接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类一样,Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类        3.1) TreeMap        TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。        TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态.同样,TreeMap也有两种排序方式: 自然排序、定制排序        ("注意与LinkedHashMap的区别,TreeMap是插入后排序返回有序的map;linkedHashMap是按插入顺序保存")。    4) WeakHashMap    WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的"强引用",这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。  但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对    5) IdentityHashMap    IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等

图①:thinking in java中的Collection的描述图①
图②:thinking in java中的Set的描述图②
图③:thinking in java中的Map的描述
图③

0 0
原创粉丝点击