零散的面试题

1.java常见的引用类型

:普通的变量引用

:内存够时,GC不会主动删除,内存不够时,GC会删除

:一旦执行GC就会被删除

:用了感觉没用


2.JDK1.8新特性

  1. lambda表达式(极大简化了匿名内部类的创建,促进函数式编程的风格)
  2. 函数式接口(只能有一个抽象方法的接口 )
  3. 日期时间的新API(LocalDate,LocalTime,LocalDateTime等)
  4. StreamAPI(提供了一种声明式、高效且易于并行化的集合数据处理方式 )
  5. Optional类(处理Null值,防止空指针异常)
  6. 方法引用(更为简洁的lambda表达式,可以直接引用现有方法和构造函数 )
  7. 接口的默认方法和静态方法(可以包含默认方法,允许在接口中提供方法的具体实现,而无需强制实现类去覆盖它 ; 可以包含静态方法,增强接口的功能性)

3.JAVA异常

1.运行时异常(Running Exception)在程序中可以不进行显示处理的异常(ArithmeticException[运算异常] ClassCastException[类型转换异常] IndexOutOfBoundsException[下标越界异常] NullPointerException[空指针异常] IllegalArgumentException[非法参数异常] )

2.检查时异常(Checked Exception)必须显示处理,不然程序不允许代码编译运行.(FileNotFoundException [文件未找到异常]  MalformedURLException[错误的URL异常]  IOException [I/O异常]  SQLException [Sql异常])

3.错误(Error) 系统级别的错误,程序无法处理,会立刻停止运行(OutOfMemoryError[堆空间溢出] StackOverflowError[栈空间溢出])


4.双亲委派

1.启动类加载器(Bootstrap ClassLoader):即根类加载器,负责加载Java虚拟机核心类库,如java.lang.Object等。

2.扩展类加载器(Ext ClassLoader):加载Java扩展类库,如javax或java.util等。

3.应用程序类加载器(Application Class Loader):即系统类加载器,负责搜索应用程序的类路径并加载。

4.自定义类加载器:开发人员可以根据需要实现的类加载器。

 为什么需要双亲委派?

避免类的重复加载 ; 保证安全性(例如java.lang.String,这个类只会加载根类加载器的,避免被覆写)


5.深拷贝浅拷贝?

浅拷贝:对象属性(包含String),复制地址指针;非对象属性复制值。

深拷贝:对象属性直接new一个新的对象。(复制的对象是完全独立的)


  6.设计模式——单例模式?

饿汉式:始终用这一个对象,提前实例化一个对象,不论是否用(会占用空间)

懒汉式:通过DCL(双重检验),只有在需要时才会实例化一个对象,最好加上volatile。(DCL:两次判定,第一次非空判定是否加锁(Synchronization),第二次非空判定是否创建对象,防止其他线程多次创建对象)。


7.详细解释一下Volatile?

保证多线程可见性,确保其他线程操作的数据永远是最新的(极端情况下:当数据已经放入寄存器中,那么其操作的数据就是错误的),极端情况下无法保证原子性。

禁止指令重排,避免在对象未实例化数据便将地址传给其他线程。


8.有没有用过存储过程?

了解存储过程,他是数据库预编译的SQL代码段,能够进行复杂的运算或数据库操作,进行返回值甚至返回结果集。但我们实际是禁止使用的,因为让数据库进行运算之类的会大大增加的压力,我们让Redis做缓存从,使用K8S,Nginx等都是为了减轻数据库压力,所以是禁止使用存储过程的,这和我们开发的目的相悖的。


9.ComparableComparator区别?

  • 类包不同:java.lang.Comparable   java.util.Comparator
  • 比较逻辑不同: Comparable是内部比较器  Comparator是外部比较器
  • 排序规则数量不同:Comparable唯一字段排序   Comparator可以多个字段排序
  • 排序方法不同: Comparable实现ComparaTo(T t)  Comparator实现Compara(T t1,T t2)
  • Collections.sort()中使用不同:一个参数默认是Comparable排序; 如果要用Comparator,则还需传一个Comparator外部排序

10.JWT身份认证?

JWT的优势有哪些?

无状态:JWT本身包含身份验证的所有信息,所以我们服务器不需要储存Session。减轻服务器压力,增加可拓展性

