
面试经阁
唐 昊
稳扎稳打,步步为营
展开
-
随手集☞mybatis知识盘点
对象关系映射,是一种为了解决关系型数据库数据与简单java对象POJO 的映射关系的技术简单来说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。原创 2024-03-26 10:44:09 · 721 阅读 · 0 评论 -
随手集☞SpringMVC知识盘点
SpringMVC是Spring框架提供的一款基于MVC(Model-View-Controller)模式的轻量级Web开发框架MVC是一种软件架构的思想,它将软件按照模型(Model)、视图(View)、控制器(Controller)来划分,将web层进行职责解耦,在Spring MVC中,控制器的问题得到了很好的解决。( MVC中,控制器的核心功能是根据用户的请求调用对应业务功能,并依据业务处理的结果,控制程序的运行流程。原创 2024-03-24 20:53:46 · 885 阅读 · 0 评论 -
Linux的相关指令总结
Linux指令是Linux操作系统的核心组成部分,它们为用户和管理员提供了与系统进行交互和管理的强大工具。这些指令涵盖了从基本的文件操作到复杂的系统配置和管理的各个方面。注意:使用rm删除目录时,需要加上-r(递归删除)选项。原创 2024-03-23 10:46:09 · 954 阅读 · 0 评论 -
wait-ify工作原理(学习笔记)
原理之 wait/notifyowner线程发现条件不满足,调用wait方法,即可进入waitset变为 waiting状态blocked 和 waiting 的线程都处于阻塞状态,不占用CPU时间片blocked线程会在owner线程释放锁时唤醒waiting线程会在owner线程调用notify或notifyall时被唤醒,但唤醒后并不意味着立即获得锁,仍然需要进入EntryList重新竞争者相关API的介绍obj.wait() 让进入object监视器的线程到waitSet等待obj,n原创 2022-07-24 16:31:49 · 260 阅读 · 1 评论 -
每日知识点---http和https的区别
http和https的区别http是互联网应用最广泛的一种网络协议,用于WWW服务器传输超文本到本地浏览器的传输协议HTTPS,是http的加密升级版,在http的基础上加了SSL层作用:建立信息安全通道,保证数据传输的安全,确认网站的真实性区别http是未加密的数据传输(明文)为了保证数据的安全传输,使用SSL进行协议加密,从而衍生了HTTPS1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。2、http是超文本传输协议,信息是明文传输,https则是具有安全性的s原创 2022-07-24 16:27:31 · 208 阅读 · 0 评论 -
二叉树的层序遍历(递归非递归操作)
import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNode类 * @return int整型ArrayList<ArrayList<>&g原创 2022-03-16 19:12:10 · 614 阅读 · 1 评论 -
每日知识点===事务
事务一般是指要做的事,在计算机中指的是访问并可能更新数据库中各种 数据项的一个程序执行单元自动提交:autocommit=1手动提交:autocommit=0ACID原则原子性:一个事务是是一个不可分割的工作单元,要么都做,要么都不做一致性:事务必须是从数据库从一个一致性到另一个一致性隔离性:一个事务的执行不受其他事务的干扰,即一个事务内部的操作及使用的数据对并发的其他事务都是隔离的,并发执行互不干扰持久性:一个事务一旦提交,它对数据库的改变就是永久的,对于接下来的操作就不应该有任原创 2022-03-14 21:57:22 · 1371 阅读 · 1 评论 -
java-模拟面试
讲一下快速排序算法通过一次排序将数列分为两部分,一部分比另一部分数字都小时间复杂度O(nlogn)空间复杂度O(1)先确定一个中间比较值,确定一个左指针(从头开始),右指针(从尾部开始)while循环左子针一直往右找,右指针一直往左找,一直到二者有交集,就会退出循环,说明没有找到,若是在退出循环前找到了,则交换二者的位置// 交换完毕 如果该值 等于中轴值 则需 将右下标往前推进 if (arr[l] == pivot) { r -= 1;原创 2022-03-14 20:29:33 · 946 阅读 · 1 评论 -
每日知识点===乐观锁和悲观锁
乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。悲观锁 代表是synchronized 和 lock锁其原创 2022-03-13 12:14:41 · 423 阅读 · 1 评论 -
奇安信背包问题(记载)
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] weight = {2, 3, 1,5,4,3}; //重量的分布 int[] val = {2, 2, 3,1,5,2};// 价值的分布 int n = in.nex.原创 2022-03-11 22:17:56 · 203 阅读 · 0 评论 -
String和StringBuffer和StringBuilder的区别
区别1.可变性String是使用字符串数组保存字符串,底层是使用final修饰的,属于不可变类型StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。2.线程安全String中的对象是不可变的,也就可以理解为常量,线程安全StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。Strin原创 2022-03-01 11:30:44 · 92 阅读 · 0 评论 -
JVM之常见的垃圾收集器
Serial 收集器JDK1.3.1之前的是HotSpot续集级新声代收集器的唯一选择该收集器是单线程工作的收集器单线程指的是:不仅仅是用一个处理器或者一条收集器线程去完成垃圾收集工作更强调的是进行垃圾收集的时候,会暂停其他所有的工作,直到收集结束优点:没有线程的交互开销,可以更高效的执行垃圾收集(单线程)操作Serial Old收集器是Serial 收集器老年代版本,同样也是单线程的收集器,使用标记-整理算法。用途:客户端模式: 供HopSpot 虚拟机使用原创 2022-02-17 13:28:56 · 549 阅读 · 0 评论 -
贪心算法(java)---(韩顺平数据结构)笔记
贪心算法在对问题进行求解的时候,在每一步选择中都采用最好或者最优的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果不一定是最优的结果,但是都是相对近似的最优解结果最佳应用-集合覆盖假设存在如下表的需要付费的广播台,以及广播台信号覆盖的地区,如何选择最少的广播台,让所有的地区都可以接收到信号使用贪婪算法遍历所有的广播台,找到讴歌覆盖了最多未覆盖的地区的电台,(此电台可能包含一些未覆盖的地区)将这个电台加入到一个集合中,把这些电台覆盖的地区在下一次比较原创 2022-02-16 12:04:10 · 600 阅读 · 2 评论 -
KMP算法解析---(韩顺平数据结构)笔记
字符串的匹配(暴力匹配)// 暴力匹配 public static int volienceP(String str1,String str2){ char[] c1 = str1.toCharArray(); char[] c2 = str2.toCharArray(); int i = 0; int j = 0 ; while (i < str1.length() && j < str2.length()){ if(c1[i] == c2[j]原创 2022-02-15 10:36:33 · 511 阅读 · 0 评论 -
动态规划(背包问题)---(韩顺平数据结构)笔记
动态规划算法-背包问题思路分析算法的主要思想,利用动态规划来解决,每次遍历到的第I个物品,根据W[i]和v[i]来确定是否需要将该物品放入背包中,即对给定的第n个物品,设v[i] w[i]分别为第i个物品的价值和重量 C为背包的容量,再令v[i][j]为 在第i个物品能够装入j容量背包的最大价值算法步骤:v[i][0] = 0 v[0][i] = 0;当w[i] > j 时 v[i][j] = v[i-1][j] // 当准备加入新增的商品的容量当 j>=w[i] 时 v[i.原创 2022-02-15 09:19:41 · 458 阅读 · 4 评论 -
快速排序算法回顾---(韩顺平数据结构)笔记
public static void sort(int[] arr, int left, int right) { // 定义左下标 int l = left; // 定义右下标 int r = right; // 定义中轴 int pivot = arr[(left + right) / 2]; // 定义临时变量 int temp = 0; // 当左下标 .原创 2022-02-12 10:37:29 · 603 阅读 · 2 评论 -
分治算法-汉诺塔的实现
介绍汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。算法思想1) 如果只有一个盘子 A -> C2) 如果我们有n >= 2 情况,我们总是可以看做是两个盘,1.最下边的盘,2. 上面的盘先把最上面的盘 A ->B把最下面的原创 2022-01-16 11:32:45 · 102 阅读 · 2 评论 -
java反射机制快速入门
反射原理反射相关类的使用(有参构造器,无参构造器,成员变量方法)反射的优点和缺点反射机制的优点和缺点优点: 可以动态的创建和使用对象(也就是框架底层核心)使用灵活,么有反射机制,框架技术就失去底层支撑缺点:使用反射基本是解释执行,对执行速度有影响...原创 2021-08-22 11:10:47 · 161 阅读 · 1 评论 -
Nginx知识点总结
问题总结一、什么是Nginx是一个轻量级的高性能的反向代理,web服务器,实现非常高效的反向代理,负载均衡,可以处理高并发的连接数,支持5万并发二、为什么要使用跨平台性,配置简单,反向代理,高并发连接,处理大量连接数据内存消耗小处理静态资源,内存消耗小而且Nginx内置的健康检查功能,如果有一台服务器宕机,会做一个健康检查节省宽带,支持GZIP压缩,可以添加浏览器到本地缓存稳定性高宕机的概率是非常小的接收用户请求是异步的 三、为何Nginx性能这么高原创 2021-08-14 17:42:03 · 394 阅读 · 3 评论 -
HashMap扩容机制解读
扩容机制什么时候需要扩容:当hashmap中的元素个数超过数组大小 * loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75这是一个折中的取值,也就是说,默认情况下数组大小为16,那么当hashmap中的元素个数超过16*0.75 = 12 (阈值或者边界值的时候)就把数组的大小扩展Wie2 * 16 = 32,然后重新计算出每个元素在数组中的位置,而这是一个非常耗性能的操作,所以我们最好能够提前预知并设置元素的个数。注原创 2021-04-25 18:59:42 · 7173 阅读 · 1 评论 -
HashMap遍历key值和value值的几种方法
package com.qst.netty04;import io.netty.buffer.ByteBuf;import io.netty.buffer.ByteBufAllocator;import lombok.extern.slf4j.Slf4j;import java.util.*;public class TestByteBif { HashMap<String, Integer> map = new HashMap<String, I原创 2021-04-24 22:58:21 · 1742 阅读 · 0 评论 -
HashMap之成员方法
put方法先通过hash值计算出key映射到哪个桶中如果桶上没有碰撞冲突,则直接插入如果出现碰撞冲突了,则需要处理冲突 a.如果该桶使用红黑树处理冲突,则调用红黑树的方法插入数据 b.否则采用传统的链式方法插入,人如果链的长度达到临界值,则把链表转变为红黑树如果桶中存在重复的键,则为该键替换新值value如果size大于阈值threshold则进行扩容 /** * Associates the specified value with the原创 2021-04-24 22:55:42 · 168 阅读 · 0 评论 -
HashMap底层原理
继承关系查看HashMap类图构造(右键菜单中选择Diagrams>Show Diagrams,快捷键Ctrl+Alt+Shift+U)继承了AbstractMap实现了Map<k,v>接口(提供了操作map的相关方法)说明Cloneable 空接口,表示可以克隆,创建并返回hashmap对象的一个副本Seriablizable序列化接口,属于标记性接口,HashMap对象可以被序列化 和反序列化AbstractMap父接口提供了Map实现接口,以最大限度地减少实现此接原创 2021-04-24 10:16:37 · 114 阅读 · 0 评论 -
面试经-图的深度和广度遍历
package Com.JW.graph;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import org.omg.PortableInterceptor.INACTIVE;import Com.JW.List.linklist;public class Graph { private ArrayList<String> vertexList; // 存储顶点集原创 2021-03-31 21:15:47 · 207 阅读 · 3 评论 -
面试经-暴力匹配
package Com.JW.kmp;public class ViolenceMatch { public static void main(String[] args) { String str1 = "ABBAACCDDB SDFFDS"; String str2 = "SDF"; int index = violenceMatch(str1, str2); System.out.println("index=" + index); } public s原创 2021-03-30 19:11:34 · 74 阅读 · 0 评论 -
面试经-非递归实现二分查找
package Com.JW.BinarySortDemo;public class BinarySearchNoRecur { public static void main(String[] args) { int[] arr = {1,3, 8, 10, 11, 67, 100}; System.out.println(find(arr, 100)); } public static int find(int [] arr,int target) { int left =原创 2021-03-29 22:18:09 · 73 阅读 · 1 评论 -
面试经-线性查找算法
可查询重复数字的位置package Com.JW.Search;import java.util.ArrayList;import java.util.Arrays;public class SeqSearch { public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 ,9,-1}; int[] index = getIndex(arr, -1); int a = 1; Array原创 2021-03-29 12:56:27 · 117 阅读 · 1 评论 -
面试经-赫夫曼树的构建及前序遍历
package Com.JW.Tree;import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;public class Heffuman { public static void main(String[] args) { int arr[] = { 13, 7, 8, 3, 29, 6, 1 }; pre(getHefuman(arr)); }原创 2021-03-29 12:45:07 · 197 阅读 · 0 评论 -
面试经-二叉树遍历查找及删除相关操作
package Com.JW.Tree;public class BinaryTreeDemo { public static void main(String[] args) { TreeN root = new TreeN(1, "zS"); TreeN r1 = new TreeN(2, "zS2"); TreeN r2 = new TreeN(3, "zS3"); TreeN r3 = new TreeN(4, "zS4"); TreeN r4 = new TreeN(原创 2021-03-29 12:42:06 · 100 阅读 · 2 评论 -
面试经 -逆波兰表达式
逆波兰表达式(简介)逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。代码实现package Com.JW.stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * *原创 2021-03-29 12:22:25 · 229 阅读 · 5 评论 -
赫夫曼树的构建(笔记)
构建赫夫曼树的步骤:从小到大进行排序,将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗最简单的二叉树,取出根节点权值最小的两颗二叉树组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和再将这颗新的二叉树,以根节点的权值大小,再次排序,不断重复,之前的步骤直到数列中,所有的数据都被处理,就得到一颗赫夫曼树package Com.JW.Tree;import java.util.ArrayList;import java.util.Colle原创 2021-03-23 16:56:21 · 223 阅读 · 0 评论 -
面试经-力扣题解
作者:美团链接:https://leetcodecn.com/leetbook/read/meituan/oh1sq3/来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。小美的一个兼职是美团的一名跑腿代购员,她有 n 个订单可以接,订单编号是 1~n ,但是因为订单的时效性,他只能选择其中 m个订单接取,精明的小美当然希望自己总的获利是最大的,已知,一份订单会提供以下信息,跑腿价格 v ,商品重量 w kg,商品每重 1kg,代购费用要加 2元.转载 2021-03-22 09:46:24 · 413 阅读 · 0 评论 -
面试经-顺序存储二叉树
package Com.JW.Tree;import java.util.Arrays;public class ArrayBinaryTreeTest { public static void main(String[] args) { int arr[] = {1,2,4,5,6,7,8,32}; System.out.println("之前的"); System.out.println(Arrays.toString(arr)); System.out.println(.原创 2021-03-20 15:51:11 · 78 阅读 · 0 评论 -
面试经-经典8皇后问题
public class Queue8 { public static int max = 8; public static int[] arr = new int[max]; public static int count = 0; public static void main(String[] args) { check(0); System.out.printf("总共%d种方案",+count); } // 递归赋值操作 public static原创 2021-03-14 20:30:38 · 120 阅读 · 0 评论 -
面试经-递归算法之迷宫问题
问题描述:给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。public class MiGong { public static void main(String[] args) { int[][] arr = new int[8][8]; for (int i = 0; i < arr.length; i++) { arr[0][i] = 1; arr[7][i] = 1; } for (int i原创 2021-03-14 19:18:23 · 129 阅读 · 0 评论 -
面试经-栈实现综合计算器
思路/** 先将字符串分割为一个个字符* 接着进行判断:* 运算符栈如果为空,则进行压栈操作* 不为空,* 判断是否为运算符* 判断遍历到的运算符是否大于栈顶的元素,* 如果大于则,继续压栈* 反之,则从数字栈中弹出两个数字,运算符栈弹出一个字符(进行运算操作)* 并将结果压入数字栈,将之前的运算符继续压入字符栈* 不是运算符 * 判断是否为最后一个字符,继续压栈* 不是最后一个字符原创 2021-03-12 16:19:13 · 131 阅读 · 0 评论 -
集合遍历String类型转换char类型的六种方式
运用substring(int beginIndex,int endIndex)package com.atguigu.stack;import java.net.SocketTimeoutException;public class TestSubString { public static void main(String[] args) { String a = "zssd"; int index = 0; // subString 第一种方式 for (int原创 2021-03-12 11:44:51 · 451 阅读 · 0 评论 -
面试经-双向链表
双向链表分析遍历 方和 单链表一样,只是可以向前,也可以向后查找添加 (默认添加到双向链表的最后)(1)先找到双向链表的最后这个节点(2)temp.next = newHeroNode(3)newHeroNode.pre = temp;修改 思路和 原来的单向链表一样.删除(1) 因为是双向链表,因此,我们可以实现自我删除某个节点(2) 直接找到要删除的这个节点,比如 temp(3)temp.pre.next = temp.next(4)temp.next.pre = tem原创 2021-03-11 20:37:22 · 264 阅读 · 0 评论 -
面试经-单链表的相关操作
链表链表是有序的列表,但是它在内存中是存储如下链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单链表(带头结点) 逻辑结构示意图如下直接尾插法指定位置插入修改节点package Com.JW.List;import java.util.Scanner;import java.util.Stack;impo原创 2021-03-11 20:28:30 · 132 阅读 · 0 评论 -
面试经-约瑟夫问题
约瑟夫问题描述(单向链表循环)Josephu(约瑟夫、约瑟夫环) 问题Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数 到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由 此产生一个出队编号的序列。分析用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结 点起从 1 开始计数,计到 m 时,原创 2021-03-11 20:11:35 · 205 阅读 · 0 评论