手写简易 HashMap

这是我去年碰到的一道面试题,当时直接整懵逼了。源码大致看过,原理也知道,突然要写还真写不出来。于是这两天又把这个问题翻出来,尝试写了一版。 1 明确需求 实现一个简易的 HashMap,包含 hashmap 的核心功能(put、get) 实现拉链法即可,不必实现红黑树 最好实现扩容逻辑 不支持 key 为 null 的情况(要支持也可以,需要单独处理,比较简单) 为了让需求更加明确,写了单元测试:

Java 中的小顶堆和大顶堆

这是一个非常简单的知识点,却也值得一记。 在 Java 中,是用 PriorityQueue 来实现堆的。 小顶堆和大顶堆的代码如下: // 小顶堆 new PriorityQueue<>(); // 大顶堆 new PriorityQueue<>(Comparator.reverseOrder());  

一文总结常见基础排序算法

(本文属于排序算法总结,并非零基础讲解。更多内容可以参考:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html) 0 前言 个人总结的常见基础排序算法,罗列如下: 简单排序,时间复杂度 O(N2):冒泡排序、选择排序、插入排序 高级排序,时间复杂度 O(NlogN):归并排序(自顶向下、自底向上)、快速排序(含3路快排)、堆排序 像希尔

慢 SQL 定位与优化

0 基本思路 基本思路如下: 根据慢日志定位慢查询 sql 使用 explain 等工具分析 sql 修改 sql,尽量让 sql 走索引 下面依次展开。 1 根据慢日志定位慢查询 sql 先来认识一下 mysql 中的几个变量: long_query_time:定义了查询时间超过多少秒,即认为属于慢 sql slow_query_log:一个开关,控制是否记录慢日志 slow_query_log

深入理解 B+ 树

1 什么是 B+ 树?有什么用? 1.1 数据结构 B+ 树是一种数据结构,是大多数 MySQL 存储引擎的默认索引类型,用于提高查询效率。 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。

实战首选缓存策略,保证 Redis 和 MySQL 的一致性

(这里说的“首选”,是一般而言。根据具体情况,可能有更合适的方案。) 1 关于缓存的共识 想使用缓存,首先要达成以下共识: 缓存必须要有过期时间; 保证数据库跟缓存的最终一致性即可,不必追求强一致性。 尤其是第二点,这是一个 TradeOff。如果非得要求强一致性,就不要用缓存。 本文讨论的策略,只是保证最终一致性。 2 实战首选:旁路缓存策略(Cache-Aside) 进入正题。我在实际工作中,

docker 运行 phpMyAdmin

phpMyAdmin 有官方镜像,用起来很方便。 在 8090 端口启动,命令如下: docker run -d --name phpmyadmin -e PMA_ARBITRARY=1 -p 8090:80 phpmyadmin 这里设置了环境变量 PMA_ARBITRARY=1,可以在登陆框中输入 MySQL 服务器地址(否则不会显示这个输入框)。 上面那条命令运行之后,phpmyadmin

IntelliJ IDEA 社区版从零创建 Java Web(JSP) 项目

现在都是直接用 SpringBoot。不过偶尔还是会遇到一些使用 JSP 的情况,例如维护老项目,或者学生的学习项目。 本文记录了,在不依赖 SpringBoot,Maven 等工具的情况下,使用 IDEA 社区版,创建一个 Web 项目的过程。 0 前置条件 已下载 tomcat IDEA 社区版已安装 Smart Tomcat 插件 都很简单,略过不表。 1 创建一个空的 Java 项目 2

命令行批量修改文件编码为 UTF-8

有一个源码项目,之前是在 Windows 上创建的。拿到 Mac 上用 IDE 打开,中文出现了乱码。我一看,文件编码都是 cp932(也就是 GBK)。 因此,需要把这些文件转码为 UTF-8。 命令如下: find . -type f -exec sh -c "iconv -f GBK -t UTF-8 {} > ~/temp" \; -exec mv ~/temp {} \; &nbs