- 博客(49)
- 收藏
- 关注
原创 小米球ngrok内网穿透
小米球ngrok内网穿透背景自己本地服务想要在外网访问。操作步骤小米球官网,先注册,登陆https://manager.xiaomiqiu.com/login下载对应版本系统管理-商品管理-商品列表开通 以下 实名认证,注册版服务器两服务。其中,实名认证需花费0.5元,其他免费。系统管理-账户管理-我的隧道,设置自己的本地服务地址进入下载的文件夹,修改配置文件tokentoken 在系统管理-账户管理-我的账户中可查。启动 ngrok找到 一键启动脚本,启动或者,进入下载
2022-04-10 11:43:55
935
原创 unlock 实现
unlock 实现深入浅出 Java 并发 学习笔记unlock 通过 AQS release 方法实现:如果释放锁成功:队列头结点非空且能被唤醒,唤醒下一个节点(给队列头等待节点分配资源)。public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h)
2022-02-20 20:49:09
284
原创 Atomic 原子操作
Atomic 原子操作AtomicIntegerArray 基本操作同 AtomicInteger 类似,只是参数增加了 int i ,表示对数组下标为 i 的位置取值或赋值。import java.util.concurrent.atomic.AtomicIntegerArray;import static org.junit.Assert.assertEquals;class Test { public static void main(String args[]) throws Int
2022-02-14 21:07:35
1230
原创 AtomicInteger 的使用
AtomicInteger 的使用为什么需要java.util.concurrent.atomic.AtomicInteger++i,–i 不是线程安全的,涉及到三步,1、获取 i 值 2、进行运算 3、写回新值 。多线程情况下,结果超出预期。AtomicInteger 提供了哪些方法代码注释里标明了提供的方法。边使用,边熟悉。import static org.junit.Assert.*;import java.util.concurrent.atomic.AtomicInteger;p
2022-02-13 22:12:46
327
原创 257. 二叉树的所有路径
力扣链接题目给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [1,2,3,null,5]输出:[“1->2->5”,“1->3”]示例 2:输入:root = [1]输出:[“1”]提示:树中节点的数目在范围 [1, 100] 内-100 <= Node.val <= 100解题思路求路径,好像不管怎么遍历都有点不对劲:找到第一个叶子节点之后,该怎么
2022-02-10 22:12:53
74
原创 111. 二叉树的最小深度
力扣链接 111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5提示:树中节点数的范围在 [0, 105] 内-1000 <= Node.val <= 1000解题思路层序遍历,如果该层存在
2022-01-25 22:24:46
93
原创 102. 二叉树的层序遍历
层序遍历:从左到右,从上到下输出二叉树的节点值。力扣链接 102. 二叉树的层序遍历方法一:递归要素一:参数:(1)正在遍历节点 TreeNode(2)层数 int 用于识别正在遍历第几层(3)List 用于存储遍历的节点返回值:空要素二:结束条件:节点为空要素三:递归逻辑:如果正在遍历这一层次的第一个节点,构建新的 list 存储这一层数据。存储正在遍历的节点值。进行下一层的遍历: 递归遍历它的左节点,右节点具体实现class Solution { public
2022-01-20 22:09:50
353
原创 145. 二叉树的后序遍历
树的遍历方式:1、广度优先 层次 采用迭代法。2、深度优先 前序,中序,后序,指的是根节点的顺序 采用 递归。递归三要素:1、参数,返回值2、终止条件3、每一次递归逻辑具体实现 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} *
2022-01-14 20:32:31
90
原创 347. 前 K 个高频元素
求元素次数,想到用 map 计录。前 k 个高频元素:排序。map 无法对值排序,可更换 map 键值位置,或把map 转化为list 来实现。 class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer,Integer> map = new HashMap(); //记录次数 for(int i : nums)
2022-01-11 20:48:29
165
原创 并发编程基础(三)
并发编程基础(三)守护线程 用户线程守护线程:daemon 线程,实现通用功能的后台进程,非必须。例如 垃圾回收用户线程:例如,main 方法,用户进程执行完成后守护进程自动销毁,JVM退出。使用设置一个线程为守护线程,需在 start() 方法线程执行之前。 t1.setDaemon(true);设置为守护线程后,即使没执行完成,在主线程执行完成之后,自动销毁,JVM 也会退出。场景可随时关闭,不会出现不良后果。一般是为用户线程服务,低优先级,垃圾回收,心跳监测,临时数据清理等。Th
2021-12-29 20:33:08
209
原创 并发编程入门(二)
并发编程入门(二)慕课学习链接Thread join 方法用途某一线程执行完毕,才能执行后续的方法。异常join 方法会 throws InterruptedException,所以使用时,要么捕获,要么抛出。使用创建3个线程,等3个线程都执行完成再进行响应操作。public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runnable(){
2021-12-28 21:52:04
194
原创 并发编程入门(一)
并发编程入门(一)为什么要并发?提升资源利用率,提高程序运行速度。Java 的内存模型:工作内存:私有 每个线程分配独立的内存,互不干扰主内存:所有进程共享Thread 类 [implements Runnable]创建线程的三种方式:继承 Thread 类,重写 run 方法,实例.start 执行public class ThreadExtendTest extends Thread{ @Override public void run(){ Sys
2021-12-27 21:41:29
234
原创 Spring事务传播特性
required:当前没有事务,新建。当前存在事务,加入。supports: 当前没有事务,以非事务执行。当前存在事务,加入。mandatary: 当前存在事务,抛出异常requires_new :当前没有事务,新建。当前存在事务,还是新建not_supported: 当前没有事务,以非事务执行。当前存在事务,挂起。never: 当前存在事务,挂起NESTED:嵌套事务。子事务受主事务的影响。https://zhuanlan.zhihu.com/p/148504094...
2021-12-01 21:05:14
581
原创 239. 滑动窗口最大值
滑动窗口最大值给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 .
2021-11-21 21:34:53
192
原创 Integer int比较大小
1、a1 == a2 trueInteger.valueof(int) 自动装箱2、b1 == b2 false超出范围-128-127,不同的对象3、c1 == c2 falsenew,不同的地址4、d1 ==d2 true自动拆箱,比较值大小
2021-11-20 10:48:38
262
原创 20. 有效的括号
有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。分析:这道题看着挺简单的,就用栈是实现。谁曾想一看就会,一做就错。1、stack 的方法:入栈:push(Object o)出栈:pop()获取栈顶元素:peek()判空:empty() 不是 isEmpty()2、String 的方法遍历:char s.charAt();Strin.
2021-11-18 20:23:52
49
原创 225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。复习一下 Java 的 栈 和 队列。Stack:一个类,继承 Vector ,线程安全,性能较差,不推荐使用。push()
2021-11-14 13:09:33
3223
原创 232. 用栈实现队列
用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):入栈:模拟进队列出栈:模拟出队列push:在队列后追加一个元素pop:删除队列第一个元素peek:获取队列第一个元素注意:1、初始化两个栈,必须在方法外,是类变量。2、出队列,把元素从入栈里转到出栈里的时候,必须保证出栈里没有元素再转,否则,再次添加一个元素的时候,会导致顺序错乱。...
2021-11-13 10:04:32
319
原创 349. 两个数组的交集
两个数组的交集给定两个数组,编写一个函数来计算它们的交集思路:数组的长度必须在初始化时确定,用于分配内存空间。如果不确定,就不得不使用最大长度的的,容易造成空间浪费。长度不定,有需要去重的,考虑使用set。...
2021-11-07 20:18:39
42
原创 242. 有效的字母异位词
有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。思路:使用一个26个长度的数组,记录一个字符串每个字符出现的数量。循环另一个字符串,对出现的字符数量减一。最后,数组每个值都为0.即为相等。语法://获取字符串中某个字符的位置String s = "abc";char a = s.charAt(0);整型数组,默认每个元素都为0。...
2021-11-07 11:43:54
44
原创 142. 环形链表 II
环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。解题思路:1、快慢指针,慢指针走一步,快指针走两步,找相遇节点。注意:初始时,快指针开始走的时候,慢指针也必须走。 fast = head.next.next; slow = head.nex.
2021-11-06 10:06:48
44
原创 203. 移除链表元素
移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。方法一:建立虚拟头结点,所有节点统一处理注意:1、设立当前节点和前一个节点 两个节点循环,不容易出现空指针错误。2、删除和不删除的情况,指针后移要区别处理,注意不同点。3、返回的是 虚拟头结点的next,而不是之前的head方法二:头结点删除单独处理注意:链表结点定义public class ListNode(){ int val;.
2021-10-31 11:41:47
45
原创 59. 螺旋矩阵 II
螺旋矩阵 II给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。整理个人思路:四个方向循环 右 下 左 上整体循环退出条件:数组填满。转换方向条件:超出数组边界,或者在上一圈循环中已经赋值参考思路:偶数,循环 n/2 圈。奇数,循环 n/2 圈+中间一个数字整体循环退出条件:循环够 n/2 圈转换方向条件:左闭右开,每一边都循环 边数-1的数字,留一个给下一边循环。减少出错概率。...
2021-10-30 13:53:32
58
原创 977. 有序数组的平方
977. 有序数组的平方给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。1、首先,想到暴力解法,排序还不会,时间复杂度 O(n^2+n)2、看别人解法,知道用 双指针,时间复杂度可以到 O(n)总结:有序的数组,就考虑用双指针降低时间复杂度3、自己编写除了语法错误,还有边界值错误,导致有部分用例一直提交不通过。class Solution { public int[] sortedSquares(int[] nums)
2021-10-27 22:05:07
106
原创 704. 二分查找
704. 二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。1、刚开始刷,看了题目没感觉,摸不着头脑,直接看了别人的代码。2、看懂了自己写了一遍,感觉挺简单,不会出错,但实际还是出了 1 处错误,一直验证不通过,在此记录,方便下次复习。int mid = (left + right)/2;错写为 int mid = (left - right)/2;犯了低级错误。
2021-10-26 22:24:30
37
原创 idea jdk编译报错解决办法
还有一种情况是因项目过大,需要修改这个堆的大小解决方法如下:在setting–>Build,Execution,Deployment–>Compiler 中找到build process heap size(Mbytes):700改为1024(视情况而定)参考链接:https://blog.csdn.net/hcrw01/article/details/106887682...
2021-03-10 14:48:20
610
原创 Mac搭建开发环境
搭建本地环境1、安装jdk 成功标志:输入java -version显示版本信息2、搭建tomcat 成功标志:启动startup.bat 浏览器键入localhost:8080 显示tomcat首页3、安装eclipse 配置jdk 配置tomcat4、配置jdk 配置tomcat 新建项目运行Mac与windows区别1、文件位置很难找,jdk安装完成后自动配置到eclipse中2、压缩文件:点击压缩包即解压到当前位置,右键可压缩文件到当前位置,不需要安装其他压缩软件3、打开每个软件,菜
2021-03-08 15:43:01
136
原创 缓存使用
1、不能当作数据库使用,超出内存的数据会丢失2、避免缓存雪崩,缓存失效,导致大量数据回源方案一:设置可变动的缓存失效时间方案二:设置永不失效,定期更新数据到缓存避免缓存失效导致的并发回源:方案一:使用线程内锁,确保访问数据库的并发只有1方案二:使用工具限制并发数3、避免缓存穿透,查询到空值每次都返回数据重新查解决方案:数据库中查到空值在缓存中默认为特殊值。4、缓存同步先更新数据库,再删除缓存,在需要访问时同步新数据到缓存...
2021-02-16 18:40:06
76
原创 接口设计
1、返回的每个字段要定义明确2、不要直接暴露方法内部处理结果,根据需要做转化3、版本控制要规范4、接口是同步还是异步必须明确,否则可能出现得不到数据的情况
2021-02-16 14:35:09
205
原创 java避免空指针异常
空指针异常影响业务流程正常运转,避免空指针异常,也就避免了一半的bug字符串与已知值进行比较,已知值放在前面“123”.equals(value)两个字符串比较,不确定是否有空值,使用Object.equals() 方法boolean r = Objects.equals(a,b);使用 java8 中的 Optional 类代替显示判空Optional.ofNullable(null).orElse("0")单纯使用此方法可以避免大量空指针异常,但必须警惕,不报异常不代表
2021-02-15 16:53:33
114
原创 业务代码避免重复
1、不同用户运费不同,折扣不同,计算订单总额的逻辑不同。使用 if else 的话,会导致共有计算总额的代码重复,如果新增一种用户,需要新增 if else 语句,对之前的代码产生影响。解决办法:使用工厂模式,业务逻辑中调用父类的方法,不同的用户创建不同的子类,只需对不同的逻辑做处理,其他调用父类共有方法即可。如果新增用户,只需新增子类,复写不同逻辑的处理方法即可。2、 调用银行接口,需要对每个字段进行拼接传送,不同类型需要补全为定长字符串。如果要调多个银行接口,需要写多个方法,每个方法里都有字符串的
2021-02-15 16:51:28
182
原创 js判断空值和0
对于页面中 空代表没有值,客户端显示空0代表否定意义,显示否结果发现:不论是空,还是0,都显示否。原来是因为:使用 == 判等,0==空为了区分这两者,需要使用 === 判空,然后用 == 判断具体值...
2021-02-05 09:18:06
5327
原创 内存溢出
1、内存中的数据可能比数据库中数据占用空间更多,因为无意中可能了new了多份相同的数据。解决办法:通过 set 自动筛出重复的数据,多处使用可以使用同一个,可以大大节省重复导致的内存占用。...
2021-02-03 20:51:05
80
原创 2021-01-25
arthas工具快速定位生产问题快速入门链接:快速入门阿里 arthas 工具使用 常用命令:1、反编译jad demo.MathGame2、查看方法的参数返回值watch demo.MathGame primeFactors returnObj/params注意:通过curl访问生产环境服务,通过jar包启动。...
2021-01-25 20:45:01
51
原创 java List 常见坑
java List 常见坑数组转化listint[] a = {1,2,3};List list = Arrays.asList(a);如上代码,期望转化为有三个元素的 list,结果发现,list 里只有一个数组类型的元素。原因是 int 类型可以转化为Integer,int 数组却不能转化为 Integer 数组。解决办法:使用 Arrays.stream 的方式来转化或者 把数组声明为 Integer对数组转化的list进行增删操作Integer[] a = {1,2,3};a
2021-01-20 21:11:53
218
原创 客户端的东西不可信
请求中的用户信息不可信,最好通过登录或第三方登录拿到唯一标识客户端传参不可信,重要的业务参数需要在后台重新计算。对客户端传过来的参数要进行合法性校验,使用spring注解更优雅。重要事情说好多遍,不可信,不可信,不可信...
2021-01-13 22:02:32
334
原创 java数值精度问题
double 表示小数精度不准确,要使用BigDecimal,不能只让他走个过场,整个运算,格式转化都要使用其自带的方法。用字符串初始化BigDecimal,或者valueOf。大数值处理专家,要用BigInteger
2021-01-13 21:55:41
173
原创 zookeeper启动失败
zookeeper启动失败删除之前配置和安装的所有东西重新安装,参照https://www.cnblogs.com/zzuuoo666/p/12667198.htmlredis关闭命令:在redis-cli 客户端输入 shutdown提示没有授权时,auth ‘密码’
2021-01-12 21:59:00
219
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人