一、集合

  • Java 中的集合类存放于 java.util 包中,是一个存放对象的容器。
  • 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中。
  • 存放的是对象,即引用数据类型,对于基本数据类型采用自动装箱存储。
  • 集合可以存放不同类型(一般情况下声明一个集合时会通过泛型进行约束),不限数量的数据类型。
  • Java 中的集合主要分为两种,单列集合:Collection,双列集合 Map。

二、Collection

2.1、Iterable && Collection

1. Iterable

Iterable 接口是 JDK1.5 后引入的,支持 foreach 循环遍历,和返回一个迭代器。

Iterator<T> iterator();

default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

2. Collection

  • Collection 接口是集合类的根接口,继承 Iterable 接口,Java 中没有提供这个接口的直接的实现类;
  • 但是却让其被继承产生了两个接口,就是 List 和 Set;
    • List:是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式;
    • Set:不能包含重复的元素;
  • 提供了常用操作集合类的 API。

2.2、List 接口及实现类

1. List 接口

特性:

  • 有序
  • 有索引
  • 可以存储重复值

List 常用方法

// 增加元素的方法:
// 在列表的指定位置插入指定元素(可选操作)
void add(int index, E element) ;
// 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)
boolean addAll (int index, Collection c); // 获取元素的方法:
// 返回列表中指定位置的元素
Object get(int index);
// 返回列表中指定的 fromIndex(包括) 和 toIndex(不包括)之间的部分视图
// 从 fromIndex 开始,到 toIndex 结束,但不包括 toIndex 处的元素;注意索引,不要超出了size;
List<E> subList(int fromIndex, int toIndex); // 查询元素的方法:
// 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
int indexOf(Object o);
// 返回此列表中最后出现的指定元素的索引;如果列表不包含次元素,则返回 -1
int lastIndexOf(Object o); // 删除元素的方法:
移除列表中指定位置的元素(可选操作);注意索引,不要超出size
E remove(int index); // 改变元素的方法:
// 用指定元素替换列表中指定位置的元素(可选操作)
E set(int index, E element);

2. ArrayList && Vector

  • 底层具体实现为数组,所以具有数组的一些特性:是一块连续的内存空间,支持按照下标随机访问,查找的时间复杂度低,增加和删除的时间复杂度较大。
  • ArrayList 是线程不安全的,效率高。
  • Vector 大部分方法被 synchronized 修饰,线程不安全,效率低。

3. LinkedList

  • 底层实现为双向链表,所以具有链表的一些特性:不是一块连续的内存空间,查询效率低要一个一个去遍历,增加和删除效率高。
  • 线程不安全。

2.3、 Set 接口及实现类

1. Set

特性:

  • 无序:对应的实现类中有的不能保证读取和存入顺序一致,有的可以保证,有的按照自然顺序排序。
  • 无索引,没有 get 方法。
  • 不能存取重复值
  • 底层为 Map,就是 Map 的 key。

2. HashSet

特性:

  • 底层对应 HashMap,即哈希表。
  • 完全的无序。
  • 可以存 null。
  • 整体效率快。
  • 线程不安全。

3.LinkedHashSet

特性:

  • 继承自 HashSet,底层结构是 LinkedHashMap,即 Hash表 + 链表。
  • 底层更复杂,所以效率比 HashSet 低。
  • 可以保证顺序。
  • 可以存 null。
  • 线程不安全。

4. TreeSet

特性:

  • 底层对应 TreeMap,即红黑二叉树。
  • 不能存 null。
  • 元素保证自然顺序,没有遵守 hashCode 和 equals 协定,根据 CompareTo 方法来判断。

三、Map

特性:

  • 存储的数据是成对存在的。
  • key 唯一,key 只能映射到一个 value 上,Set 包含的元素 就是 Map 里的 key。
  • 有的实现类的 key 可以为 null,但是只能有一个 null,有的实现类不允许 key 为 null。
  • 协定:hashcode && equals。

底层结构:

  • 初试大小为 16 个,0.75 时扩容,扩容要重新计算哈希值。
  • JDK1.8 之前:
    • hash算法为 数组 + 链表;
    • 先调用 hashCode 方法运算出数组的索引值,如果索引位无值则存储,有值就会发生哈希碰撞,此时用 equals 方法比较,如果 equals 方法相等就覆盖原有值,不相等以链表的形式存储并且后加的值放在链表头部(头插法)。
    • 弊端:哈希碰撞后,如果链表过长,则调用 equals 方法次数就会很多,效率低,所以要尽量减少哈希碰撞;并且链表过长查找也会低下,链表的查找时间复杂度是 Q(n)。
  • JDK1.8 之后
    • hash算法为 数组 + 链表 + 红黑树;当链表的长度超过一定范围(8),总大小超过64时链表变为红黑树。

Map 的常用的方法:

