Java SE-集合

Java 的集合体系

Java集合可分为两大体系:Collection 和 Map

1.常见的Java集合如下

Java SE-集合

Collection接口:单列数据,定义了存取一组对象的方法的集合

  • List:元素有序(指的是存取时,与存放顺序保持一致)、可重复的集合
  • Set:元素无序、不可重复的集合

Map接口:双列数据,保存具有映射关系”key-value对”的集合,根据元素的key访问value

2.集合中线程安全的集合和线程不安全的集合

线程安全的:

  • Hashtable:比HashMap多了个线程安全。
  • ConcurrentHashMap:是一种高效但是线程安全的集合。
  • Vector:比Arraylist多了个同步化机制。
  • Stack:栈,也是线程安全的,继承于Vector。

线性不安全的:

  • HashMap – 数组 + 链表 + 红黑树
  • Arraylist – 数组
  • LinkedList – 双向循环链表
  • HashSet – HashjMap
  • TreeSet – 二叉树
  • TreeMap – 红黑树

3. Arraylist与 LinkedList 异同点?

  • 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
  • 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
  • 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
  • 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index)方法)。
  • 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

4. ArrayList 与 Vector 区别?

  • Vector是线程安全的,ArrayList不是线程安全的。其中,Vector在关键性的方法前面都加了synchronized关键字,来保证线程的安全性。如果有多个线程会访问到集合,那最好是使用 Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
  • ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍,这样ArrayList就有利于节约内存空间。

5. Collection子接口:Set 接口

  • Set接口描述
  • Set接口是 Collection的子接口,set接口没有提供额外的方法。
  • Set 集合存取元素同样是无序的。
  • Set 集合 不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。
  • Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法。
  • Set 实现类之一:HashSet
  • HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。 HashSet的底层其实就是HashMap,只不过我们HashSet是实现了Set接口并且把数据作为K值,而V值一直使用一个相同的虚值来保存。
  • HashSet 按 Hash 算法来存储集合中的元素,因此 具有很好的存取、查找、删除性能
  • HashSet 具有以下特点:不能保证元素的排列顺序、HashSet 不是线程安全的、集合元素可以是 null
  • HashSet 集合判断两个元素相等的标准: 两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等
  • 对于存放在Set容器中的对象,对应的类一定要重写 equals()hashCode(Object obj)方法,以实现对象相等规则。即:”相等的对象必须具有相等的散列码”。

  • Set实现类之二:LinkedHashSet

  • LinkedHashSet 是 HashSet 的子类
  • LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用 双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
  • LinkedHashSet 插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
  • LinkedHashSet 不允许集合 元素重复
  • Set实现类之三:TreeSet
  • TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
  • TreeSet底层使用红黑树结构存储数据
  • TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。

6. Map接口

  • Map接口概述
  • Map与Collection并列存在。用于保存具有 映射关系的数据:key-value
  • Map 中的 key 和 value 都可以是任何引用类型的数据
  • Map 中的 keySet方法来存放, 不允许重复,即同一个 Map 对象所对应的类,须重写 hashCode()和equals() 方法
  • 常用String类作为Map的”键”
  • key值唯一,但可以为null
  • keyvalue之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value
  • Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。其中, *HashMap是 Map 接口使用频率最高的实现类

7. Map实现类之一:HashMap

  • HashMap是 Map 接口使用频率最高的实现类。
  • 允许使用null键和null值,与HashSet一样,不保证映射的顺序。
  • 所有的key构成的集合是Set:无序的、不可重复的。所以, key所在的类要重写:equals()和hashCode()
  • 所有的value构成的集合是Collection: 无序的、可以重复的。所以,value所在的类要重写:equals()
  • 一个key-value构成一个entry
  • 所有的entry构成的集合是无序的、不可重复的
  • HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。
  • HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
  • 扩容负载因子是 0.75,扩容倍数: *2

8. HashMap 的 底层数据结构是什么?

在JDK1.7 和JDK1.8 中有所差别:

在JDK1.7 中,由”数组+链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。

在JDK1.8 中,由”数组+链表+红黑树”组成。当链表过长,则会严重影响 HashMap 的性能,红黑树搜索时间复杂度是 O(logn),而链表是糟糕的 O(n)。因此,JDK1.8 对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:

  • 当链表超过 8 且数据总量超过 64 才会转红黑树。
  • 将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。

Java SE-集合

9. 解决hash冲突的办法有哪些?HashMap用的哪种?

解决Hash冲突方法有:开放定址法、再哈希法、链地址法(拉链法)、建立公共溢出区。HashMap中采用的是 链地址法 。

  • 开放定址法也称为 再散列法,基本思想就是,如果 p=H(key)出现冲突时,则以 p为基础,再次hash, p1=H(p),如果p1再次出现冲突,则以p1为基础,以此类推,直到找到一个不冲突的哈希地址 pi。 因此开放定址法所需要的hash表的长度要大于等于所需要存放的元素,而且因为存在再次hash,所以 只能在删除的节点上做标记,而不能真正删除节点。
  • 再哈希法(双重散列,多重散列),提供多个不同的hash函数,当 R1=H1(key1)发生冲突时,再计算 R2=H2(key1),直到没有冲突为止。 这样做虽然不易产生堆集,但增加了计算的时间。
  • 链地址法(拉链法),将哈希值相同的元素构成一个同义词的单链表,并将单链表的头指针存放在哈希表的第i个单元中,查找、插入和删除主要在同义词链表中进行。链表法适用于经常进行插入和删除的情况。
  • 建立公共溢出区,将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出数据统一放到溢出区。

