目录
昨日总结
- JVM底层原理学习,米粒商城项目(基本环境配置,逆向工程搭建)
- cv(停滞中)
- 小林coding--MySQL面试篇(2/7)
- 代码随想录--二叉搜索树中的众数
今日计划
- JVM底层原理学习,米粒商城项目ing
- cv(停滞中)
- 小林coding--MySQL面试篇(3/7)
- 代码随想录--二叉树的最近公共先祖
算法—— 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 :
输入:root = [1,null,2,2] 输出:[2]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap<>();
public int[] findMode(TreeNode root) {
dg(root);
List<Integer> maxkeys = new ArrayList<>();
int curMax = Integer.MIN_VALUE;
for(Map.Entry<Integer,Integer> entry : map.entrySet()) {
int value = entry.getValue();
if(value > curMax) {
curMax = value;
maxkeys.clear();
maxkeys.add(entry.getKey());
}else if (value == curMax) {
maxkeys.add(entry.getKey());
}
}
return maxkeys.stream().mapToInt(Integer::intValue).toArray();
}
public void dg(TreeNode root) {
if(root == null) {
return;
}
dg(root.left);
if(root != null) {
if(map.get(root.val) == null)
map.put(root.val,0);
map.put(root.val,map.get(root.val) + 1);
}
dg(root.right);
}
}
Jvm笔记
- String不在用char【】来存储了,改用byte【】加上编码标记
- String代表不可变的字符序列
- 字符串常量池是不会存储相同内容的字符串的。因为String的String Pool是一个固定大小的Hashtable
- 字符串都保存在堆中
商城项目遇到的问题
问题一
自己在本地创建了数据库,在运行后端读取数据库内容时,总是报连接错误的问题。每次尝试数据库连接时,测试连接mysql是没问题的。之后又去linux下的mysql查看数据库内容,发现是空的,原来数据库建错了地方。。。
问题二
renren-fast中mysql在linux下区分大小写,需要把qrtz前缀的表改成大写
问题三
建议node.js采用14版本以上的,不然安装会出现一些兼容的问题(我上来用的12的版本,问题很多,非常不建议)
昨日八股答案
- MySQl的关键字in和exist
二者都是用来处理子查询的关键字
In关键字:用于检查左边的表达式是否存在于右边的列表或子查询的结果集中。
例如
select * from customers
where country in ("china","france");
Exists关键字:用于判断子查询是否至少能返回一行数据。
性能上:当子查询的表很大时,exists的性能优于in。exists一旦找到匹配项就会立即停止查询,而in会扫描整个子查询结果集
NULL值处理:in能够正确处理子查询中包含null值的情况,而exist不受子查询结果值中NULL的影响
- mysql的基本函数
字符串函数:
concat(str1,str2):连接多个字符串,返回一个合并的字符串
Length(str):返回字符串的长度
substring(str,pos,len):从指定位置开始,截取指定长度的子字符串
replace(str,from_str,to_str):将字符串中的某部分替换为另一个字符串
数值函数:
abs(num):返回数字的绝对值
power(num,number):返回指定数字的指定幂次方
日期和时间函数
now():返回当前时间函数
curdate():返回当前日期
聚合函数:
count(column):计算指定列中的非NULL的个数
sum(column):计算指定列的总和
avg(column):计算平均值
max、min(column):返回最大、最小值
- SQL查询语句的执行顺序
所有的查询语句都是从FROM开始执行,在执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入,最后一个步骤产生的虚拟表即为输出结果。
(9) SELECT
(10) DISTINCT <column>,
(6) AGG_FUNC <column> or <expression>, ...
(1) FROM <left_table>
(3) <join_type>JOIN<right_table>
(2) ON<join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(7) WITH {CUBE|ROLLUP}
(8) HAVING <having_condtion>
(11) ORDER BY <order_by_list>
(12) LIMIT <limit_number>;
- 如何用MySQL实现一个可重入的锁
创建一个保存锁记录的表(最重要的字段是存储锁的重入次数)。
加锁:
1 开启事务 2 执行查询语句,如果记录不存在,直接加锁;如果存在,增加重入次数 3 提交事务
解锁:
1 开启事务 2 执行查询语句,如果记录存在,重入次数减1;如果记录存在,重入次数小于等于0,则完全释放锁 3 提交事务
今日八股
- 执行一条SQL请求的过程
- mysql的引擎
- 索引的理解
- MySQL聚簇索引和非聚簇索引的区别