集合类详解

来源:互联网 发布:手机视频拼接软件 编辑:程序博客网 时间:2024/06/05 07:25

一、为什么要提出集合类?
跟数组一样,集合也是用来存取数据的。但是,在数组已经存在的情况下,我们为什么还要提出集合这个概念呢?
首先,多数情况下,我们对要存储的数据的个数并不确定,所以我们需要一种能够自动改变存储容量大小的容器,这一点上,使用数组来存储的话,就显得十分的笨拙。
其次,当我们需要存储的数据中不包含重复的数据时,使用数组实现的很困难的。
最后,举一个查字典的例子,我们希望使用一个容器来存放单词以及对该单词的解释,,当我们想要查找某个单词的解释时,能够根据所提供的单词在容器中找到对应的单词解释,这如果使用数组来实现的话,就更加的困难了
因此,为了解决这些问题,Java设计了容器集合,不同的容器集合以不同的格式保存对象。
二、Collection和Map的继承体系
java容器类分为Collection和Map两大体系,Collection存储单个元素,Map则以键值对的形式存储元素,就像一个小型数据库,通过“键”找到对应的“值”。
Collection接口有两个子接口:Set(集)和List(列表),Set集合中的元素没有指定的顺序,不允许有重复元素,可以有空值。List集合中的元素有指定的顺序,允许重复元素,可以有空值。
三、Set(集)、List(列表)、Map(映射)的常用实现类
(一)Set
Set的常用实现类有HashSet和TreeSet:
HashSet:实现Set接口,由Hash表支持,不保证Set的迭代顺序
TreeSet:不仅实现了Set接口,还实现了SortedSet接口,因此,TreeSet类实现的Set集合在遍历时会按照自然顺序递增排序或者是按照指定比较器递增排序,因此,加入到TreeSet集合中的元素类必须要实现Comparable接口中的compareTo()方法。
LinkedHashSet:保持元素的添加顺序。
(二)List
List的常用实现类有ArrayList、LinkedList、Vector和Stack
ArrayList:实现了可变长度的数组,由于底层采用数组存储元素,所以适合查询元素,但不适合频繁的增删。
LinkedList:采用链表结构保存对象,所以适合对元素进行增删操作,但不适合查询。
Vector:Vector跟ArrayList很像。唯一的区别是Vector是同步的,在多线程环境下,应选择Vector以保证线程安全,单线程环境下,选择ArrayList提高效率。
Stack:继承Vector,实现了一个先进后出的栈,并提供了对栈进行操作的一些基本方法。
(三)Map
Map提供key到value的映射,key值不能重复,一个key只能映射到一个value,Map接口提供三种视图:key视图、value视图和key-value视图
Map常用实现类有HashMap和HashTable
HashTable:同步,key和value都不能为空,
HashMap:非同步,key和value都允许为空,
WeakHashMap:一种改进的HashMap,它对key进行弱引用,如果一个key不再被外部引用,那么该key可以被GC回收。
(四)在使用Set和Map时应小心的问题:equals()和hashCode()
Map的key其实就是一个HashSet,Set要求不可重复,那么怎么才算是Set中的值没有重复呢?这里的规则是两个对象要同时满足其Hash值不等和equals方法比较为false才算是两个对象不等(不重复),即:e1.hashCode() !=e2.hashCode() && !e1.equals(e2) 为true时 ,才能算是e1和e2不等,所以当Set中存放的是自定义类时,一定要同时重写hashCode方法和equals方法。(Map中的key也是一样)
equals比较相同的元素,hashCode一定相同,但equals比较不同的元素,hashCode却不一定不同,所以不同的对象却有可能有相同的hash码,这就是所谓的hash冲突。所以,将元素放入Set集合有如下流程图:
这里写图片描述

0 0