避免CSRF攻击(跨站请求伪造):CSRF攻击需要依赖Cookie,但JWT身份验证不需要Cookie,所以避免了CSRF攻击。(我们也通过创建一个XSS过滤器,来过滤请求中存在XSS攻击风险的可疑字符串)

适合移动端:使用Session验证需要将Cookie存在服务端,而JWT则是存储在客户端就可以使用,而且还能够跨语言

单点登录友好:JWT会保存在客户端,适合用于单点登录,也不会出现Cookie常见的跨域问题

为什么使用双Token?如何实现?

为了提高系统的安全性和稳定性,双Token的实现避免了JWT的不可控问题(即注销等情况下JWT依然可用)和JWT的续签问题。

用户登录时前端传账户和密码 ——→ 后端验证并生成 访问令牌Access Token(短Token)和 刷新令牌Refresh Token(长Token) 并储存在客户端pinia中 ——→在访问受保护的资源时会在header中携带Access Token并进行验证,在短Token过期时会去访问验证Refresh Token,如果未过期则生成一个新的Access Token和Refresh Token存储在Pinia并重新进行请求原接口


11.谈一下你对高并发的理解应对方式

高并发就是指系统在短时间内应对大量访问的能力,是衡量系统稳定性的重要评估,像电商类的活动时,就需要要求系统有应对高并发能力。

①读写分离 ②Spring Cloud Sentinel [哨兵] ③K8S 部署应用 [可以动态扩展副本] ④用nginx作负载均衡 ⑤Redis作缓存层 ⑥mysql数据库用集群 ⑦Lua脚本减少对数据库的请求


12.什么是线程死锁?死锁如何产生?如何避免线程死锁

假设线程 A 持有资源 X,并等待资源 Y,而线程 B 持有资源 Y,并等待资源 X,这时候就会出现死锁。 (线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。)

如何产生?

1. 互斥条件:一个资源一次只能被一个线程持有,如果其他线程想要获取该资源,就必须等待该线程释放该资源。

2. 保持条件:一个线程请求资源时,如果已经持有了其他资源,就可以保持对这些资源的控制,直到满足所有资源的要求才释放。

3. 不剥夺条件:已经分配的资源不能被其他线程剥夺,只能由持有资源的线程释放。

4. 环路等待条件:多个线程形成一种循环等待的关系,每个线程都在等待其他线程所持有的资源,从而导致死锁的产生。

必须同时满足

如何避免

1. 尽量避免使用多个锁,尽量使用一个锁或者使用更加高级的锁,例如读写锁或者 ReentrantLock(可重入锁)。

2.减少锁的粒度 确保同步代码块的执行时间尽可能短,这样可以减少线程等待时间,从而避免死锁的产生。

3. 使用尝试锁,通过 ReentrantLock.tryLock() 方法可以尝试获取锁,如果在规定时间内获取不到锁,则放弃锁。

4. 避免嵌套锁,如果需要使用多个锁,请确保它们的获取顺序是一致的,这样可以避免死锁


 13.Synchronized原理?

Synchronized 的原理是,它会使用对象的内置锁(也称为监视器锁)来实现同步

特点:

1. 互斥性:Synchronized 保证同一时刻只有一个线程可以获取锁,并且只有该线程可以执行同步代码块中的代码。

2. 可重入性:同一个线程可以多次获取同步锁而不会被阻塞,这样可以避免死锁的发生。

3. 独占性: 如果一个线程获得了对象的锁,则其他线程必须等待该线程释放锁之后才能获取锁。

4.缺点:非公平锁 ,当锁被释放后,任何一个线程都有机会竞争得到锁,这样做的目的是提高效率,但缺点是可能产生线程饥饿现象。


 14.HashMap底层原理

Jdk1.7是头插法(发生死循环:头插法+多线程并发+HashMap扩容+链表),Jdk1.8是尾插法(解决了死循环)

1.7是数组+链表,1.8是数组+链表+红黑树(数组长度大于64节点到8个开启红黑树,节点低于6个关闭红黑树转为链表)


 15.ThreadLocal 是什么?有哪些使用场景?

线程级别的存储工具,是一个线程本地变量,它可以为每一个线程都创建一个私有的变量,每个线程只能获取到自己的变量,从而避免了线程安全问题

