这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)

news2025/4/12 9:01:59

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇将记录几次面试中经常被问到的知识点以及对学习的知识点总结和面试题的复盘。
本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

🎁如果大佬在准备面试,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

文章目录

  • 进程和线程的区别
  • 并行和并发的区别
  • sleep()和wait()区别
  • 操作系统的线程
    • 用户级线程
    • 内核级线程
    • 混合级线程
  • final,finally,finalize
  • 可中断锁与不可中断锁
  • 排他锁与共享锁
  • 二叉树的最近公共祖先

进程和线程的区别

操作系统启动一个程序的时候,会为这个程序创建一个进程。一个进程可以创建多个线程,一个线程只属于一个进程。
进程是操作系统分配资源的最小单位,而线程是CPU调度的最小单位。一个进程中的多个线程拥有各自的局部变量,线程堆栈和程序计数器,但是能够访问同一进程的共享资源。
进程和进程之间是相互独立的,但是同一个进程之间的线程并不是完全独立的,它们可以共享进程中的堆内存,方法区内存和系统资源。
一个进程发生异常不会对其他进程产生影响,但是一个线程发生异常可能会对所在进程中的其他线程产生影响。
进程之间的上下文切换要比线程之间的上下文切换慢得多。
在这里插入图片描述

并行和并发的区别

并行是指多个线程在同一时刻同时运行,并发是指在同一时间段内同时运行(宏观上是同时运行,微观上是不同时运行的)。
并行是指在多核CPU下,一个CPU核心执行一个线程的时候,另一个CPU同时执行另一个线程,各个线程之间不会争夺CPU资源;而并发是指在一段时间内CPU执行了多个线程,CPU会根据时间片周期在线程之间来回切换,这些线程会争夺CPU的资源,因此在同一时刻不是同时运行的。
并行只有在多个或多核CPU下才会发生,在单核CPU下只能发生串行或并发现象。

在这里插入图片描述

sleep()和wait()区别

sleep()是Thread类中的方法,而wait()是Object中的方法。
调用sleep()方法时,线程不会释放对象锁,而是进入休眠状态,其他的线程无法拿到锁资源;而调用wait()方法,线程会释放对象锁资源,进入线程等待池中等待,为其他线程让出锁资源,其他线程可使用方法或代码块,当其他线程调用notify()或notifyAll()方法时,唤醒等待池中的线程或所有线程,就会进入就绪队列中,等待操作系统分配资源。
sleep()方法不需要强制和synchronized锁一起使用,而wait()和notify(),notifyAll()方法需要和synchronized锁一起使用,wait()和notify(),notifyAll()方法需要放在方法或同步代码块中使用。

在这里插入图片描述

操作系统的线程

操作系统的线程分为用户级线程,内核级线程,和混合级线程。

用户级线程

操作系统空间有用户空间和内核空间。对于用户级线程,用户级线程都是在操作系统的用户空间里创建的,不依赖操作系统的内核空间。用户级线程创建的线程都是在用户空间中进行的,所以线程的运行过程中不会涉及到用户态和内核态的切换。操作系统只能感知进程的存在,不会感知线程的存在,所以一个线程阻塞,会导致整个进程都阻塞。每个用户空间中的进程都会维护一个线程表,来追踪本进程中的线程,在内核级空间中会维护一个进程表来追踪用户空间中所创建的进程。

当然,用户级线程有优点亦有缺点。

用户级线程优点:
线程的切换并不会涉及到内核态和用户态之间的切换,不会影响效率;
用户级线程允许每个进程拥有自己的调度算法
缺点:
由于操作系统感知不到线程的存在,所以当一个线程发生阻塞时,即使同进程中的线程仍然在运行,操作系统也会阻塞整个进程;
用户空间中没有时钟中断机制,如果进程中的某个线程长时间没有释放CPU资源,那么其他线程就会由于得不到资源而长时间等待。

内核级线程

内核级线程的创建和管理都是在操作系统内核空间中进行的,并且操作系统内核同时维护了线程表和进程表来追踪线程和进程的执行状态。操作系统内核保存着线程的执行状态和执行的上下文,如果进程中的某个线程发生阻塞,不会阻塞整个进程,操作系统内核会调度进程中的其他线程。

