Java,八股,cv,算法——双非研0四修之路day22

目录

 昨日总结

今日计划

算法——有效的括号

算法——删除字符串中所有相邻重复项

Jvm笔记

昨日八股答案 

今日八股


 昨日总结

  • JVM课程学习,完成点评实战篇
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(5/6)
  • 代码随想录——有效的括号,删除字符串中所有相邻重复项

今日计划

  • redis高级篇(分布式缓存),JVM课程学习
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(6/6)
  • 代码随想录——逆波兰表达式,滑动窗口最大值

算法——有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 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的比较
  • 介绍一下线程池工作的原理及其用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值