原理:ThreadLocal的实现原理是在每个线程内部维护了一个哈希表  键是ThreadLocal实例,值是线程局部变量的副本 每个线程都可以通过 ThreadLocalMap 获取自己的变量,修改也不会影响到其他线程的变量。

ThreadLocal 的使用场景比较广泛,一般适用于以下情况:

1. 需要保存线程的上下文信息,例如 用户信息,通过token解析出来的用户id等

2. 需要对线程的局部变量进行隔离,避免线程安全问题; LocalDate LocalDateTime

3. 需要在跨类跨方法使用同一个变量,同时又不希望使用全局变量的情况;

4. 需要避免传递参数的繁琐,例如在 Spring 框架中使用的事务管理


 16.Bean的生命周期

1.实例化:当容器启动时,根据配置文件和注解等方式创建Bean对象的实例,放入容器管理

2.属性赋值:容器在创建Bean实例后,会对其进行属性注入,如构造函数注入,setter方法注入,自动注入等实现

3.初始化:在Bean实例全部属性赋值完成后,容器会回调其初始化方法如init()方法

4.使用:在Bean实例初始化后,可以通过容器获取Bean对象并使用

5.销毁:当容器关闭后,会回调Bean的销毁方法,如destory()方法


  17.线程池从创建到销毁中间经历了以下几个状态:

1. 初始状态:线程池被创建时,里面并没有任何线程。此时线程池的状态为初始状态。

2. 运行状态:当向线程池中提交任务后,线程池中的线程开始执行任务,此时线程池的状态为运行状态。

3. 阻塞状态:当线程池中的任务队列已满,无法再接受新的任务时,线程池会进入阻塞状态,等待任务队列中的任务被执行完毕后再接受新的任务。

4. 关闭状态:当调用线程池的shutdown()方法时,线程池会进入关闭状态,此时线程池不再接受新的任务,但会执行任务队列中的任务。

5. 停止状态:当调用线程池的shutdownNow()方法时,线程池会进入停止状态,此时线程池不再接受新的任务,并且会中断正在执行的任务。

6. 终止状态:当线程池中所有的任务都执行完毕后,线程池会进入终止状态,此时线程池中不再有任何线程。


 18.sleep()方法和wait()方法的异同点?

相同:sleep()方法和wait()方法都是使当前线程进入休眠状态。

不同:

所属类不同:sleep()方法属于Thread类的静态方法,而wait()方法属于Object类

唤醒方式不同:sleep()方法只能根据设定的睡眠时间自动唤醒;wait()可以不设定睡眠时间,就是永久睡眠,需要notify()方法或者notifyAll()方法进行唤醒

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nexus安卓木马分析报告

概述 2023年3月21日晚上,链安与中睿天下联合研发的监控系统检测到一种新型安卓木马。在经过睿士沙箱系统捕获样本之后,发现该安卓木马极有可能是原安卓网银盗号木马SOVA的变种。与此同时,意大利安全公司Cleafy发布了一篇题为《Nexus&#xf…

一款Wordpress网站导航主题,带昼夜切换功能

Wordpress网站导航主题,带昼夜切换功能。 基于wordpress,部署和使用都比较方便。 界面比较简洁大方。后台管理功能也比较全面,值得一试。 这款主题界面、功能都非常简洁。 作者把这款定位为简约导航主题,所以这款wordpress导航…

飞书API 2-1:如何通过 API 创建文件夹?

本文探讨如何通过飞书的 API 来创建文件夹。通过 API 创建的文件夹,一般是放在共享空间,如果要放在个人空间,建议手动创建。 查看 API 文档 API 路径,可在飞书开放平台的服务端 API,依次查找云文档>云空间>文件…

MavenPlus插件的基础功能完善

本次更新主要是在初版的searchEverywhere的基础上增加了pom.xml文件编辑器,目前的界面布局如下,进行适当说明: 打开pom文件后,你会得到如上图所示的布局页面,数据会同步显示 如果有冲突信息,则会以红色显示…

【Android面试八股文】你刚刚提到了V2签名使用美团的Walle实现多渠道打包,那么你能讲一讲Android 签名的 v1、v2、v3、v4版本的区别吗?