内核级线程优点:
在内核级线程中,一个线程的阻塞不会导致整个进程的阻塞,操作系统内核可以调度进程中的其他线程,也可以调度其他进程中的线程,总之不会影响到进程;
操作系统内核可以将进程中的多个线程调度到不同的CPU核心上,能够大大增加线程的并行性度,从而提高程序的运行效率。
缺点:
内核级线程如果涉及到线程的阻塞和唤醒,可能会导致用户态和核心态之间的切换,影响程序的执行效率;
内核级线程比较慢,因为内核级线程的创建和管理都需要操作系统内核来实现。

混合级线程

混合级线程是用户级线程和内核级线程的相结合,混合级线程在用户空间中维护了线程表来追踪当前的线程,在内核空间中维护了线程表和进程表来追踪线程和进程的执行状态。并且在混合级线程中,操作系统只能感知到由操作系统内核创建的线程以及用户空间的线程基于内核空间的线程执行。由于用户空间的线程是基于内核空间的线程执行的,所以用户空间的线程数据间接决定了新建的内核空间的线程数量。

补充:我们调用Thread类中的start()方法创建Java线程,Java线程会和内核线程一一对应,每创建一个Java线程,就会在操作系统中创建一个对应的内核线程,而内核线程会被调度到CPU上执行。

在这里插入图片描述

final,finally,finalize

final为修饰符,可以用来修饰类,修饰方法,修饰变量。被final关键字修饰的类不能被继承,被final修饰的方法不能被其他类重写,被final修饰符修饰的变量为常量,并且必须被初始化,初始化之后该值不能被修改。

而对于finally,finally与try{ },catch{ },finally{ }共同使用。如果在try{ }代码块中出现异常,在catch{ }中会捕捉到异常,而finally{ }无论什么情况下,只要加了finally{ },就一定会执行finally{ }中的代码。如果使用了try{},则必须要有catch{}或finally{}其中的一个。如果三个模块同时存在,并且catch{}模块中有return方法时,当try{}抛出异常,那么会等finally{}模块里的方法执行完毕,再执行catch{}中的return返回结果。

finalize()是Object类中的方法,在无用的对象被垃圾回收器回收时触发。
在这里插入图片描述

可中断锁与不可中断锁

可中断锁是指在多线程情况下可以被中断的锁,前面介绍的ReentranLock锁就是可中断锁。可以使用lockInterruptibly()可中断模式抢占锁方法,具体是通过Thread类中的interrupt()方法发出中断信号来使当前抢占锁的过程被中断;也可以使用 tryLock(long time, TimeUnit unit)方法,即在指定的时间内抢占锁资源,如果当前线程抢占锁资源成功返回true,失败或超出指定时间没有抢到锁资源会返回false,被中断会抛出InterruptedException异常而终止抢占锁。两个方法都是通过Thread类的interrupt()方法发出中断信号来处理中断的。

而不可中断锁是指线程在抢占锁的过程中不能被中断,如前面提到的synchronized锁就是不可中断锁。线程在抢占不可中断锁是,如果抢占成功则执行程序代码,如果抢占失败,则线程会阻塞挂起,并且线程在阻塞挂起的过程中不可被中断。

在这里插入图片描述

排他锁与共享锁

在加锁后,在多线程情况下,同一时刻资源能够被多个线程访问的就是共享锁,只能一个线程拿到锁访问资源的锁叫做排他锁。
排它锁只能在同一时刻被一个线程获取到,排它锁也被称为独占锁,互斥锁。如果一个线程获取到了排它锁,其他线程要想再获取到相同的锁资源,会获取不到,只能阻塞等待拿到排它锁的线程释放锁后才能获取到排它锁。前面介绍的synchronized锁,ReentranLock锁,ReadWriteLock的write锁都属于排它锁。
而共享锁是指在同一时刻能够被多个线程获取到锁,但是在多个线程获取到共享锁后,只能够读取临界区的资源和数据,不能修改临界区的资源和数据。共享锁只是在读操作上是共享的。
在这里插入图片描述

