Java集合-Map八股文

1.Map

Map是Java集合相关的一个接口,主要是键值对的存储其元素需要重写hashCode()和equals()

Map的常用实现类有HashMap、HashTable、TreeMap

2.HashMap

HashMap和HashTable的元素无序、唯一,底层结构都是数组+链表

HashMap的key可以存入null,并且唯一;HashTable不允许key为null

HashMap线程不安全;HashTable是线程安全的

2.1.工作原理

  1. 首先通过hashCode()计算key的hash值,对数组长度取余得到存放数组的位置
  2. 遍历数组位置所在的链表,比较key是否相等,相等则替换value,返回原value
    • 比较hash值
    • 比较地址值
    • 调用equals()
  3. 判断是否需要扩容
  4. 在JDK1.7中采用头插法;在JDK1.8中采用尾插法,在链表的长度大于等于7时,如果数组长度 < 64,则进行扩容,否则进行树化

2.2.构造函数

JDK1.7

在JDK1.7中,使用无参构造时,默认数组长度为16,负载因子为0.75
然后调整数组长度为2的整数倍;确定数组扩容边界值:数组长度 * 负载因子

为什么数组长度必须是2的整数倍?

  1. 通过hash值对数组长度取余来确定数组位置时,使用了与运算&,效率比%更高;使用与运算的前提就是数组长度等于2的整数倍
    h & (length - 1) 等效于 h % length
  2. 减少哈希冲突

负载因子为什么是0.75

  1. 数组扩容边界值 = 数组长度 * 负载因子
  2. 如果设置为1:空间利用率高;但哈希碰撞的几率也变高,而链表的查询效率较低
  3. 如果设置为0.5:哈希碰撞的几率低,产生链表的几率低,查询效率高;但扩容频繁,空间利用率低
  4. 所以在 0.5 ~ 1 之间,取中间值:0.75

JDK1.8

在JDK1.8中,使用无参构造时,负载因子默认为0.75,其余属性都是默认值

2.3.扩容

在扩容时,扩容至原数组长度的2倍

3.TreeMap

TreeMap的元素唯一,升序排列;底层结构:红黑树

key必须实现比较器

  • 无参构造时,使用内部比较器:key实现Comparable接口;
  • 有参构造时,使用外部比较器:定义Comparator实现类

工作原理

  1. 第一次添加数据时,数据封装成新节点作为根节点root
  2. 第n次添加数据时,采用中序遍历,调用compare()比较key的大小,来选择合适的节点作为父节点;如果存在相等的key则替换并返回原value
  3. 为节点上色
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当准备Java应届生面试时,以下是一些常见的面试八股文题目及其答案: 1. Java的特点: Java是一种面向对象的编程语言,具有以下特点: - 简单性:Java语法相对简单易懂。 - 面向对象:Java支持封装、继承和多态等面向对象的特性。 - 平台无关性:Java程序可以在不同的操作系统上运行。 - 安全性:Java提供了安全机制,如内存管理和异常处理。 - 多线程:Java支持多线程编程,可以实现并发操作。 - 高性能:Java通过JIT编译器实现高效的执行。 2. Java的基本数据类型: Java的基本数据类型包括: - 整型:byte、short、int、long - 浮点型:float、double - 字符型:char - 布尔型:boolean 3. Java中的四种访问修饰符: Java中有四种访问修饰符,分别是: - public:可以被任何类访问。 - protected:可以被同一包内的类和子类访问。 - default(默认):可以被同一包内的类访问。 - private:只能被当前类访问。 4. Java中的多态性: 多态性是指同一个方法可以根据不同的对象产生不同的行为。在Java中,多态性通过继承和接口实现。具体实现方式包括: - 虚函数:父类中定义一个虚函数,子类可以重写该函数以实现不同的行为。 - 接口:定义一个接口,多个类实现该接口并实现接口中的方法。 5. Java中的异常处理机制: Java中的异常处理机制通过try-catch语句块来实现。可以捕获并处理异常,避免程序崩溃。常见的异常处理关键字包括: - try:包含可能抛出异常的代码块。 - catch:捕获并处理异常的代码块。 - finally:无论是否发生异常,都会执行的代码块。 6. Java中的线程和线程同步: Java中的线程通过Thread类来创建和管理。线程同步是为了避免多个线程同时访问共享资源而引发的问题。常见的线程同步机制包括: - synchronized关键字:用于修饰方法或代码块,保证同一时间只有一个线程可以访问。 - Lock接口:提供了更灵活的线程同步方式,可以实现更复杂的同步需求。 7. Java中的集合框架: Java中的集合框架提供了一组接口和类,用于存储和操作数据。常见的集合框架包括: - List:有序可重复的集合,如ArrayList、LinkedList。 - Set:无序不重复的集合,如HashSet、TreeSet。 - Map:键值对的集合,如HashMap、TreeMap。 8. Java中的IO操作: Java中的IO操作用于读写数据。常见的IO类包括: - InputStream/OutputStream:字节流,用于读写二进制数据。 - Reader/Writer:字符流,用于读写文本数据。 - BufferedReader/BufferedWriter:缓冲流,提高读写效率。 - FileInputStream/FileOutputStream:文件流,用于读写文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值