文章目录 前言一、简介二、APK 签名方案 v1 (JAR签名)2.1. 签名过程2.2 验证过程2.3 详细例子2.4 优缺点2.5 美团基于V1版本的多渠道打包方案三、APK 签名方案 v23.1 为什么要设计APK 签名方案 v2 ?3.2 APK 签名方案 v2 : 签名前和签名后的 APK3.2.1 签名前和签名后的 APK3.2…

qmt量化交易策略小白学习笔记第40期【qmt编程之期货数据--如何获取合约基础信息】

qmt编程之获取期货数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,咨询免费开通量化回测与获取实盘权限,欢迎和博主联系! 获取合约基础信息 …

Faiss:选择合适的索引Index

向量相似性搜索彻底改变了搜索领域。它允许我们高效地检索从GIF到文章等各种媒体,即使在处理十亿级别数据集时,也能在亚秒级时间内提供令人印象深刻的准确性。 然而,这种灵活性也带来了一个问题:如何知道哪种索引大小最适合我们的…

React+TS 从零开始教程(1)

源码链接:https://pan.quark.cn/s/c6fbc31dcb02 创建项目 直接通过以下命令,我们来创建一个reactts的项目。 npx create-react-app myapp --template typescript这样就创建好了,然后我们导入vscode. npx是npm里面的一个库,可以让你自动使用…

DAB-DETR

论文地址: https://arxiv.org/pdf/2201.12329 文章通过前人的经验得出,导致 DETR 训练速度慢的原因很大可能是因为 decoder 中 cross attention 这个模块,由上面的对比可以看出其与 self attention 的区别主要就在于query的不同。文章猜想两个…

【Maven】项目的Maven插件报错

1. 找到本地maven库 2. 删除本地插件 3. 在IDEA上更新pom.xml

ctfshow web七夕杯

web签到 执行命令没有回显&#xff0c;我们直接写文件就可以了 有字符长度限制 ls />a nl /*>a访问url/api/a下载文件 easy_calc <?phpif(check($code)){eval($result."$code".";");echo($result); }function check(&$code){$num1…

LVS/NAT负载均衡实操

添加规则,并做持久操作 1 添加规则 [rootlvs ~]# ipvsadm -A -t 10.36.178.183:80 -s wrr [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.201:80 -m -w 3 [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.202:80 -m -w 1[rootlvs ~]# ipvsadm -Ln …

百度YY设计稿转代码的探索与实践

作者 | KyrieChen 导读 本文阐述了百度&YY互动团队在设计稿转代码方面的实践与沉淀&#xff0c;自研的YYF2C是Figma & AI相结合生成开发代码的一站式解决方案。文章将从遇到的痛点以及对应的方案成果来阐述&#xff0c;并介绍相对应的YYF2C功能点。 全文7217字&#xf…

我的创作纪念日--码农阿豪

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

OpenCV读取图片

import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 cv.namedWindow(image, cv.WINDOW_NORMAL) #显示图像后&#xff0c;允许用户随意调整窗口大小 # 显示图像 cv.imshow(image, image) cv.waitKey(0)import cv2 as cv srccv.imread(…

KVB交易平台:国内三大交易所(上海、深圳、北京)的概要与分析

概述&#xff1a; 上海证券交易所&#xff08;上交所&#xff09;、深圳证券交易所&#xff08;深交所&#xff09;和北京证券交易所&#xff08;北交所&#xff09;是中国大陆三大主要证券交易所。以下是对这三个交易所的比较分析&#xff1a; 一、基本概况 1. 上海证券交易所…

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2&#xff0c;也就是一张图片被分割成四份 height, wi…

RapidLayout:中英文版面分析推理库

引言 继上一篇文章之后&#xff0c;我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中&#xff0c;便于大家快速使用。 不曾想到&#xff0c;我这整理工作越做越多了&#xff0c;好在整体都是往更好方向走。 起初&#xff0c;rapid_layout项目是在RapidStru…

番外篇 | 基于改进YOLOv5的安全帽佩戴检测 | 重参数化结构RepVGG + 空间对象注意力机制RCS-OSA模块

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文针对安全帽佩戴的检测就是基于RC…

Python - 各种计算器合集【附源码】

计算器合集 一&#xff1a;极简版计算器二&#xff1a;简易版计算器三&#xff1a;不简易的计算器四&#xff1a;还可以计算器 一&#xff1a;极简版计算器 运行效果&#xff1a; import tkinter as tk import tkinter.messagebox win tk.Tk() win.title("计算器")…