二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3 解释:节点 5 和节点1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点 5 和节点
4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

思路:本题可以采用递归的形式,如果两节点位于左子树,右子树两边,则最近公共祖先一定是根结点,如果两节点都位于左边或右边,则先找到的那个节点肯定就是最近的公共祖先,如果都没有找到,那就返回空,因此找到左边的返回left,找到右边的返回right,进行判断即可。

代码+详解:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) {
            //只要当前根节点是p和q中的任意一个,就返回(因为不能比这个更深了,再深p和q中的一个就没了)
            return root;
        }
        //根节点不是p和q中的任意一个,那么就继续分别往左子树和右子树找p和q
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //p和q都没找到,那就没有
        if(left == null && right == null) {
            return null;
        }
        //左子树没有p也没有q,就返回右子树的结果
        if (left == null) {
            return right;
        }
        //右子树没有p也没有q就返回左子树的结果
        if (right == null) {
            return left;
        }
        //左右子树都找到p和q了,那就说明p和q分别在左右两个子树上,所以此时的最近公共祖先就是root
        return root;
    }
}

在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
希望能和诸佬们一起努力,今后进入到心仪的公司
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

趣说 Mysql内存篇 Buffer Pool

讲解顺序 先说 Mysql InnoDB 内存结构 Buffer PoolPage 管理机制Change BufferLog Buffer Buffer Pool 接上回 说到了 LRU 算法对内存的数据 进行淘汰 LRU 算法本身是 最近最少使用的,但是这样就会出现 分不清楚 哪些是真正多次使用的数据 LRU缺点&#xff1a…

软考重点10 知识产权

软考重点10 知识产权一、著作权1. 著作权的理解(1)版权:(2)人身权与财产权2. 知识产权的归属判定3. 知识产权的归属判定(1)委托创作(2)合作开发4. 著作权保护对象及范围5…

为什么要有包装类,顺便说一说基本数据类型、包装类、String类该如何转换?

一、前言 开门见山,首先看看八种基本数据类型对应的包装类: 基本数据类型包装类charCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDoublebooleanBoolean 其中Character 、Boolean的父类是Object,其余的父类是Number 二、装…

【软件测试】毕业打工两年,辞职一年后转行月薪18K,软件测试让我发起了第一春......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 小徐: 毕…

C++ 类和对象 日期类的实现

作者:小萌新 专栏:初阶C 作者简介:大二学生 希望能和大家一起进步 本篇博客目标: 完成Date类的实现 梳理剩下两个默认函数 好困 跑个步去 睡醒啦! 继续肝 日期类的实现本章目标一. 日期类的实现1.1 Getmonthday的实现…

CNN的实现与可视化

CNN的实现 我们已经实现了卷积层和池化层,现在来组合这些层,搭建进行手写数字识别的CNN。如下图所示,网络的构成是“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”,我们将它实现为名为SimpleConvNet的类。 …

R语言—向量

向量&#xff08;vector&#xff09; R 语言最基本的数据结构是向量。类似于数学上的集合的概念&#xff0c;由一个或多个元素构成。向量其实是用于存储数值型、字符型、或逻辑型数据的一维数组。 创建向量 c()函数 > a <- 1 #给a赋值1 > a #显示a的值 [1] 1 …

【C++初阶】类和对象终极篇

文章目录一.加const修饰this指针二.cout<<自定义类型的对象的实现1.深入理解cout和<<2流插入和流提取3.友元函数的来源a.作为ostream成员函数b.作为全局函数c.作为Date类的成员函数d.作为Date类的友元函数三.再谈构造函数之初始化列表四.隐式类型转换&explicit…

Linux命令从入门到实战----文件目录类

文章目录pwd显示当前工作路径的绝对路径ls列出目录的内容cd切换目录mkdir 创建一个新的目录删除一个空的目录touch创建新文件cp复制文件或目rm删除文件或目录mv移动文件与目录&#xff0c;重命名文件cat查看文件内容&#xff0c;创建新文件more文件内容分屏查看less分屏显示文件…

【C语言】字符串、字符数组

