JVM核心知识点八股文
JVM 核心知识点八股文(高频面试版)本文整理 JVM 面试中最常考察的核心知识点,覆盖内存结构、垃圾回收、类加载、性能调优等高频考点,适合面试复习和知识点梳理。 一、JVM 内存结构(运行时数据区)JDK 8 及以上版本的内存结构移除了永久代(PermGen),替换为元空间(Metaspace),核心分为以下区域: 1. 线程私有区域 程序计数器:记录当前线程执行的字节码行号,唯一不会抛出 OOM 的区域; 虚拟机栈:存储方法调用的栈帧(局部变量表、操作数栈、动态链接、方法出口),栈深度溢出抛 StackOverflowError,内存不足抛 OOM; 本地方法栈:为 Native 方法服务,与虚拟机栈逻辑一致,同样会抛 StackOverflowError/OOM。 2. 线程共享区域 堆:JVM 最大的内存区域,存储对象实例和数组,是垃圾回收(GC)的核心区域; 分代:新生代(Eden + Survivor0 + Survivor1,比例 8:1:1)、老年代; 溢出:对象无法分配内存时抛 OutOfMemoryError: Java heap space。 ...
LeetCode1015.可被K整除的最小整数
1015.可被K整除的最小整数题目描述:给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。 返回 n 的长度。如果不存在这样的 n ,就返回-1。 注意: n 可能不符合 64 位带符号整数。 示例 1: 输入: k = 1 输出: 1 解释: 最小的答案是 n = 1,其长度为 1。 示例 2: 输入: k = 2输出: -1解释: 不存在可被 2 整除的正整数 n 。 示例 3: 输入: k = 3输出: 3解释: 最小的答案是 n = 111,其长度为 3。 提示: 1 <= k <= 10^5 思路: 循环遍历乘10取余k,为了避免溢出对k取余,对k取余不会影响结果 代码:123456789101112class Solution { public int smallestRepunitDivByK(int k) { int res = 0; for (int i = 1; i < 100000; ...
LeetCode1018.可被5整除的二进制
1018.可被5整除的二进制题目描述:给定一个二进制数组 nums ( 索引从0开始 )。 我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。 例如,如果 nums =[1,0,1] ,那么 x0 = 1, x1 = 2, 和 x2 = 5。返回布尔值列表 answer,只有当 xi 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。 示例 1: 输入: nums = [0,1,1] 输出: [true,false,false] 解释: 输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为 true 。 示例 2: 输入: nums = [1,1,1]输出: [false,false,false] 提示: 1 <= nums.length <= 105 nums[i] 仅为 0 或 1 思路: 循环遍历左移一位取余5,为了避免溢出对5取余 代码:1234567891011class Solu...
LeetCode1262.可被三整除的最大和
1262.可被三整除的最大和题目描述:给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。 示例 1: 输入: nums = [3,6,5,1,8] 输出: 18 解释: 选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。 示例 2: 输入: nums = [4]输出: 0解释: 4 不能被 3 整除,所以无法选出数字,返回 0。 示例 3: 输入: nums = [1,2,3,4,4]输出: 12解释: 选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。 提示: 1 <= nums.length <= 4 * 104 1 <= nums[i] <= 10^4 思路: 虽然A过了,但是我写的贪心太丑陋了,放下灵神的代码吧 代码:123456789101112131415161718192021222324252627282930class Solution { public int maxSumDivThree(int[] nu...
LeetCode65.有效数字
65.有效数字题目描述:给定一个字符串 s ,返回 s 是否是一个 有效数字。 例如,下面的都是有效数字:2, 0089, -0.1, +3.14, 4., -.9, 2e10, -90E3, 3e+7, +6e-1, 53.5e93, -123.456e789,而接下来的不是:abc, 1a, 1e, e3, 99e2.5, --6, -+3, 95a54e53。 一般的,一个 有效数字 可以用以下的规则之一定义: 一个 整数 后面跟着一个 可选指数。 一个 十进制数 后面跟着一个 可选指数。 一个 整数 定义为一个 可选符号 - 或 + 后面跟着 数字。一个 十进制数 定义为一个 可选符号 - 或 + 后面跟着下述规则: 数字 后跟着一个 小数点 .。 数字 后跟着一个 小数点 . 再跟着 数位。 一个 小数点 . 后跟着 数位。指数 定义为指数符号 e 或 E,后面跟着一个 整数。 数字 定义为一个或多个数位。 示例 1: 输入: s = “0” 输出: true 示例 2: 输入: s = “e”输出: false 示例 3: 输入: s...
LeetCode32.最长有效括号
LeetCode32.最长有效括号题目描述:给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号 子串 的长度。 左右括号匹配,即每个左括号都有对应的右括号将其闭合的字符串是格式正确的,比如 (()())。 示例 1: 输入: s = “(()” 输出: 2 解释: 最长有效括号子串是 “()” 示例 2: 输入: s = “)()())”输出: 4解释:最长有效括号子串是 “()()” 示例 3: 输入: s = “”输出: 0 提示: 0 <= s.length <= 3 * 104 s[i] 为 ( 或 ) 思路: 栈存下标,每次入栈取栈顶元素看当前待入栈元素是否为),且栈顶元素为(,若满足条件则先弹出元素,然后取ans = Math.max(i-stack(top),ans)需要注意下边界条件,即栈为空边界 代码:1234567891011121314151617181920class Solution { public int longestValidParentheses(Stri...
LeetCode3190.使所有元素都可以被3整除的最少操作数
3190.使所有元素都可以被3整除的最少操作数题目描述:给你一个整数数组 nums 。一次操作中,你可以将 nums 中的 任意 一个元素增加或者减少 1 。 请你返回将 nums 中所有元素都可以被 3 整除的 最少 操作次数。 示例 1: 输入: nums = [1,2,3,4] 输出: 3 解释: 通过以下 3 个操作,数组中的所有元素都可以被 3 整除: 将 1 减少 1 。 将 2 增加 1 。 将 4 减少 1 。 示例 2: 输入: nums = [3,6,9]输出: 0 提示: 1 <= nums.length <= 50 1 <= nums[i] <= 50 思路: 暴力破解就好,循环代替思考 代码:123456789class Solution { public int minimumOperations(int[] nums) { return Arrays.stream(nums) .map(num -> { ...
LeetCode1930.长度为3的不同回文子序列
1930.长度为3的不同回文子序列题目描述:给你一个字符串 s ,返回 s 中 长度为 3 的不同回文子序列 的个数。 即便存在多种方法来构建相同的子序列,但相同的子序列只计数一次。 回文 是正着读和反着读一样的字符串。 子序列 是由原字符串删除其中部分字符(也可以不删除)且不改变剩余字符之间相对顺序形成的一个新字符串。 例如,"ace" 是 "abcde" 的一个子序列。 示例 1: 输入: s = “aabca” 输出: 3 解释: 长度为 3 的 3 个回文子序列分别是: “aba” (“aabca” 的子序列) “aaa” (“aabca” 的子序列) “aca” (“aabca” 的子序列) 示例 2: 输入: s = “adc”输出: 0解释:“adc” 不存在长度为 3 的回文子序列。 示例 3: 输入: s = “bbcbaba”输出: 4解释: 长度为 3 的 4 个回文子序列分别是: “bbb” (“bbcbaba” 的子序列) “bcb” (“bbcbaba” 的子序列) “...
LeetCode757.设置交集大小至少为2
757.设置交集大小至少为2题目描述:给你一个二维整数数组 intervals ,其中 intervals[i] = [starti, endi] 表示从 starti 到 endi 的所有整数,包括 starti 和 endi 。 包含集合 是一个名为 nums 的数组,并满足 intervals 中的每个区间都 至少 有 两个 整数在 nums 中。 例如,如果 intervals = [[1,3], [3,7], [8,9]] ,那么 [1,2,4,7,8,9] 和 [2,3,4,8,9] 都符合 包含集合 的定义。 返回包含集合可能的最小大小。 示例 1: 输入: intervals = [[1,3],[3,7],[8,9]] 输出: 5 解释: nums = [2, 3, 4, 8, 9].可以证明不存在元素数量为 4 的包含集合。 示例 2: 输入: intervals = [[1,3],[1,4],[2,5],[3,5]]输出: 3解释: nums = [2, 3, 4].可以证明不存在元素数量为 2 的包含集合。 ...
LeetCode2154. 将找到的值乘以2
2154. 将找到的值乘以2题目描述: 给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。 接下来,你需要按下述步骤操作: 如果在 nums 中找到 original ,将 original 乘以 2 ,得到新 original(即,令 original = 2 * original)。否则,停止这一过程。 只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。 返回 original 的 最终 值。 示例 1: 输入: nums = [5,3,6,1,12], original = 3 输出: 24 解释: 3 能在 nums 中找到。3 * 2 = 6 。 6 能在 nums 中找到。6 * 2 = 12 。 12 能在 nums 中找到。12 * 2 = 24 。 24 不能在 nums 中找到。因此,返回 24 。 示例 2: 输入: nums = [2,7,9], original = 4 输...
