1-Java基础篇-2

简介: 本文详解Java集合框架核心知识点:涵盖Map与Collection体系,常见实现类(HashMap、ArrayList等)及线程安全类(ConcurrentHashMap、Vector等);对比ArrayList与LinkedList差异;深入剖析HashMap原理(JDK1.8红黑树优化)及put全流程。

9. java常见的集合类有哪些

Map接口和Collection接口是所有集合框架的父接口:

  1. Collection接口的子接口包括:Set接口和List接口
  2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等
  3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
  4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

10. 常用的线程安全的类有哪些 ?

1. Vector:就比Arraylist多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使 用。
  2. hashTable:就比hashMap多了个synchronized (线程安全),不建议使用。
  3. ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现

11. ArrayList 和 LinkedList 的区别是什么?

  1. 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实 现。
  2. 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数 据存储方式,所以需要移动指针从前往后依次查找。
  3. 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
  4. 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储 了两个引用,一个指向前一个元素,一个指向后一个元素。
  5. 线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

12. 说一下HashMap的实现原理?

HashMap的数据结构: HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

HashMap 基于 Hash 算法实现的

  1. 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数 组中的下标
  2. 存储时,如果出现hash值相同的key,此时有两种情况。
  1. 如果key相同,则覆盖原始值;
  2. 如果key不同(出现冲突),则将当前的key-value放入链表中
  1. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

HashMap JDK1.8之前

JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。

HashMap JDK1.8之后

相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8) 时,将链表转化为红黑树,以减少搜索时间。扩容 resize( ) 时,红黑树拆分成的 树的结点数小于等于临界值6个,则退化成链表。

13. HashMap的put方法的具体流程?

  1. 判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
  2. 根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向 ⑥,如果table[i]不为空,转向③;
  3. 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的 是hashCode以及equals;
  4. 判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值 对,否则转向5;
  5. 遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操 作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
  6. 插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩 容。
目录
相关文章
|
6月前
|
存储 缓存 NoSQL
4-Redis篇-1
本文详解Redis在项目中的三大应用:热点缓存、业务数据存储(如验证码、排行榜)及分布式锁;涵盖5种基础数据类型、RDB/AOF双持久化机制、惰性+定期混合过期策略,以及8种内存淘汰策略。
288 19
|
6月前
|
存储 NoSQL 算法
4-Redis篇-2
本文详解Redis集群架构与核心机制:采用哨兵集群(1主2从+3哨兵)保障高可用;对比主从复制、哨兵、Cluster分片三大方案;解析主从同步的全量/增量复制流程;说明Cluster基于16384哈希槽的分片存储原理;简述MULTI/EXEC等事务命令及实际使用情况。(239字)
292 6
|
6月前
|
Java 应用服务中间件 Maven
5-微服务篇-1
本文详解SpringBoot核心机制:①自动装配原理——通过@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→spring.factories加载条件化配置类;②启动流程三阶段:初始化、上下文创建、自动配置;③常用起步依赖、配置文件类型(properties/YAML)及加载优先级;④四种运行方式。
387 23
|
6月前
|
缓存 NoSQL 关系型数据库
4-Redis篇-3
Redis与Memcached在数据结构、集群支持及持久化上差异显著;内存满时Redis可淘汰或报错;与MySQL一致性可通过删缓存+双写、MQ异步、过期策略等方案分级保障;缓存穿透用布隆过滤器,击穿靠预热、永不过期或加锁限流。(239字)
262 8
|
6月前
|
SQL 存储 关系型数据库
3-MySQL篇-3
本文详解MySQL索引核心概念:回表查询(先查索引再查主键)、覆盖索引(索引含所有查询字段,避免回表)、左前缀原则(联合索引最左匹配);并列举索引失效场景及建索引最佳实践。
237 0
|
4月前
|
存储 关系型数据库 MySQL
7-事务控制篇-4
InnoDB支持事务、行级锁、外键及聚簇索引,具备崩溃恢复能力,是MySQL 5.5+默认引擎;MyISAM不支持事务与行锁,仅表级锁,存行数、用非聚簇索引,适合读多写少场景。
228 5
|
4月前
|
存储 缓存 关系型数据库
7-事务控制篇-6
B树是自平衡多路搜索树,m阶B树中非叶节点关键字数=子节点数−1,所有叶子同层;B+树则仅内节点存索引、叶子存数据且链表相连,更优IO与范围查询;ACID通过undo/redo日志、锁机制等保障事务可靠。(239字)
197 3
|
4月前
|
SQL 关系型数据库 MySQL
7-事务控制篇-7
本文简述MySQL三大核心要点:联合索引的最左匹配原则(从左依次匹配,范围查询后失效)、SQL执行顺序(FROM→JOIN→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT),以及常见索引失效场景(如LIKE前导%、OR单边无索引、隐式类型转换、函数/运算操作等),并指出EXPLAIN是诊断索引是否生效的关键工具。(239字)
385 2
|
6月前
|
SQL 存储 缓存
3-MySQL篇-4
本文详解MySQL性能优化三大维度:设计上选合适引擎(InnoDB/MyISAM)、字段类型与范式;功能上优化索引、缓存、分库分表;架构上主从复制、读写分离。另涵盖超大分页优化、慢查询定位及EXPLAIN执行分析方法。(239字)
198 2
3-MySQL篇-4
|
6月前
|
缓存 NoSQL 调度
4-Redis篇-4
本文详解Redis三大核心问题:缓存雪崩(大量key同时失效,需加随机过期时间)、热点数据保障(采用LFU淘汰策略)、分布式锁实现(基于SETNX,解决死锁、超时、归一、可重入及阻塞等问题),并附实战应用案例。
260 12