摘要: 1. 概述 HashSet ,基于 HashMap 的 Set 实现类。在业务中,如果我们有排重的需求,一般会考虑使用 HashSet 。 在 Redis 提供的 Set 数据结构,不考虑编码的情况下,它是基于 Redis 自身的 Hash 数据结构实现的。这点,JDK 和 Redis 是相同的。 阅读全文
posted @ 2021-03-05 18:23 小萝卜鸭 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 众所周知,HashMap 提供的访问,是无序的。而在一些业务场景下,我们希望能够提供有序访问的 HashMap 。那么此时,我们就有两种选择: TreeMap :按照 key 的顺序。 LinkedHashMap :按照 key 的插入和访问的顺序。 LinkedHashMap ,在 H 阅读全文
posted @ 2021-03-04 23:03 小萝卜鸭 阅读(104) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 HashMap ,是一种散列表,用于存储 key-value 键值对的数据结构,一般翻译为“哈希表”,提供平均时间复杂度为 O(1) 的、基于 key 级别的 get/put 等操作。 “在前些年,实习或初级工程师的面试,可能最爱问的就是 ArrayList 和 LinkedList 的 阅读全文
posted @ 2021-03-03 18:59 小萝卜鸭 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 考虑到 LinkedList 和 ArrayList 是 List 绝代双骄,所以本文在编写的时候,尽量保持标题一致,方便对比。 相比来说,LinkedList 会简单蛮多。看完本文后,胖友可以试着做下 设计链表 题目。 1. 概述 LinkedList ,基于节点实现的双向链表的 List ,每个 阅读全文
posted @ 2021-03-02 17:29 小萝卜鸭 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 ArrayList ,基于 [] 数组实现的,支持自动扩容的动态数组。相比数组来说,因为其支持自动扩容的特性,成为我们日常开发中,最常用的集合类,没有之一。 在前些年,实习或初级工程师的面试,可能最爱问的就是 ArrayList 和 LinkedList 的区别与使用场景。不过貌似,现在 阅读全文
posted @ 2021-03-01 20:14 小萝卜鸭 阅读(128) 评论(0) 推荐(0) 编辑
摘要: Java常见的垃圾收集器有哪些? 典型回答 实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM、Oracle),不同版本的 JVM,提供的选择也不同。接下来,我来谈谈最主流的 Oracle JDK。 Serial GC,它是最古老的垃圾收 阅读全文
posted @ 2021-01-19 16:03 小萝卜鸭 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 请介绍类加载过程,什么是双亲委派模型? 典型回答 一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java 虚拟机规范里有非常详细的定义。 首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的 阅读全文
posted @ 2021-01-18 10:38 小萝卜鸭 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别? 典型回答 有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,类似 ConcurrentLinkedQueue 这种“Concurrent”容器,才是真正代表并发。 关于问题中它们 阅读全文
posted @ 2021-01-17 17:54 小萝卜鸭 阅读(223) 评论(0) 推荐(0) 编辑
摘要: synchronized和ReentrantLock有什么区别呢? 典型回答 synchronized 是 Java 内建的同步机制,所以也有人称其为 Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。 在 Java 阅读全文
posted @ 2021-01-16 17:56 小萝卜鸭 阅读(494) 评论(0) 推荐(0) 编辑
摘要: Java提供了哪些IO方式? NIO如何实现多路复用? 典型回答 Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。 首先,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的 阅读全文
posted @ 2021-01-14 10:12 小萝卜鸭 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 动态代理是基于什么原理? 典型回答 反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。 动态代理是一种方便运 阅读全文
posted @ 2021-01-13 16:11 小萝卜鸭 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。 图中阴影部分为所能勾勒出的最大矩形面积,其面积为 1 阅读全文
posted @ 2020-06-29 08:48 小萝卜鸭 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。 有些房 阅读全文
posted @ 2020-06-27 10:43 小萝卜鸭 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。 人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一 阅读全文
posted @ 2020-06-04 13:01 小萝卜鸭 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 双指针 用替换法in-place来做,需要用两个指 阅读全文
posted @ 2020-06-02 13:10 小萝卜鸭 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 n 阅读全文
posted @ 2020-06-01 14:00 小萝卜鸭 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 删除排序数组中的重复项 给定一个排序数组,你需要在** 原地** 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回 阅读全文
posted @ 2020-05-29 21:53 小萝卜鸭 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 广度优先搜索 阅读全文
posted @ 2020-05-28 13:08 小萝卜鸭 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "()" 输出: true 示例 2: 输入: " 阅读全文
posted @ 2020-05-27 11:25 小萝卜鸭 阅读(499) 评论(0) 推荐(0) 编辑
摘要: 基本计算器 实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。 示例 1: 输入: "1 + 1" 输出: 2 示例 2: 输入: " 2-1 + 2 " 输出: 3 示例 3: 输入: "(1+(4+5+2 阅读全文
posted @ 2020-05-26 11:49 小萝卜鸭 阅读(273) 评论(0) 推荐(0) 编辑
摘要: [toc] "滑动窗口最大值" 给定一个数组 ,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 示例: 提示: `1 = k 1,说明窗口大小正好 阅读全文
posted @ 2020-05-24 21:29 小萝卜鸭 阅读(314) 评论(0) 推荐(0) 编辑
摘要: [toc] 谈谈你对Java平台的理解? 典型回答 Java 本身是一种面向对象的语言,最显著的特性有两个方面, 一是所谓的“ 书写一次,到处运行 ”(Write once, run anywhere),能够非常容易地获得跨平台能力; 另外就是 垃圾收集 (GC, Garbage Collectio 阅读全文
posted @ 2020-05-23 10:20 小萝卜鸭 阅读(314) 评论(0) 推荐(0) 编辑
摘要: [toc] "用队列实现栈" 使用队列实现栈的下列操作: push(x) 元素 x 入栈 pop() 移除栈顶元素 top() 获取栈顶元素 empty() 返回栈是否为空 注意: 你只能使用队列的基本操作 也就是 , , , 和 这些操作是合法的。 你所使用的语言也许不支持队列。 你可以使用 li 阅读全文
posted @ 2020-05-21 21:15 小萝卜鸭 阅读(449) 评论(0) 推荐(0) 编辑
摘要: [toc] 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下, 能够偷窃 阅读全文
posted @ 2020-05-20 21:27 小萝卜鸭 阅读(223) 评论(0) 推荐(0) 编辑
摘要: [toc] 0 1 背包问题 给你一个可装载重量为 的背包和 个物品,每个物品有重量和价值两个属性。其中第 个物品的重量为 ,价值为 ,现在让你用这个背包装物品,最多能装的价值是多少? 举个简单的例子,输入如下: 算法返回 6,选择前两件物品装进背包,总重量 3 小于 ,可以获得最大价值 6。 递归 阅读全文
posted @ 2020-05-19 21:33 小萝卜鸭 阅读(304) 评论(0) 推荐(0) 编辑
摘要: [toc] 数据中心 数据中心是一个大杂烩,几乎要用到前面学过的所有知识。 前面讲办公室网络的时候,我们知道办公室里面有很多台电脑。如果要访问外网,需要经过一个叫 网关 的东西,而网关往往是一个路由器。 数据中心里面也有一大堆的电脑,但是它和咱们办公室里面的笔记本或者台式机不一样。数据中心里面是服务 阅读全文
posted @ 2020-05-18 21:07 小萝卜鸭 阅读(1762) 评论(0) 推荐(0) 编辑
摘要: [toc] DNS DNS服务器 在网络世界,也是这样的。你肯定记得住网站的名称,但是很难记住网站的IP地址,因而也需要一个地址簿,就是 DNS服务器 。 由此可见,DNS在日常生活中多么重要。每个人上网,都需要访问它,但是同时,这对它来讲也是非常大的挑战。一旦它出了故障,整个互联网都将瘫痪。另外, 阅读全文
posted @ 2020-05-17 21:37 小萝卜鸭 阅读(602) 评论(0) 推荐(0) 编辑
摘要: [toc] URI URI, 统一资源标识符 ( U niform R esource I dentifier)。因为它经常出现在浏览器的地址栏里,所以俗称为“网络地址”,简称“网址”。 严格地说,URI 不完全等同于网址,它包含有 URL 和 URN 两个部分,在 HTTP 世界里用的网址实际上是 阅读全文
posted @ 2020-05-16 21:37 小萝卜鸭 阅读(406) 评论(0) 推荐(0) 编辑
摘要: [toc] HTTP传输过程 HTTP 协议是运行在 TCP/IP 基础上的,依靠 TCP/IP 协议来实现数据的可靠传输。所以浏览器要用 HTTP 协议收发数据,首先要做的就是建立 TCP 连接。 经过 SYN、SYN/ACK、ACK 的三个包之后,浏览器与服务器的 TCP 连接就建立起来了。 浏 阅读全文
posted @ 2020-05-15 19:28 小萝卜鸭 阅读(589) 评论(0) 推荐(0) 编辑
摘要: [toc] UDP协议 TCP和UDP有哪些区别? 一般面试的时候我问这两个协议的区别,大部分人会回答,TCP是面向连接的,UDP是面向无连接的。 什么叫面向连接,什么叫无连接呢?在互通之前,面向连接的协议会先建立连接。例如,TCP会三次握手,而UDP不会。为什么要建立连接呢?你TCP三次握手,我U 阅读全文
posted @ 2020-05-14 21:17 小萝卜鸭 阅读(563) 评论(0) 推荐(0) 编辑
摘要: [toc] 从物理层到MAC层 第一层(物理层) 电脑连电脑要配置这两台电脑的IP地址、子网掩码和默认网关。要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是192.168.0.1/24,另一个是192.168.0.2/24,否则是不通的。 两台电脑之间的网络包,包含MAC层吗? 当然包含 阅读全文
posted @ 2020-05-13 20:16 小萝卜鸭 阅读(1709) 评论(0) 推荐(0) 编辑
摘要: [toc] ifconfig 查看IP地址,在Windows上是 ,在Linux上是 。Linux上还有ip addr可以查看IP地址 想象一下,你登录进入一个被裁剪过的非常小的Linux系统中,发现既没有ifconfig命令,也没有ip addr命令,你是不是感觉这个系统压根儿没法用?这个时候,你 阅读全文
posted @ 2020-05-12 17:21 小萝卜鸭 阅读(2988) 评论(0) 推荐(0) 编辑
摘要: [toc] 网络为什么要分层? 这里我们先探讨第一个问题,网络为什么要分层?因为,是个复杂的程序都要分层。 理解计算机网络中的概念,一个很好的角度是,想象网络包就是一段Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在 阅读全文
posted @ 2020-05-11 17:16 小萝卜鸭 阅读(1453) 评论(2) 推荐(6) 编辑
摘要: [toc] 单例模式 为什么要使用单例? 单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 对于单例的概念,没必要解释太多,你一看就能明白。我们重点看一下,为 阅读全文
posted @ 2020-05-10 10:48 小萝卜鸭 阅读(663) 评论(0) 推荐(0) 编辑
摘要: [toc] 总线 降低复杂性:总线的设计思路来源 计算机里其实有很多不同的硬件设备,除了 CPU 和内存之外,我们还有大量的输入输出设备。可以说,你计算机上的每一个接口,键盘、鼠标、显示器、硬盘,乃至通过 USB 接口连接的各种外部设备,都对应了一个设备或者模块。 如果各个设备间的通信,都是互相之间 阅读全文
posted @ 2020-05-08 18:27 小萝卜鸭 阅读(3895) 评论(0) 推荐(2) 编辑
摘要: [toc] 存储器层次结构全景 理解存储器的层次结构 在有计算机之前,我们通常把信息和数据存储在书、文件这样的物理介质里面。有了计算机之后,我们通常把数据存储在计算机的存储器里面。而存储器系统是一个通过各种不同的方法和设备,一层一层组合起来的系统。下面,我们把计算机的存储器层次结构和我们日常生活里处 阅读全文
posted @ 2020-05-07 14:32 小萝卜鸭 阅读(1558) 评论(0) 推荐(1) 编辑
摘要: [TOC] CISC和RISC CPU 的指令集里的机器码是固定长度还是可变长度,也就是 复杂指令集 (Complex Instruction Set Computing,简称 CISC)和 精简指令集 (Reduced Instruction Set Computing,简称 RISC)这两种风格 阅读全文
posted @ 2020-05-06 14:27 小萝卜鸭 阅读(1277) 评论(1) 推荐(0) 编辑
摘要: [TOC] 冒险和预测 流水线设计需要解决的三大冒险,分别是 结构冒险 (Structural Hazard)、 数据冒险 (Data Hazard)以及 控制冒险 (Control Hazard)。 在 CPU 的流水线设计里,固然我们会遇到各种“危险”情况,使得流水线里的下一条指令不能正常运行。 阅读全文
posted @ 2020-05-05 15:15 小萝卜鸭 阅读(3464) 评论(1) 推荐(2) 编辑
摘要: [toc] 建立数据通路 指令周期(Instruction Cycle) 前面讲计算机机器码的时候,向你介绍过 PC 寄存器、指令寄存器,还介绍过 MIPS 体系结构的计算机所用到的 R、I、J 类指令。如果我们仔细看一看,可以发现,计算机每执行一条指令的过程,可以分解成这样几个步骤。 1. Fet 阅读全文
posted @ 2020-05-04 18:48 小萝卜鸭 阅读(1611) 评论(1) 推荐(1) 编辑
摘要: 之前我们讲了如何对一个性能计数器框架进行分析、设计与实现,并且实践了之前学过的一些设计原则和设计思想。当时我们提到,小步快跑、逐步迭代是一种非常实用的开发模式。所以,针对这个框架的开发,我们分多个版本来逐步完善。 我们实现了框架的第一个版本,它只包含最基本的一些功能,在设计与实现上还有很多不足。所以 阅读全文
posted @ 2020-05-03 18:35 小萝卜鸭 阅读(345) 评论(0) 推荐(0) 编辑