Collections工具类

  • Collections 是一个操作 Set、List 和 Map 等集合的工具类
  • Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,
    还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
  • 排序操作:(均为static方法)
  • reverse(List):反转 List 中元素的顺序
  • shuffle(List):对 List 集合元素进行随机排序
  • sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
  • sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
  • swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
  • Collections常用方法(查找、替换)
  • Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
  • Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
  • Object min(Collection)
  • Object min(Collection,Comparator)
  • int frequency(Collection,Object):返回指定集合中指定元素的出现次数
  • void copy(List dest,List src):将src中的内容复制到dest中 boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List 对象的所有旧值

Original: https://www.cnblogs.com/dev-yuxi/p/16550258.html
Author: 岁月如流的笔记
Title: Java SE-集合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594718/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 10、线程强制执行jion

    10、线程强制执行jion java;gutter:true; package com.testthread1;</p> <p>public class T…

    Java 2023年6月8日
    083
  • 几种impala-shell输出模拟结果及方法

    一、impala-shell外部命令所谓的外部命令指的是不需要进入到impala-shell交互命令行当中即可执行的命令参数。impala-shell后面执行的时候可以带很多参数。…

    Java 2023年6月9日
    089
  • 拜托,面试官别问我「位图」了

    这是之前面试的时候面试官问到过的一个问题,今天正好看到 布隆过滤器,写篇文章总结一下 我们先看一下流程,流程懂了,问题就解决 90%了 我们都知道一个 int 占 4字节,一个字节…

    Java 2023年6月9日
    095
  • 02-MyBatisPlus入门

    1、创建数据库:mybatis_plus 2、创建 User 表其表结构如下: id name age email 1 Jone 18 test1@baomidou.com 2 J…

    Java 2023年6月15日
    079
  • 通俗易懂讲反射

    可进入本人语雀文档看,格式更清晰明了哦 https://www.yuque.com/docs/share/3c013ec6-6c35-4854-aaf6-ff9a6e8a6af2?…

    Java 2023年6月8日
    0103
  • 正规文法与正规式

    3型文法也叫作正规文法,它对应于有限状态自动机,它是在2型文法的基础上满足:A->a|aB(右线性)或A->a|Ba(左线性)。如果有A->a,A->aB,…

    Java 2023年6月7日
    0122
  • mysql 读取配置的优先级

    mysql所在linux服务器执行/usr/bin/mysql –verbose –help | grep -A 1 ‘Default opti…

    Java 2023年6月5日
    080
  • 最长上升子序列

    给定一个长度为 (N) 的数列(A),求数值严格单调递增的子序列的长度最长是多少。 第一行包含整数 (N)。 第二行包含 (N) 个整数,表示完整序列。 输出一个整数,表示最大长度…

    Java 2023年6月7日
    078
  • ReentrantLock的原理解析

    重入锁(ReentrantLock)是一种可重入无阻塞的同步机制。性能同synchronized接近(老版本jdk中性能很差)。 下面重点看下常用的lock()和unlock()方…

    Java 2023年6月6日
    084
  • Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行。 ; 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全…

    Java 2023年6月13日
    061
  • 原云生实战

    注:1.此文档来自尚硅谷-雷丰阳老师–原云生实战笔记. 初始连接:https://www.yuque.com/leifengyang/oncloud/vfvmcd 1、…

    Java 2023年6月16日
    086
  • 数据库——MySQL

    数据库MySQL 1、 主键:一个实体集中只有一个主键,用于唯一标识,不能重复,不允许为空 2、 外键:一个关系中的一个属性是另外一个关系中的主键,就是外键,用来和其它表建立联系,…

    Java 2023年6月5日
    096
  • 设计模式之策略模式

    策略模式属于行为型模式,是使用最多的设计模式之一;其作用是针对一组算法,将每一个算法封装到具体共同接口的独立的类种,从而使得他们可以相互转化。策略模式使得算法可以在不影响到客户端得…

    Java 2023年6月5日
    090
  • 如何在servlet取得spring beans (autowired)(转)

    在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet…

    Java 2023年5月30日
    077
  • Quartz与Spring Boot集成使用

    上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波。 版本说明 通过搜索引擎很容易找到其…

    Java 2023年5月30日
    091
  • 修改 win10 右键“新建”菜单 添加.md文件

    1.1 修改 win10 右键”新建”菜单 看了很多方法终于解决了,因此自己记录总结的方法以便于大家参考。 操作 运行注册表编辑器(regedit.exe)…

    Java 2023年6月14日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球