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

目录

昨日总结

今日计划

算法——二叉树的所有路径

算法——左叶子之和

JVM

昨日八股答案 

今日八股

总结


昨日总结

  • JVM底层原理学习,完成对mysql基础篇的快速复习
  • cv(停滞中)
  • 小林coding--Java虚拟机面试篇(5/5)
  • 代码随想录——二叉树的所有路径,左叶子之和

今日计划

  • JVM底层原理学习,学习mysql进阶篇
  • cv(停滞中)
  • 小林coding--Spring面试篇(1/7)
  • 代码随想录——找左下下角的值,路径总和

算法——二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 

示例 :

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
/**
 * 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 {

    public void dg(TreeNode node, List<String> list,String str) {
        if(node == null) {
            return;
        }
        if(node.left != null || node.right != null )
        str += "-" + ">" + String.valueOf(node.val);
        if(node.left == null && node.right == null) {
            str += "-" + ">" + String.valueOf(node.val);
            list.add(str);
        }
        dg(node.left,list,str);
        dg(node.right,list,str);
    }

    public List<String> binaryTreePaths(TreeNode root) {
        List<String> list = new ArrayList<>();
        String str = String.valueOf(root.val);
        if(root.left == null && root.right == null) {
            list.add(str);
            return list;
        }
        dg(root.left,list,str);
        dg(root.right,list,str);
        return list;
    }
}

算法——左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0
/**
 * 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 {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) return 0;
        int leftValue = sumOfLeftLeaves(root.left);   
        int rightValue = sumOfLeftLeaves(root.right);  
                                                       
        int midValue = 0;
        if (root.left != null && root.left.left == null && root.left.right == null) { 
            midValue = root.left.val;
        }
        int sum = midValue + leftValue + rightValue; 
        return sum;
    }
}

JVM

  • JVM中的java对象可以划分为两类,一类是生命周期较短,一类是非常长
  • 几乎所有的java对象都是在Eden区被new出来的,绝大部分的java对象的销毁都在新生代进行
  • 内存分配算法和内存回收算法是密切相关的
  • 对象分配的过程,如下
  • Eden区满的时候才会触发YGC/Minor GC,Survivor区满的时候不会触发
  • 因为java对象大多都具备朝生夕灭的特性,所有Minor GC非常频繁,一般回收速度也比较快
  • Minor GC会引发STW,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行
  • 针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to;
  • 关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间 收集。
  • 垃圾回收机制流程图如下
  • JVM在GC时,并非每次都对新生代、老年代和方法区区域一起回收,大部分回收的都是新生代
  • Minor GC,Major GC,FUll GC 三者
  • 内存对象分配的策略,如下
  • TLAB(对象分配过程):对Eden区域继续进行划分,JVM为每个线程分配一个私有的缓存区域,在Eden空间内。当多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,被称为快速分配策略。其流程图如下

    昨日八股答案 

    • GC只会对堆进行GC吗

    GC不仅仅只对堆进行垃圾回收,他还会对方法区进行垃圾回收。

    大部分的垃圾回收工作都发生在堆上,因为大多数的对象都被分配在了堆上,因此,垃圾回收通常回收堆中不在被引用的对象

    方法区中用于存储类信息、常量等数据的区域。虽然方法区中的垃圾回收与堆不同,但是同样存在对无用信息的清理。

    • 什么情况下使用CMS,什么情况使用G1

    CMS适用于主要针对停顿时间要求敏感且针对老年代回收

    G1适用于需要管理大内存堆的场景

    • minorGC、majorGC、fullGC的区别,什么场景触发full GC

    Minor GC(Young GC):指针对年轻代进行回收,包括Eden区和两个survivor区。当Eden区空间不足时,JVM会出发一次Minor GC,将Eden区和一个Survivor区中的存活对象移动到另一个Survivor区或老年代

    Major GC:主要针对老年代进行回收,但不一定只回收老年代。当老年代空间不足时,会触发。

    Full GC:对整个堆内存进行回收。当元空间或永久代空间不足时或进行YGC时,OGC也满时,会触发。

    今日八股

    • 谈谈对Spring的理解
    • Spring IOC 和AOP的理解
    • IOC和AOP是通过什么机制来实现的
    • 依赖注入的了解

    总结

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值