目录 写在开头 正文 一、字符串的本质 二、输入函数scanf和gets 三、输出函数printf和puts 四、字符串的长度——strlen 五、字符串的复制——strcpy 六、字符串的比较函数 七、实战练习 八、二维字符数组——字符串数组 写在最后 写在开头 看了标题&#xff0c;是…

Kotlin编程实战——类与对象(05)

一 概述 类与继承属性和字段接口(interface )函数式&#xff08;SAM&#xff09;接口可见性修饰符扩展数据类(data class)密封类泛型嵌套类与内部类枚举类对象表达式与对象声明类型别名内联类(inline class)委托委托属性 二 类与继承 类继承(open override )抽象类(abstract)…

MySQL去重中 distinct 和 group by 的区别

今天在写业务需要对数据库重复字段进行去重时&#xff0c;因为是去重&#xff0c;首先想到的是distinct关键字。于是一小时过去了。。。。&#xff08;菜鸟一个&#xff0c;大家轻点骂&#xff09; 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是mybatis-plus&am…

数据结构之哈希表

文章目录 一、概念二、哈希冲突三、如何解决哈希冲突&#xff1f; 1.哈希函数设计2.负载因子调节3.闭散列4.开散列&#xff08;哈希桶&#xff09;四、模拟实现哈希桶总结一、概念 顺序结构以及平衡树中&#xff0c;元素与其存储位置之间没有对应的关系&#xff0c;因此在查找一…

C++多态学习笔记

C多态学习笔记一、多态概述二、多态的作用三、多态发生的三个条件四、多态实现的原理五、接口的定义六、模板方法模式七、虚析构函数和纯虚析构函数7.1 虚析构函数7.2 纯虚析构函数八、重写重载重定义九、父类引用子类对象一、多态概述 同一个操作作用于不同的对象&#xff0c;…

2014年848数据结构真题复习

求k频度K0; for&#xff08;i1;i<n;i&#xff09; 假如是1——8&#xff0c;执行了9次&#xff0c;8次有效&#xff0c;最后一次无效for&#xff08;ji;j<n;j&#xff09;k 我的理解&#xff1a;假设n为8我们看k频度实际上就是看内圈for的有效循环次数第一轮是1——8 八次…

基础算法 第七课——归并排序

文章目录导言归并排序的概念步骤说明逐步分析STEP1STEP2STEP3STEP4STEP5STEP6STEP0总结导言 这&#xff0c;是一篇现学现卖的文章。因为&#xff0c;我根本没学过归并排序。所以&#xff0c;这篇文章&#xff0c;绝对能让您学懂归并。如果不懂&#xff0c;那我就再学一遍&…

KVM Forum 2022应该关注的话题

1. QEMU 和 KVM 自动性能基准测试 QEMU & KVM Automated Performance Benchmarking SUSE - Dario Faggioli, SUSE SUSE正在开发一个框架&#xff0c;用于对虚拟化工作负载进行自动性能基准测试。它是围绕着MMTests&#xff08;已经在Linux内核社区使用了几年&#xff09;建…

2022-Java 后端工程师面试指南 -(SSM)

前言 种一棵树最好的时间是十年前&#xff0c;其次是现在 Tips 面试指南系列&#xff0c;很多情况下不会去深挖细节&#xff0c;是小六六以被面试者的角色去回顾知识的一种方式&#xff0c;所以我默认大部分的东西&#xff0c;作为面试官的你&#xff0c;肯定是懂的。 上面的…

Mybatis之foreach

文章目录一、foreach属性二、使用foreach批量删除(法一)1.接口2.mapper文件3.测试类4.运行结果三、使用foreach批量删除(法二)1.mapper文件四、使用foreach批量插入1.接口2.mapper文件3.测试类4.运行结果一、foreach属性 collection&#xff1a;指定数组或者集合 item&#xf…

FPGA时序约束01——基本概念

前言1. 越来越多的时序问题 随着FPGA时钟频率加快与其实现的逻辑功能越来越复杂&#xff0c;开发者遇到的问题很多时候不再是代码逻辑的问题&#xff0c;而是时序问题。一些开发者可能有这样的经历&#xff0c;一个模块在100MHz时钟运行没问题&#xff0c;而将时钟频率改为150…