学习笔记-java 集合
背景:
看的是《java核心技术 第8版》,覆盖jdk1.6。主要是对集合全局和细节进行全面掌握,较深入的理解集合。本人对java比较熟悉,但是对于细节的理解不深,知识点还不全,这是知识的查缺不漏。
一.集合接口
- 接口和实现分离
当程序中使用集合时,一旦构建了集合就不需要知道究竟使用的哪种实现,因此,只有构建集合对象时,使用具体的类才有意义。可以使用接口类型存放集合的引用。
2. 集合接口和迭代接口
java迭代器应该认为是位于两个元素中间,当调用next时,迭代器就越过下一个元素。
Iterator接口的remove方法会删除上次调用next方法时返回的元素。重要的是,对next方法和remove方法的调用具有互相依赖性。
为了能够让实现者更容易得实现这个接口,java类库提供了一个类AbstractCollection。
二.具体的集合
1.链表 linkedlist
Linkedlist和Arraylist区别:从实现上,al采用的是数组,可以高效地随机访问;而ll采用的是内部了entry,这个类里有对象还有节点的前后指针,因此不能随机访问,只能从头遍历,但是插入,删除简单,不需要移动前后数据。
Linkedlist.add方法将对象添加到链表的尾部;而经常需要在链表的中间插入元素,而接口Iterator中没有add方法,集合类提供了子接口Listiterator,它里面提供了add方法,除此之外,还提供了方向遍历的方法:previous,hasPrevious方法。
2.数组列表 arraylist
如果使用动态数组,经验丰富的人,一般会选择vector,但是为什么会用arraylist替换vector呢?vector是线程同步的,arraylist线程不同步,但是如果单线程访问时,用arraylist性能开销比较小。
3.散列集
在java中,散列表的实现通过HashSet类。散列表是通过链表数组实现的,每个链表称为桶(bucket)。这里面桶的数量设置通常是元素个数的75%-150%;还有装填因子load factor,决定何时对散列表进行再散列,在散列时用双倍的桶数自动地进行再散列。
4.树集
特点-有序集。以任意顺序插入到集合,在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现。
采用的是红黑树(red-black-tree)。
在TreeSet中,元素是如何进行比较的?默认情况,树集假定插入的元素实现了Comparable接口,这个接口定义了compareTo方法。但是Comparable接口,尤其明显的局限性,局限性体现在:在给定的类中,只能实现一次接口;如果一个集合是按照a属性排序,在另一个集合按照b属性排序,该怎么办?另外,如果需要对一个类的对象进行排序,而这个类的创建者又没有实现Comparable接口,该如何办?
在java中对这种情况,提出了Comparator对象传递给TreeSet构造器来告诉树集使用不同的对比比较方法。
到底是否需要用树集取代散列集呢?这取决于所要收集的数据,对其排序要比散列函数要困难时,用树集比较合适。没有排序要求时,用散列集比较合适。
5.队列与双端队列
队列是在尾部插入元素,在头部删除元素;不支持在队列中间插入元素
双端队列,是同时在头部和尾部插入或删除元素。
java se6中引入了Deque接口,并由ArrayDeque和LinkedList类实现。
6.优先级队列 Priority queue
优先级队列可以按照任意的顺序插入,却总是按照排序的顺序进行检索。也就是说,无论何时调用remove方法,总会获得当前优化级队列中最小的元素。
使用优先级队列最典型的场景就是任务调度。
7.映射表
映射表(map),java类库中提供了2个通用实现:HashMap和TreeMap,这2个实现了Map接口。
是选择散列映射表还是树映射表?与之前的集一样,散列稍微快一些,如果不需要按照排序顺序访问键,那就最好选择散列。
映射表可以获得它的视图,这是实现了Collection接口的对象或是它的子接口的视图。这3个视图分别是键集,值集合,和键/值对集。
8.专用集与l映射表类
- WeakHashMap
- 链接散列集和链接映射表
用来记住插入元素项顺序,这样就可以避免在散列表中的项从表面上看是随机排列的。链接散列映射表LinkedHashMap将用访问顺序,而不是插入顺序,对映射表条目进行迭代。
- 枚举集与枚举映射表
- 标识哈希映射表IdentityHashMap,键的散列值是用System.identityHashCode方法计算的。此类在实现对象遍历算法时(如对象序列化),非常有用。
三.集合框架
- 视图与包装器
哈希表类的KeySet方法就是这样的一个视图示例。它返回一个实现了Set接口的类对象,这个类的方法对原映射表进行操作。这种集合叫做视图。Views
- 轻量级集包装器
Arrays.asList Collections.nCopies
- 子范围
- 不可修改视图
- 同步视图
- 被检验视图
2. 批操作
3.集合与数组之间的转化
Arrays.asList
四.算法
1.排序和混排
Collections.sort() Comparable和Comparator
降序排序:Collections.sort(items,Collections.reverseOrder())
2.二分查找法
Collections.binarySearch()
3.简单算法