- 博客(250)
- 收藏
- 关注
原创 HashMap解决冲突的四种方法
1. 开放地址法(1)线性探测再散列放入元素,如果发生冲突,就往后找没有元素的位置;(2)平方探测再散列如果发生冲突,放到(冲突+1平方)的位置,如果还发生冲突,就放到(冲突-1平方)的位置;如果还有人就放到(冲突+2平方)的位置,以此类推,要是负数就倒序数。优点记录更容易进行序列化操作如果记录总数可以预知,可以创建完美的哈希函数,尽量避免hash冲突,提高效率;缺点扩容成本太高;使用探测序列,造成额外计算时间;删除的时候需要设置删除标记,造成额外的空间和操作;2. 拉链法
2021-04-19 22:55:33 2750 2
原创 java中Runnable和Callable的区别
Runnable需要实现run()方法,Callable需要实现call()方法。我们都知道要自定义一个Thread有两种方法,一是继承Thread,而是实现Runnable接口,这是因为Thread本身就是一个Runnable的实现。Runnable是不返还值的,而Callable可以返回值。Runnable的run()方法定义没有抛出任何异常,所以任何的Checked Exception都需要在run()实现方法中自行处理。Callable的Call()方法抛出了throws Exceptio.
2021-04-19 22:50:21 405
原创 线程通信的几种方式
(1)等待通知机制两个线程通过对同一对象调用等待 wait() 和通知 notify() 方法来进行通讯。join() 方法(2)volatile 共享内存volatile 修饰修饰变量实现线程之间的可见性。(3)CountDownLatch 并发工具(4)CyclicBarrier 并发工具(5)线程响应中断(6)线程池 awaitTermination() 方法(7)管道通信详细参考...
2021-04-19 22:45:56 352
原创 索引为什么能够提高查询速度?
索引的查找机制索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。举个例子:表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍!索引有什么副作用吗?(1)索引是有大量数据的时候才建立的,没有大量数据反而会浪费时间,因为索引是使用二叉树建立.(2)当一个系统查询比较频繁,
2021-04-19 22:41:37 437
原创 TCP 为什么三次握手而不是两次握手
1.TCP为了实现可靠数据传输, TCP 协议的通信双方, 都需要维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤2.如果只是两次握手, 最多只有连接发起方的起始序列号能被确认, 服务器选择的序列号则得不到确认...
2021-04-19 22:39:09 265
原创 linux下CPU使用率过高或负载过高的处理思路
查看系统CPU负载及使用率的命令为:top vmstattop 命令可以查看进程的CPU、内存等资源的使用情况。vmstat命令可以查看系统整体的cpu,内存的使用情况解决方式 使用top直接终止cpu消耗大的进程top命令查看对cpu消耗大的进程,直接输入"k",然后输入相应进程的PID号即可终止该进程...
2021-04-17 22:56:49 577
原创 valotile关键字
什么是valotile关键字?valotile是java中的关键字,用来修饰会被多个线程访问和修改的变量valotile关键字的作用1. 可见性如果不加valotile修饰的话每个线程会拷贝一份主存中的变量,某一个线程修改了其他线程是不知道的。而用valotile修饰的话多个线程访问同一个变量时,其中某一个线程修改了变量的值时其他线程都可以立刻看到修改后的值。**原理:**被valotile修饰的变量在被修改后会强制的修改到主存中,而其他线程访问自己的内存中的该变量时会发现其用valotile修
2021-04-17 22:06:02 1670
原创 Java反射是什么,为什么要用反射
什么是反射?反射就是程序运行时可以通过类的全限定名称动态的加载类,创建对象,并且可以调用类中的属性和方法。反射也只有在运行时才知道要操作的是什么类为什么要用反射?在写代码的时候如果我们使用了未定义的类,编译器会报错,用反射可以避免这个情况反射可以让代码更通用性和灵活性,易于扩展比如一段代码不用反射其实也可以一样实现,但是你想再扩展的话必须要修改代码违背了开闭原则——对扩展开方,对修改关闭,用反射可以解决改问题...
2021-04-17 21:08:43 447
原创 浅谈CAS机制
最近找实习在背八股文,了解到了在jdk1.6以前ConcurrentHashMap是用segment分段锁实现的线程安全,而在jdk1.8之后使用CAS和synchronized来实现线程安全的,那么究竟什么是CAS机制。synchronized关键字和CAS机制synchronized关键字实现线程安全会有大量的线程阻塞和重新调用,代价比较高,性能比较低。所以面对这种情况我们就可以使用Java原子类操作。所谓java原子类就是Atomic操作类如AtomicInteger,AtomicBoolen等
2021-04-16 21:27:27 182
原创 为什么快速排序是不稳定的?举例说说(面试题)
如果不了解快排的朋友请移步我的这篇博客快速排序讲解和代码实现那么为什么说快排是不稳定的呢通俗的说就是一堆数里面排序,有两个相同的数A和B,排序之前A在B前面,排序之后B在A前面,这就是快排的不稳定性。再看一个比较极端的例子数组中全是相同的数 全是 1 1 1 1 1 1 1 1 1 1 1 1 1 1那么i,j从两次扫一次时间复杂度就是O(n2)关于快排的时间复杂度最优情况:每次准基都恰好能平分数组 时间复杂度O(nlogn)最坏情况:每次准基都是最小数或者最大数 时间复杂度O(n²)平
2021-04-16 20:56:37 6695
原创 TCP第四次挥手释放连接时为什么time_wait状态必须等待2MSL时间
为什么上图中的客户端在TIME-WAIT状态必须等待2MSL时间呢?(1)为了保证客户端发送的最后一个ACK能够成功到达服务器。但是这个ACK有可能会发生丢失,导致处于LAST-ACK状态下的服务器接收不到对自己发送的FIN+ACK的确认ACK,所以服务器会超时重传,而恰好再2MSL时间内客户端能再一次收到FIN+ACK。如果A在TIME-WAIT状态不等待2MSL而直接断开连接的话无法再次受到服务器重传的FIN+ACK,导致服务器接收不到ACK,无法正常进入CLOSED状态。(2)A发送完ACK后在.
2021-04-15 22:40:39 986
转载 面试常问:什么是红黑树?
什么是红黑树? ———————————— 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树,就是一颗典型的二叉查找树: 1.查看根节点9: 2.由于10 > 9,因此查看右孩子13: 3.由于10 < 13,因此查看左孩子11: 4.由于10 < 11,因此
2021-04-13 12:00:33 174
原创 Navicat导入sql文件
1.打开数据库连接2.新建数据库test用来导入表3.右键test库选择运行SQL文件4.完成之后点击关闭再刷新数据库就算成功导入了
2021-04-09 19:35:49 227
原创 把eclipse的web项目导入到idea中
一、导入项目1、导入2、module选择eclipse(没有该步骤可以跳过)3、之后一路next即可二、配置依赖1、配置依赖和jar包(1)Project:选择相应的sdk(2)Modules:选择导入的模块dataweb,选择Dependencies,将红色的删除(3)Libraries:选择“+”,选择java,添加依赖将项目中lib目录添加进来三、配置webidea中原生的资源目录是web,而在eclipse中原生的 资源目录是WebContent,myeclipse中
2021-04-09 19:25:49 899 5
原创 TCP 三次握⼿和四次挥⼿(⾯试常客)
三次握⼿漫画图解简单示意图客户端–发送带有 SYN 标志的数据包–⼀次握⼿–服务端服务端–发送带有 SYN/ACK 标志的数据包–⼆次握⼿–客户端客户端–发送带有带有 ACK 标志的数据包–三次握⼿–服务端为什么要三次握手三次握⼿的⽬的是建⽴可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,⽽三次握⼿最主要的⽬的就是双⽅确认⾃⼰与对⽅的发送与接收是正常的。第⼀次握⼿:客户端什么都不能确认;服务器确认了对⽅发送正常,⾃⼰接收正常第⼆次握⼿:客户端 确认了:⾃⼰发送、接收正常,
2021-04-07 22:24:30 289 2
原创 剑指 Offer 63. 股票的最大利润(dp)
剑指 Offer 63. 股票的最大利润维护一个买入价格 和 每次卖出的利润的最大值 public int maxProfit(int[] prices) { if (prices.length < 2) return 0; int res = 0; int buy = prices[0]; for (int i = 1; i < prices.length; i++) { if (prices[
2021-03-31 14:52:37 130
原创 剑指 Offer 47. 礼物的最大价值(dp)
题目 public int maxValue(int[][] grid) { int row = grid.length; int colum = grid[0].length; int dp[][] = new int[row+1][colum+1]; for (int i = 1; i < row+1; i++) { for (int j = 1; j < colum+1; j++) {
2021-03-31 14:27:26 112
原创 Java中BigInteger的用法
BigInteger abs() 返回大整数的绝对值BigInteger add(BigInteger val) 返回两个大整数的和BigInteger and(BigInteger val) 返回两个大整数的按位与的结果BigInteger andNot(BigInteger val) 返回两个大整数与非的结果BigInteger divide(BigInteger val) 返回两个大整数的商double doubleValue() 返回大整数的double类型的值float fl
2021-03-31 14:05:27 450
原创 剑指 Offer 14- II. 剪绳子 II(dp)
题目long会炸 只能用BIgInteger了注意一下大数的乘法运算和取maxBigInteger.max(BigInteger a)返回自身和a的最大值import java.math.BigInteger;public class Offertwo { public int cuttingRope(int n) { if (n == 2) return 1; if (n == 3) return 2; BigInteger dp[] =
2021-03-31 13:50:04 119
原创 剑指 Offer 14- I. 剪绳子(dp)
所有的分解最后都会乘2或者乘3 public int cuttingRope(int n) { if (n == 2) return 1; if (n == 3) return 2; int dp[] = new int[n+1]; dp[0] = 1; dp[1] = 1; dp[2] = 2; dp[3] = 3; for (int i = 4; i < n+1.
2021-03-30 19:03:57 118 4
原创 剑指Offer面试题34. 二叉树中和为某一值的路径(dfs)
题目有很多坑 注意是叶子结点也就是走到二叉树底部开始用linkedlist写的时间2ms换了arraylist就1ms了挺不解的 希望以后理解了回来阐述一下class Solution { List<List<Integer>> res; int target; List<Integer> list; public List<List<Integer>> pathSum(TreeNode root, in
2021-03-29 16:44:26 140 8
原创 剑指 Offer 68 - II. 二叉树的最近公共祖先(递归)
题目 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null) return null; if (root.val == p.val || root.val == q.val) return root; TreeNode left = lowestCommonAncestor(root.left, p, q);
2021-03-29 15:25:04 144
原创 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(递归)
题目由于是二叉搜索树所以可以逐步确定区间如果都q和p的值都在当前结点的右侧 向右递归如果都q和p的值都在当前结点的左侧 向左递归如果在两侧直接返回当前结点 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root.val > p.val && root.val > q.val) return lowestCo
2021-03-29 15:19:46 98
原创 剑指 Offer 54. 二叉搜索树的第k大节点(递归)
朴素想法就是反中序遍历 用list存下来 找第K个但是太麻烦用递归思维就是反中序遍历的时候遍历到第K个直接返回 int res = 0; int k; public int kthLargest(TreeNode root, int k) { this.k = k; disIn(root); return res; } void disIn(TreeNode root){//反中序遍历 if (k &.
2021-03-23 22:40:52 81
原创 剑指 Offer 32 - III. 从上到下打印二叉树 III(层序遍历加双端队列)
要求奇数层逆序那么利用双端队列的性质 奇数层每次添加到队列头 public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); Deque<TreeNo.
2021-03-23 20:42:55 133 2
原创 剑指 Offer 32 - II. 从上到下打印二叉树 II(层序)
public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return new ArrayList<>(); List<List<Integer>> res = new ArrayList<>(); Deque<TreeNode> queue = new LinkedList<...
2021-03-23 20:22:56 88
原创 剑指 Offer 32 - I. 从上到下打印二叉树(队列实现层序遍历)
用bfs思想 队列实现先进先出 public int[] levelOrder(TreeNode root) { if (root == null) return new int[0]; ArrayList<Integer> list = new ArrayList<>(); Deque<TreeNode> queue = new LinkedList<>(); queue.offer(.
2021-03-23 20:16:42 94
原创 剑指 Offer 28. 对称的二叉树(递归)
题目递归找当前左右结点的值是否相等 并且当前左结点的左结点是否等于当前右结点的右节点 并且 当前左节点的右节点等于当前右节点的左节点 public Boolean recur(TreeNode left ,TreeNode right){ if (left == null && right == null) return true; if (left == null || right == null) return false; r
2021-03-23 19:33:24 73
原创 剑指 Offer 27. 二叉树的镜像(递归)
题目和翻转二叉树同题 public TreeNode mirrorTree(TreeNode root) { if (root == null) return null; TreeNode tmp = root.left; root.left = root.right; root.right = tmp; mirrorTree(root.left); mirrorTree(root.right);
2021-03-23 13:01:22 107 1
原创 剑指 Offer 26. 树的子结构(递归)
题目我的想法是找到A树每一个与B树跟结点相同的结点 放入List中遍历list中的结点当做起点去判断 是否B树是A树的子结构class Solution { ArrayList<TreeNode> list = new ArrayList<>(); public void find(TreeNode a,TreeNode b){ if (a == null) return; if (a.val == b.val) list.ad
2021-03-23 12:52:48 81
原创 剑指 Offer 55 - I. 二叉树的深度(递归)
public int maxDepth(TreeNode root) { if(root == null) return 0; return Math.max(maxDepth(root.left),maxDepth(root.right))+1; }
2021-03-23 11:46:57 90
原创 剑指 Offer 55 - II. 平衡二叉树(递归)
题目判断是否为平衡二叉树需要判断每一个结点的左右子树深度相差是否不超过1第一时间想到了递归 然后过程中用一个flag记录是否平衡 后来去题解学习了一遍nb的写法全局flag法class Solution { boolean flag = true; public int getDeep(TreeNode root){ if (root == null) return 0; return Math.max(getDeep(root.left),getD
2021-03-23 11:44:04 149 2
原创 LeetCode114二叉树展开为链表(递归)
题目递归保存当前结点的左右结点,遇到的左结点直接拼到右节点,左节点遍历完之后回溯,找到当前最底层的右结点,再将右节点拼接过去。两个版本一 有返回值 public TreeNode build(TreeNode root){ if (root == null) return null; TreeNode left = root.left; TreeNode right = root.right; root.left = null;
2021-03-22 22:25:32 163
原创 剑指 Offer 07. 重建二叉树(递归)
递归思想 每个点都当做跟结点去中序数组中划分左右子树 HashMap<Integer,Integer> map = new HashMap<>(); private TreeNode build(int[] pre ,int l1 ,int r1 ,int l2 ,int r2){ if (l1 > r1) return null; TreeNode root = new TreeNode(pre[l1]); i.
2021-03-22 21:33:17 87
原创 LeetCode72编辑距离(dp)
题目开始以为不是dp 后来看了下题解dp[i][j] 代表word1截止到第i个字符转换成word2截止到第j个字符需要几步变换状态方程if(word1[i] == word2[j]) dp[i][j] = dp[i-1][j-1] //无需操作else dp[i][j] = Math.min(Math.min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;dp[i][j-1]+1 代表word1截止到第i个转换成word2第j-1个需要的次数然后再插入第j个字
2021-03-22 17:32:21 143
原创 剑指 Offer 06. 从尾到头打印链表(栈)
public int[] reversePrint(ListNode head) { if (head == null) return new int[0]; Deque<Integer> stack = new LinkedList<>(); int cnt = 0; while (head != null){ stack.push(head.val); he...
2021-03-22 16:05:24 65
原创 剑指 Offer 05. 替换空格(字符串)
上来就知道一行代码就可以完成 但是又怕面试的时候认为是投机取巧 再来个朴素写法,时间复杂度一样class Solution { public String replaceSpace(String s) { s = s.replace(" ","%20"); return s; }} public String replaceSpace(String s) { StringBuilder sb = new StringBuild.
2021-03-22 15:59:30 80
原创 剑指 Offer 04. 二维数组中的查找(二分思维)
题目从左下为起点进行二分查找当前坐标值小于target向右找当前坐标值大于target向上找 public boolean findNumberIn2DArray(int[][] matrix, int target) { int i = matrix.length - 1; int j = 0; while (i >= 0 && j < matrix[0].length){ if (matr
2021-03-22 15:41:19 346
原创 剑指 Offer 03. 数组中重复的数字(哈希表或排序)
题目哈希表 8msclass Solution { public int findRepeatNumber(int[] nums) { HashSet<Integer> set = new HashSet<>(); for (int i = 0; i < nums.length; i++) { if (set.contains(nums[i])) return nums[i]; set
2021-03-22 15:23:57 135
原创 牛客 NC1 大数加法(模拟)
将两个字符串逆置然后维护s为最长串进行遍历相加 注意是否有进位public class Solution { int carry = 0; public void add(StringBuilder sb ,char x ,char y){ int sum = x -'0' + y - '0' + carry;//相加 Integer tmp = sum%10; String c = tmp.toString(); sb.
2021-03-19 22:55:40 246
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人