第10章 集合操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.3案例3: Set
Set 接口继承 Collection 接口,而且它不允许集合中存在重复项,所有原始方法 都是现成的,没有引入新方法,具体的 Set 实现类依赖添加的对象的 equals() 方 法来检查等同性。
实现了Set接口的常见集合有HashSet、LinkedHashSet和TreeSet。
10.5 小结
集合类型主要有3种:set(集)、list(列表) 和map(映射),其中set代表无序、不可重复 的集合;list代表有序、可重复的集合;map 代表具有映射关系的集合。
10.2.2案例2:LinkedList
LinkedList实现所有可选的列表操作,并允许所有的元素包括null。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾get、remove 和 insert 元素提供 了统一的命名方法,这些操作允许将链接列表用作堆栈、队列或双端队列。所有 操作都是按照双重链接列表的需要执行的,在列表中编索引的操作将从开头或结 尾遍历列表(从靠近指定索引的一端)。
10.4.1案例4:HashMap
HashMap是使用非常多的Collection,它是基于哈希表的Map接口的实现,以 key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理, 系统会根据hash算法来来计算key-value的存储位置,可以通过key快速地存、 取value。 Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为 “散列存储”),请看下图:横排表示数组,纵排表示数组元素(实际上是一 个链表结构)。
往hashmap中put元素: 1. 先根据key的hash值得到这个元素在数组中的位置(即下标),然后把这个元 素放到对应的位置中了。 2. 如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元 素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。 从hashmap中get元素: 1. 首先计算key的hashcode,找到数组中对应位置的某一元素; 2. 然后通过key的equals方法在对应位置的链表中找到需要的元素。 从这里可以想象得到,如果每个位置上的链表只有一个元素,那么hashmap的 get效率将是最高的。
第10章 集合操作
本章导读 在前面学习过java数组,java数组的长度是固定的,在同一个数组中只能存放 相同的类型数据,数组可以存放基本类型的数据,也可以存入对象引用的数 据。 在创建数组时,必须明确指定数组的长度,数组一旦创建,其长度就不能改 变,在许多应用的场合,一组数据的数目不是固定的,比如 一个单位的员工 数目是变化的,有老的员工跳槽,也有新的员工进来。 为了使程序方便地存储和操纵数目不固定的一组数据,JDK中提供了 java集 合类,所有java集合类都位于java.util包中,与java数组不同,java集合类不 能存放基本数据类型数据,而只能存放对象的引用。 本章要点 •List的主要特性和使用方法。 •Set的主要特性和使用方法。 •Map的主要特性和使用方法。
10.2.1案例1:ArrayList
ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的,实现了所 有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类 还提供一些方法来操作内部用来存储列表的数组的大小。 ArrayList提供了三个构造方法: 1. ArrayList():默认构造方法,提供初始容量为10的空列表。 2. ArrayList(int initialCapacity):构造一个具有指定初始容量的空列表。 3. ArrayList(Collection<? extends E> c):构造一个包含指定 collection 的元素 的列表,这些元素是按照该collection的迭代器返回它们的顺序排列的。
HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同 点。 第一:Hashtable是基于陈旧的Dictionary类的。在Java 1.2引入Map接口后, Hashtable也改进为可以实现 Map。HashMap是Map接口的一个实现,继承于较新 的AbstractMap类。 Hashmap可以算作是Hashtable的升级版本,整体上Hashmap 对Hashtable类优化了代码。 第二:在Hashmap中,null可以作为key,这样的key只有一个,可以有一个或多 个key所对应的value为null。而在 Hashtable中,null不可以作为key,也不可以作 为value。否则会抛出java.lang.NullPointerException。 第三:Hashtable的方法是同步的,而HashMap的方法不是。所以一般建议如果 是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在 Collections类中存在一个静态方法synchronizedMap(),该方法创建了一个线程安 全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的 synchronizedMap方法是可以同步访问潜在的HashMap。
TreeSet基于TreeMap生成一个总是处于排序状态的set,内部以TreeMap来实现。 它是使用元素的自然顺序对元素进行排序,或者根据创建Set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
10.4 Map
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的 映射。 在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个 value,所以它不能存在相同的key值,当然value值可以相同。
10.2 LiBiblioteka Baidut
List 是按对象的进入顺序进行保存对象,而不做排序或编辑操作。它除了拥有 Collection接口的所有的方法外还拥有一些其他的方法。具体如下: 1. void add(int index, Object element) 2. boolean addAll(int index, Collection collection) 3. Object get(int index) 4. int indexOf(Object element) 5. int lastIndexOf(Object element) 6. boolean remove(int index) 7. Object set(int index, Object element)
HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的,它内 部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序,特别是它不保 证该顺序恒久不变。 LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此 实现与HashSet的不同之处在于后者维护着一个运行于所有条目的双重链接列表, 此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
10.1 集合概述
Java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类 分为List(列表)、Set(集)和Map(映射)三种类型。
List(列表):List的主要特征使其元素已先行方式存储,集合中允许存放重复对 象。 Set(集):Set是最简单的一种集合,集合中的对象不按特定方式排序,并没有重 复对象。 Map(映射):Map是一种把键对象和值对象进行映射的集合。
10.4.2案例5:HashTable
HashTable采用“拉链法”实现哈希表,它定义了几个重要的参数:table、count、 threshold、loadFactor、modCount。 table:为一个Entry[]数组类型,Entry代表了“拉链”的节点,每一个Entry代表 了一个键值对,哈希表的“key-value”键值对”都是存储在Entry数组中的。 count:HashTable的大小,注意这个大小并不是HashTable的容器大小,而是他 所包含Entry键值对的数量。 threshold:Hashtable的阈值,用于判断是否需要调整Hashtable的容量。 threshold的值=“容量*加载因子”。 loadFactor:加载因子。 modCount:用来实现“fail-fast”机制的(也就是快速失败)。所谓快速失败就是 在并发集合中,其进行迭代操作时,若有其他线程对其进行结构性的修改,这时迭 代器会立马感知到,并且立即抛出ConcurrentModificationException异常。
LinkedList提供了两个构造方法: 1. LinkedList():构造一个空列表。里面没有任何元素,仅仅只是将header节 点的前一个元素、后一个元素都指向自身。 2. LinkedList(Collection<? extends E> c): 构造一个包含指定 collection 中 的元素的列表,这些元素按其collection的迭代器返回的顺序排列。该构造方法 首先会调用LinkedList(),构造一个空列表,然后调用了addAll()方法将 Collection中的所有元素添加到列表中。