![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
maihc1
这个作者很懒,什么都没留下…
展开
-
JVM之内存与垃圾回收——本地方法接口
本地方法接口什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,例如C。为什么要使用Native Method?Java使用起来很方便,然而有些层次的任务用Java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。有时Java应用需要与Java外面的环境进行交互,这是本地方法存在的主要原因。目前本地方法接口使用已经越来越少了,除非是与硬件有关的应用。..原创 2021-11-15 21:04:09 · 301 阅读 · 0 评论 -
JVM之内存与垃圾回收——虚拟机栈
虚拟机栈1、虚拟机栈概述内存中的堆与栈栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪。虚拟机栈基本内容Java虚拟机栈,早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个一个的栈帧,对应着一次次的Java方法调用。Java虚拟机栈是线程私有的。Java虚拟机栈的生命周期和线程一致。Java虚拟机栈的作用:主管Java程序的运行,它保存方法的局部变量(8种基本数据类型、引用类原创 2021-11-15 20:38:07 · 322 阅读 · 0 评论 -
JVM之内存与垃圾回收——程序计数器
程序计数器一、程序计数器介绍JVM中的程序计数器(Program Counter Register,也叫PC寄存器)是对物理PC寄存器的一种抽象模拟。程序计数器的作用程序计数器用来存储指向下一条指令的地址,执行引擎通过这个地址读取下一条指令。程序计数器占用很小的一块内存空间,几乎可以忽略不计。在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,其生命周期与线程的生命周期保持一致。任何时间一个线程只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java原创 2021-11-03 20:42:18 · 156 阅读 · 0 评论 -
JVM之内存与垃圾回收——运行时数据区概述及线程
运行时数据区概述及线程一、运行时数据区概述内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。HotSpot的运行时数据区上图中红色的方法区和红色的堆与JVM共存亡,也就是与进程共存亡,由进制的所有线程共享。灰色的程序计数器、本地方法栈、虚拟机栈与线程共存亡,也就是说每个线程有独立的程序计数器、本地方法原创 2021-11-03 19:23:57 · 125 阅读 · 0 评论 -
JVM之内存与垃圾回收——类加载子系统
类加载子系统一、内存结构概述要想实现一个Java虚拟机,最基本的是类加载器和执行引擎。二、类加载器与类加载过程类加载子系统的作用类加载子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识(检验这个标识由链接阶段的验证阶段完成)。类加载子系统只负责class文件的加载,至于它是否可以运行,则由执行引擎决定。类加载子系统加载完成之后,将加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字原创 2021-11-02 22:37:49 · 80 阅读 · 0 评论 -
JVM之内存与垃圾回收——JVM与Java体系结构
JVM与Java体系结构一、前言实际开发中可能遇到的关于JVM的问题为什么学JVM面试都会问追求极客精神中高级Java程序员必备,项目管理,调优需要二、JVM参考书目Oracle官方JVM规范中文版Java虚拟机规范(JDK8)《深入理解Java虚拟机》《自己动手写Java虚拟机》三、Java语言与JVM简介Java是目前应用最广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。J原创 2021-11-02 16:29:01 · 164 阅读 · 0 评论 -
Algorithm——高楼扔鸡蛋
问题描述高楼扔鸡蛋问题是一道经典的动态规划问题,题目如下:给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请原创 2021-10-31 12:56:30 · 301 阅读 · 0 评论 -
LeetCode每日一题-2021/07/04-错误的集合
错误的集合–java–排序思路:这道题很简单,就是找出一个序列中少了的一个元素和重复了的一个元素。首先我们先讲解求重复元素的方法,有两种方式。一是将序列从小到大排序,比较当前元素与前一个元素的值来寻找重复元素。二是利用哈希表来寻找重复元素。接着我们讲解寻找缺少元素的方法。求解缺少元素可以利用正常序列的和减去该序列除了重复元素的和。由于重复元素我们已经求过了,所以只需利用n*n+1求出正常序列的和就可。代码:class Solution { public int[] findErrorNum.原创 2021-07-04 15:10:49 · 87 阅读 · 1 评论 -
LeetCode每日一题-2021/07/03-根据字符出现频率排序
代码:class Solution { public String frequencySort(String s) { Map<Character,Integer> map = new HashMap<>(); for( Character ch : s.toCharArray() ){ map.put(ch,map.getOrDefault(ch,0) + 1); } Charac.原创 2021-07-03 22:28:08 · 102 阅读 · 0 评论 -
LeetCode每日一题-2021/07/02-雪糕的最大数量
雪糕的最大数量–java–排序+贪心思路:这道题很明显可以看出来,是一道贪心求解的问题,但前提是先对其进行排序。代码:class Solution { // 贪心法 public int maxIceCream(int[] costs, int coins) { int res = 0; Arrays.sort(costs); for( int i = 0; i < costs.length; ++i ){ .原创 2021-07-02 07:50:38 · 79 阅读 · 0 评论 -
LeetCode每日一题-2021/07/01-传递信息
传递信息–java–递归大概有一个礼拜没有更新题解了,今天百忙之中抽点时间更新一下。思路:这道题,乍一看会觉得不好下手,那是因为你没有理解递归思想的核心。递归思想对于学习算法来说有多重要就不用多说了吧。理解递归的两个要素对于理解递归思想来说是相当重要的,即递归的结束条件和递推方程,每次在使用递归解题时,只需要想到这两条,就会使问题简单许多了。代码:class Solution { // 递归思想 public int numWays(int n, int[][] relation.原创 2021-07-01 19:23:02 · 89 阅读 · 0 评论 -
LeetCode每日一题-2021/06/22-字符串的排列
字符串的排列–java–回溯思路:这道题一看就是一道典型的回溯问题,求出给定字符串的所有排列。相对于求所有子集的问题,这道题只需要求出长度为原始字符串长度的子集即可。直接利用dfs模板来做。代码:class Solution { private Set<String> res = new HashSet<>(); public String[] permutation(String s) { List<Character> lis.原创 2021-06-22 22:39:15 · 48 阅读 · 0 评论 -
LeetCode每日一题-2021/06/21-二进制手表
二进制手表–java–枚举法思路:可以枚举所有时刻的时分二进制之和,如果得到的结果与传入参数相等,则该时刻符合题目要求,将其时分的字符串表示加入结果集中,枚举完成之后,返回结果集。代码:class Solution { public List<String> readBinaryWatch(int turnedOn) { List<String> res = new LinkedList<>(); for( int i =.原创 2021-06-21 21:34:59 · 129 阅读 · 2 评论 -
LeetCode每日一题-2021/06/19-串联字符串的最大长度
串联字符串的最大长度–java–BFS思路:这道题可以使用BFS来做,前提是需要知道节点在集合中的位置。代码:```javaclass Solution { public int maxLength(List<String> arr) { // bfs Queue<Map<String,Integer>> queue = new LinkedList<Map<String,Integer>>().原创 2021-06-19 21:41:13 · 85 阅读 · 0 评论 -
LeetCode每日一题-2021/06/16-石子游戏
石子游戏–java–dfs思路:这道题,一看题解就觉得自己像个弱智。呜呜呜~~~。DP解法先放下,只有dfs解法。代码:class Solution { private boolean res; // dfs public boolean stoneGame(int[] piles) { dfs(true,0,piles.length - 1,piles,0); return res; } public vo.原创 2021-06-16 20:50:11 · 52 阅读 · 0 评论 -
LeetCode每日一题-2021/06/15-山脉数组的峰顶索引
山脉数组的封顶索引–java–二分法思路:这道题最容易想到的就是枚举每个数字,而要想将时间复杂度降为O(logN),可以使用二分的思想(利用arr[0] < arr[1] < … arr[i-1] < arr[i] >arr[i+1] > … > arr[arr.length - 1])。二分法其实就是在相对有序的序列中找到目标值,在这道题中其实就是找到那个比左右两个数字都大的数。代码:class Solution { public int pea.原创 2021-06-15 21:25:09 · 1163 阅读 · 1 评论 -
LeetCode每日一题-2021/06/14-猜数字大小
猜数字大小–java–二分法思路:这道题很明显的就可以看出是二分问题,废话不用多说,直接套二分模板。代码:/** * Forward declaration of guess API. * @param num your guess * @return -1 if num is lower than the guess number * 1 if num is higher than the guess number * o.原创 2021-06-14 13:33:00 · 85 阅读 · 0 评论 -
LeetCode每日一题-2021/06/13-第一个错误的版本
第一个错误的版本–java–二分思路:这道题最容易想到的就是从1开始遍历到n,第一次调用提供的API结果为true的数即为答案。然而,顺序遍历有序序列,一般也可以用二分思想来做,并且可以将时间复杂度降为O(logN)。目标是找到第一次调用提供的API结果为true的数,可利用二分思想,首先将 left 指向1,而 right 指向 n ,每次计算 left 和 right 的中间值 mid 对应的API是否为 true ,如果为 true ,则将 mid 赋值给 right ,如果为 false ,将m.原创 2021-06-13 15:07:33 · 83 阅读 · 0 评论 -
LeetCode每日一题-2021/06/11-完全平方数
完全平方数–java–BFS思路:这道题官方题解给的是dp和数学解法,这两天基本被DP搞得心态崩了。这道题我想到的是BFS暴力,也是没谁了。过几天必须专门把DP弄明白了。暴力解法,BFS模板直接用就好,没什么特别难理解的地方。代码:class Solution { public int numSquares(int n) { List<Integer> list = new LinkedList<>(); for( int i =.原创 2021-06-11 22:02:16 · 117 阅读 · 2 评论 -
LeetCode每日一题-2021/06/07-目标和
目标和–java–回溯思路:这道题很容易想到的就是回溯算法,虽然说时间复杂度高,但ac还是没问题的。同样可以用dp来做,这里先挖下个坑,等到复习dp的时候,再将动态规划做法加入。代码:class Solution { public int findTargetSumWays(int[] nums, int target) { return dfs(nums,target,0); } int dfs(int[] nums, int target, i原创 2021-06-07 21:54:47 · 41 阅读 · 0 评论 -
LeetCode每日一题-2021/06/05-移除链表元素
移除链表元素思路:这道题很容易想到的一个思路是开辟一片新的空间,然后遍历原数组,将符合条件的加入新链表,这样做空间复杂度为O(n)。第二种方法是在原地修改链表,空间复杂度为O(1)。需要注意的是保证注意最后一个节点值为val的情况。具体操作流程见下图:代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN原创 2021-06-05 23:26:46 · 84 阅读 · 1 评论 -
LeetCode每日一题-2021/06/04-相交链表
相交链表–java–哈希表思路:这道题,很容易想到的就是双循环暴力来做,也是一道很少有的LeetCode暴力不超时的题第二种思路是使用哈希表来做,先将A遍历,放入哈希表中,然后再遍历B,如果B中的元素在哈希表中存在,则返回该元素,否则返回null代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(.原创 2021-06-04 16:52:17 · 61 阅读 · 0 评论 -
LeetCode每日一题-2021/06/03-连续数组
连续数组–java–前缀和思路:这道题的暴力解法应该是很容易想到的,使用两层循环,很容易求解。但超时是肯定的。比较难想的是第二种解法,使用前缀和+哈希表。这个想法最关键的地方在于想到前缀和主要用于求连续子数组和,能想到这一点就很好做了,只需把0换成-1,然后考虑前缀和值相等的情况即可。class Solution { // public int findMaxLength(int[] nums) { // int max = 0; // for( int.原创 2021-06-04 12:58:37 · 53 阅读 · 0 评论