Java,八股,cv,算法——双非研0四修之路day22
目录
昨日总结
今日计划
算法——有效的括号
算法——删除字符串中所有相邻重复项
Jvm笔记
昨日八股答案
今日八股
昨日总结
- JVM课程学习,完成点评实战篇
- cv(停滞中)
- 背诵小林coding--Java并发面试篇(5/6)
- 代码随想录——有效的括号,删除字符串中所有相邻重复项
今日计划
- redis高级篇(分布式缓存),JVM课程学习
- cv(停滞中)
- 背诵小林coding--Java并发面试篇(6/6)
- 代码随想录——逆波兰表达式,滑动窗口最大值
算法——有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
class Solution {//本题也可以拿map集合来做,将对应括号分别设置为key和value,通过遍历字符串和栈定元素进行判断//创建一个栈public boolean isValid(String s) {int len = s.length(); if(len % 2 != 0) {return false;}Deque<Character> stack = new LinkedList<Character>();for(char index : s.toCharArray()) {if(index == '(' || index == '[' || index == '{') {stack.push(index);}else{//栈为空,无法匹配右括号if (stack.isEmpty()) return false; char top = stack.pop();//注意出栈的括号方向的左右问题if(index == ')' && top != '(' || index == ']' && top != '[' || index == '}' && top != '{')return false;}}return stack.isEmpty();}
}
算法——删除字符串中所有相邻重复项
给出由小写字母组成的字符串 s
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 s
上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
class Solution {public String removeDuplicates(String s) {Deque<Character> stack = new LinkedList<Character>();for(char index : s.toCharArray()) {if(stack.isEmpty() || !stack.isEmpty() && stack.peek() != index)stack.push(index);else{stack.pop();}}StringBuilder str = new StringBuilder();while(!stack.isEmpty()) {str.append(stack.pop());}return str.reverse().toString();}
}
Jvm笔记
- 类加载器是将字节码文件加载到JVM中,并对这些字节码进行连接和初始化操作。
- 加载器的种类有大概三四个。主要的是启动类加载器(顶层加载器),扩展类加载器,自定义类加载器,应用类加载器。
- Java中的加载器采用了双亲委派模式,就是底层的加载器不会自己去主动加载请求,而是把这个请求委派给父类加载器,指到传送到顶层的启动类加载器。如果它反馈无法加载,就会让子加载器去加载。大白话来说就是,儿子要干什么情况要问父母。如果父母不管,在传父母的父母,直到始祖,如果他也不管,就在返回传给他的一代又一代的人。
- 双亲委派的优势:避免类的重复加载,保护程序安全,防止核心API被篡改
- CalssLoader类,他是一个抽象类,所有的类加载器都继承自classLoader(不包含启动类加载器)
昨日八股答案
-
Threadlocal作用,原理,具体里面存的key value是啥,会有什么问题,如何解决?
是用于解决线程安全问题的一种机制。通过每个线程内部变量具体独立性,从而避免了资源共享和同步带来的冲突问题。
ThreadLocal中内部维护了Entry数组。每个Entry代表着一个对象,key就是ThreadLocal本身,value是实例化的对象。当你创建一个ThreadLocal
变量时,它实际上就是一个ThreadLocal
对象的实例。每个ThreadLocal
对象都可以存储任意类型的值,这个值对每个线程来说是独立的。
但他也存在一些问题。例如当一个线程结束时,其ThreadLocalMap也会销毁。但是ThreadLocal本身如果有引用指向它,则不会被立马销毁。这时候可以回发生内存泄漏问题,
因此,实际应用中需要在使用完ThreadLocal
变量后调用remove()
方法释放资源。
-
Java中想实现一个乐观锁,都有哪些方式?
CAS操作,是乐观锁的基础。
利用时间戳作为比较的依据
-
CAS 有什么缺点?为什么不能所有的锁都是用CAS?
存在ABA问题,当发生两次修改后变回原来的值时,CAS会判定他未发生任何动作
可能存在长时间的循环判断。因为CAS的基于循环判断的,如果CAS操作一直未能成功,线程会一直自旋重试,占用CPU资源。在高并发情况下,会到导致CPU资源的浪费
今日八股
- Voliatle关键字的作用,可以保证线程安全吗
- Voliatle与Synchronized的比较
- 介绍一下线程池工作的原理及其用法