// 删除:
// 从此 map 对象中 移除所有映射关系
void clear();
// 如果存在一个键的映射关系(key -- value),则将其从此映射中移除
// 如果没有该 key,并不会移除映射关系,返回一个null
// 如果有该 key, 移除这个 key, 并把 value 返回
// 返回值是 null 的话,那么该 key 之前并不一定不存在,可能 key 之前对应的 value 是 null
V remove(Object key); // 查找:
boolean containsKey(Object key);
boolean containsValue(Object value); // 获取:
V get(Object key); // 判断:
boolean isEmpty(); // 添加:
V put(K key, V value);

Map 的遍历方式:

  • Set keySet(); 把本 map 里的所有 key 全部拿出来装入 Set 集合中,作为返回值返回;
  • Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的 Set 视图;

3.1、HashMap && HashTable

特性:

  • 底层: 哈希表实现。
  • key 完全无序。
  • HashMap 中 key 和 value 可以为 null,线程不安全,效率高。
  • HashTable 中 key 和 value 不可以为 null,线程安全,效率低。
  • 协定: hashcode && equals。

3.2、LinkedHashMap

  • 底层: 哈希表 + 链表;
  • 底层更加复杂,速度比父类慢。
  • key 保证了 插入时顺序。
  • key 和 value 可以为 null。
  • 协定: hashcode equals 方法查重。

3.3、TreeMap

  • 底层: 红黑二叉树。
  • key 不可以为 null。
  • value 可以为 null。
  • 保证了 按照 key 的 自然顺序进行存储。

五、Java - 集合的更多相关文章

  1. 【由浅入深理解java集合】(五)——集合 Map

    前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashMap,TreeMap.关于Map的一些通用介绍,可以参考第一篇文章.由于Map与Lis ...

  2. Java集合框架(Java总结五)

    ”https://www.runoob.com/java/” 集合接口区别 List 接口存储一组不唯一,有序(插入顺序)的对象,允许有相同的元素. Set 接口存储一组唯一,无序的对象,不保存重复的 ...

  3. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

  4. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  5. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  6. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

  7. Java集合源码分析(一)

    Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...

  8. Java集合框架使用总结

    Java集合框架使用总结 前言:本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看JavaAPI文档. 一.概述数据结 ...

  9. [转] java集合详解

    结合框架体系应该最重要的是如何灵活利用三种接口,set,map,list,他们如何遍历,各有什么特征,怎么样去处理,这是关键,在这个基础上再去掌握在什么场合用什么类型的接口.比如说list和set,s ...

  10. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

随机推荐

  1. js数组中返回具有某个属性具有特定值的对象

    const drDataArr = [{ date: 0, type: '心率', value: 82 },{ date: 1, type: '心率', value: 80 },{ date: 2, ...

  2. 小白,你要的Java抽象类,操碎了心!

    自从给小白写了两篇科普性质的文章后,我就有点一发不可收拾,觉得很有必要继续写下去.因为有读者留言"鼓励"我说,"二哥,你真的是为小白操碎了心啊!"我容易吗?我. ...

  3. Ubuntu开机黑屏解决办法

    联想笔记本通过虚拟机安装Ubuntu12.04后,开机黑屏.这个问题和NVIDIA显卡有关.网上有人提到更改/etc/default/grub文件,可是我通过root身份也无法很好地修改该文件,遂放弃 ...

  4. Java 常用API(一)

    目录 Java 常用API(一) 1. Scanner类 引用类型的一般使用步骤 Scanner的使用步骤 例题 2. 匿名对象 概述 匿名对象作为方法的参数 匿名对象作为方法的返回值 3. Rand ...

  5. SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  6. 自己动手写RPC

    接下来2个月 给自己定个目标 年前  自己动手做个RPC 框架 暂时技术选型  是 dotcore + netty + zookeeper/Consul

  7. 【Scala】isInstanceOf 与 classOf的对比,代码+注解简洁明了

    class Animal { } class Cat extends Animal { } object Cat { def main(args: Array[String]): Unit = { / ...

  8. 利用Asp.net和Sql Server实现留言板功能

    本教程设及到:使用SQL Server查询分析器创建数据库:SQL查询语句常用的一些属性值:触发器创建和使用:存储过程的创建,ASP使用存储过程. 正文: 一.创建数据库: 创建一个feedback数 ...

  9. [linux] VNC the connection was refused by the computer

    在用VNC 连接host的时候发现“”“the connection was refused by the computer ” 方法:发现登录这个host,敲打:verser 的时候出现了这个: 它 ...

  10. JavaWeb学习之JSP(二) JSP标签

    JSP常用标签 什么是JSP标签 JSP标签,有的地方也叫做JSP动作,在JSP中编写大量的java代码会使JSP页面显得杂乱无章,看起来非常不舒服,因此JSP提供了一些类似html的标签,通过这些标 ...