背景:

看的是《java核心技术 第8版》,覆盖jdk1.6。主要是对集合全局和细节进行全面掌握,较深入的理解集合。本人对java比较熟悉,但是对于细节的理解不深,知识点还不全,这是知识的查缺不漏。

一.集合接口

  1. 接口和实现分离

当程序中使用集合时,一旦构建了集合就不需要知道究竟使用的哪种实现,因此,只有构建集合对象时,使用具体的类才有意义。可以使用接口类型存放集合的引用。

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方法计算的。此类在实现对象遍历算法时(如对象序列化),非常有用。

三.集合框架

  1. 视图与包装器

哈希表类的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.简单算法

学习笔记-java 集合的更多相关文章

  1. Java学习笔记之---集合

    Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...

  2. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  3. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  4. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  5. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  6. 大数据学习笔记——Java篇之IO

    IO学习笔记整理 1. File类 1.1 File对象的三种创建方式: File对象是一个抽象的概念,只有被创建出来之后,文件或文件夹才会真正存在 注意:File对象想要创建成功,它的目录必须存在! ...

  7. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  8. 大数据学习笔记——Java篇之网络编程基础

    Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...

  9. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

随机推荐

  1. Bootstrap4 导航栏元素居右

    Bootstrap 4正解: .ml-auto元素居右 .mr-auto元素居左 在某度上查了半小时还是没查出什么名堂,搜出来的方法大多都是Bootstrap3的,实测pull-right或navba ...

  2. HihoCoder - 1142 三分法练手

    中文题面,原函数为三峰函数,先折半再三分 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+11; con ...

  3. SPOJ - DISUBSTR 求串中子串的个数

    \(height\)简单应用 #include<iostream> #include<cstdio> #include<cstring> #include<c ...

  4. 1148 Werewolf - Simple Version (20 分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  5. vm中centos7磁盘扩容

      在VM虚拟平台管理客户端,将虚拟机关机后,将分配的磁盘大小30G扩至300G.如图.   调整完后,重新打开虚拟机,使用fdisk -l查看,可以看到我们刚刚扩容的空间已经可以看到,但没有分区,还 ...

  6. HTML5本地存储和本地的数据库

    一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...

  7. apche 配置

    http://www.tootoogo.org/wordpress/?p=230 apache的配置由httpd.conf 文件配置. 1.基本配置 ServerRoot "/mnt/sof ...

  8. CentOS 6.2出现Disk sda contains BIOS RAID metadata解决方法

    今天在安装CentOS 6.2的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of a ...

  9. eclipse F6和F8的问题

    # 首先大致说明一下F6和F8的作用: | 在debug模式下, F6的作用是跳到下一步,F8的作用是跳到下一个断点 # 情景: | 在eclipse以debug模式同时启动两个项目,并且两个项目都打 ...

  10. 信号和槽:Qt中最差劲的创造

    不要被这个标题唬住了,实际上我是非常认可Qt的.在C++实现的开源产品中没有哪一个的API风格比得上Qt,拥有高度一致性,符合常识,符合直觉,几乎不用学就可以直接上手.或许是由于我们摆脱不了马太效应的 ...