欧科云链 Java一面
创始人
2024-04-07 13:27:40
0

目录

  • 1.Java的常用数据结构
  • 2.Set和Map数据结构
  • 3.线程安全的Map
  • 4.current包下的其他类
  • 5.Java的多态
  • 6.final关键字
  • 7.基本数据类型
  • 8.Java创建线程的方式
  • 9.线程池的介绍
  • 10.异常类
  • 11.try catch finally执行顺序
  • 12.JVM的内存结构
  • 13.GC回收算法
  • 14.JVM参数
  • 15.类加载器
  • 16.TCP模型、流量控制、拥塞控制
  • 17.Linux中查询内存使用情况语句
  • 18.进程间通信、死锁、内存管理
  • 19.事务的ACID四大特性
  • 20.事务的隔离级别
  • 21.脏读和幻读的含义及如何避免
  • 22.数据库索引的优缺点,什么情况下索引会失效
  • 23.关联查询关键字
  • 24.数据库的锁
  • 25.Java中的锁 synchronized关键字、锁升级
  • 26.spring的IOC和AOP
  • 27.实现一个业务
  • 28.ThreadLocal发生内存泄漏的原因,线程结束之后是怎么样的
  • 29.AOP相关注解
  • 30.Spring中涉及到的设计模式
  • 31.Spring中Bean的作用范围 单例多例
  • 32.Spring中依赖的注入
  • 33.Redis的使用场景、基本数据结构

1.Java的常用数据结构

在这里插入图片描述

2.Set和Map数据结构

存储结构、使用场景、和List的区别,HashMap的key的hashcode值相同就会覆盖原来的value吗
在这里插入图片描述
什么场景下使用list,set,map呢

  • 如果你经常会使用索引来对容器中的元素进行访问,那么List是你的正确的选择。如果你已经知道索引了的话,那么List的实现类比如ArrayList可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
  • 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是List,因为List是一个有序容器,它按照插入顺序进行存储。
  • 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个Set的实现类,比如 HashSet、LinkedHashSet或者TreeSet。所有Set的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性:比如TreeSet还是一个SortedSet,所有存储于TreeSet中的元素可以使用Java里的Comparator或者Comparable进行排序。LinkedHashSet也按照元素的插入顺序对它们进行存储。
  • 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。

HashMap的key的hashcode值相同就会覆盖原来的value吗

如果key相同,但是hashcode不同,那么value不会被覆盖
如果key相同,并且hashCode相同,那么value会被覆盖
比如Aa和BBhashcode相等,但equals不相等,不会覆盖

3.线程安全的Map

1、HashTable
2、SynchronizedMap
3、ConcurrentHashMap - 推荐
https://donglin.blog.csdn.net/article/details/127834133

4.current包下的其他类

1.Callable
2.Semaphore
3.ReentrantLock与Condition
4.BlockingQueue
5.CountDownLatch
6.CyclicBarrier

5.Java的多态

多态性是指允许不同子类型的对象对同一消息作出不同的响应。
1.要有继承关系
2.子类要重写父类的方法
3.父类引用指向子类对,

6.final关键字

  1. final可以用来修饰的结构:类、方法、变量

  2. final 用来修饰一个类:此类不能被其他类所继承。
    比如:String类、System类、StringBuffer类

  3. final 用来修饰方法:表明此方法不可以被重写
    比如:Object类中getClass();

  4. final 用来修饰变量:此时的"变量"就称为是一个常量
    4.1 final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化
    4.2 final修饰局部变量:
    尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
    static final 用来修饰属性:全局常量

7.基本数据类型

在Java中,数据类型分为引用类型和基本类型,基本类型分为八种
整型byte,short,int,long
浮点型:float,double
字符型:char
Boolean型:boolean
String不是基本的数据类型,是final修饰的java类,是引用类型。

8.Java创建线程的方式

1.Thread类创建线程类
2.Runnable接口创建线程类
3.Callable创建线程类
4.线程池创建线程类
runnable接口和callable接口除了返回结果之外其他的区别?
(1)是否有返回值 callable有
(2)是否抛异常 callable有
(3)落地方法不一样,一个是run,一个是call

9.线程池的介绍

7大参数,4个拒绝策略
1、corePoolSize:线程池中的常驻核心线程数
2、maximumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于1
3、keepAliveTime:多余的空闲线程的存活时间,当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止
4、unit:keepAliveTime的单位
5、workQueue:任务队列,被提交但尚未被执行的任务
6、threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认的即可
7、handler:拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略
拒绝策略都有哪些?
1.AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行
2.CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
3.DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中尝试再次提交当前任务。
4.DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略。

10.异常类

在这里插入图片描述
异常处理方式
方式一:try-catch-finally
方式二:throws+异常类型

狼来了
try-catch-finally相当于我能解决狼
throws自己搞不定,就喊人

11.try catch finally执行顺序

先执行try,如果有异常进入catch ,最终进入finally
没有异常,先执行try,再进入finally
仅仅在下面4中情况下不会执行finally语句 :
①.如果在try 或catch语句中执行了System.exit(0)。
②.在执行finally之前jvm崩溃了。
③.try语句中执行死循环。
④.电源断电。

public static int demo5() {try {return printX();}finally {System.out.println("finally trumps return... sort of");}}public static int printX() {System.out.println("X");return 0;}

输出结果:

X
finally trumps return... sort of
0

12.JVM的内存结构

在这里插入图片描述
存储的内容,程序计数器存储的数值是什么?
PC寄存器存储字节码指令地址
因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

13.GC回收算法

https://donglin.blog.csdn.net/article/details/127831153

14.JVM参数

在这里插入图片描述

15.类加载器

ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。
在这里插入图片描述
类的加载器有哪些
在这里插入图片描述

16.TCP模型、流量控制、拥塞控制

17.Linux中查询内存使用情况语句

查看内存使用情况:free
显示进程信息(包括CPU、内存使用等信息):top、ps
查看驱动占用内存:lsmod

18.进程间通信、死锁、内存管理

待更新

19.事务的ACID四大特性

ACID
原子性(atomicity)
原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。
一致性(consistency)
根据定义,一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 。这种状态是 语义上 的而不是语法上的,跟具体的业务有关。
在这里插入图片描述
隔离型(isolation)
事务的隔离性是指一个事务的执行 不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
在这里插入图片描述
持久性(durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。
持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。

20.事务的隔离级别

1.读未提交
2.读已提交
3.可重复读
4.序列化
侧重于RR和RC来解释
在这里插入图片描述
在这里插入图片描述
读未提交之脏读
对于两个事务 Session A、Session B,**Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。**之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效的
在这里插入图片描述

读已提交之不可重复读
在事务2中commit,事务1没有commit读到了事务2提交的数据(不可重复读)
在这里插入图片描述
可重复读
不可重复读和脏读都没有问题
在这里插入图片描述
可重复读出现幻读的现象
在这里插入图片描述

21.脏读和幻读的含义及如何避免

脏读
解决办法:把数据库的事务隔离级别调整到READ_COMMITTED(读提交/不可重复读)
幻读
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ(序列化执行),或者数据库使用者自己进行加锁来保证。

22.数据库索引的优缺点,什么情况下索引会失效

全值匹配我最爱
全职匹配我最爱指的是,查询的字段按照顺序在索引中都可以匹配到!
最佳左前缀法则
过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
计算、函数导致索引失效
范围条件右边的列索引失效
建议:将可能做范围查询的字段的索引顺序放在最后
不等于(!= 或者<>)索引失效
is not null无法使用索引,is null可使用索引
like以通配符%开头索引失效
类型转换导致索引失效

23.关联查询关键字

inner join、left join、right join
怎么避免笛卡尔积,判断条件用哪个关键字
where

24.数据库的锁

从数据操作的粒度划分:表级锁、页级锁、行锁
InnoDB 中的行锁的实现依赖于索引,一旦某个加锁操作没有使用到索引,那么该锁就会退化为表锁。
记录锁存在于包括主键索引在内的唯一索引中,锁定单条索引记录。
间隙锁存在于非唯一索引中,锁定开区间范围内的一段间隔,它是基于临键锁实现的。
临键锁存在于非唯一索引中,该类型的每条记录的索引上都存在这种锁,它是一种特殊的间隙锁,锁定一段左开右闭的索引区间。
在这里插入图片描述
在这里插入图片描述
从对待锁的态度划分:乐观锁、悲观锁

  • 乐观锁
  1. 乐观锁的版本号机制
    … SET version=version+1 WHERE version=version
  2. 乐观锁的时间戳机制
    时间戳和版本号机制一样,也是在更新提交的时候,将当前数据的时间戳和更新之前取得的时间戳进行比较,如果两者一致则更新成功,否则就是版本冲突
  • 悲观锁
    1.悲观锁是一种思想,顾名思义,就是很悲观,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。
    2.悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 阻塞 直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,当其他线程想要访问数据时,都需要阻塞挂起。Java中 synchronized 和ReentrantLock 等独占锁就是悲观锁思想的实现。

乐观锁 适合 读操作多 的场景,相对来说写的操作比较少。它的优点在于 程序实现 , 不存在死锁
问题,不过适用场景也会相对乐观,因为它阻止不了除了程序以外的数据库操作。
悲观锁 适合 写操作多 的场景,因为写的操作具有 排它性 。采用悲观锁的方式,可以在数据库层
面阻止其他事务对该数据的操作权限,防止 读 - 写 和 写 - 写 的冲突。

25.Java中的锁 synchronized关键字、锁升级

在这里插入图片描述
synchronized用的锁是存在Java对象头里的Mark Word中,锁升级功能主要依赖MarkWord中锁标志位和释放偏向锁标志位
在这里插入图片描述

  • 偏锁
    当一段同步代码一直被同一个线程多次访问,由于只有一个线程那么该线程在后续访问时便会自动获得锁
    同一个老顾客来访,直接老规矩行方便
    看看多线程卖票,同一个线程获得体会一下

  • 轻锁
    有线程来参与锁的竞争,但是获取锁的冲突时间极短
    本质就是自旋锁

偏向锁和轻锁的区别
争夺轻量级锁失败时,自旋尝试抢占锁
轻量级锁每次退出同步块都需要释放锁,而偏向锁是在竞争发生时才释放锁
在这里插入图片描述

26.spring的IOC和AOP

待更新

27.实现一个业务

只要调用某个接口就输出日志,日志内容为接口的响应时间spring的核心业务都是基于AOP的,在刚接到请求的时候就存入ThreadLocal中(AtBefore方法完成),业务处理完成后,调用After方法再从ThreadLocal中get
待更新

28.ThreadLocal发生内存泄漏的原因,线程结束之后是怎么样的

ThreadLocal的实现原理是每一个Thread维护一个ThreadLocalMap映射表,映射表的key是ThreadLocal实例,并且使用的是ThreadLocal的弱引用 ,value是具体需要存储的Object。下面用一张图展示这些对象之间的引用关系,实心箭头表示强引用,空心箭头表示弱引用。

注意:内存泄漏
弱引用,只要发生gc就会回收,但是会出现一个问题
1.ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。
2.当然,如果当前thread运行结束,threadLocal,threadLocalMap,Entry没有引用链可达,在垃圾回收的时候都会被系统进行回收。
3 但在实际使用中 我们有时候会用线程池 去维护我们的线程,比如在Executors.newFixedThreadPool()时创建线程的时候,为了复用线程是不会结束的,所以threadLocal内存泄漏就值得我们小心
在这里插入图片描述
set、get、remove方法会去检查所有键为null的Entry对象

29.AOP相关注解

待更新

30.Spring中涉及到的设计模式

待更新

31.Spring中Bean的作用范围 单例多例

待更新

32.Spring中依赖的注入

待更新

33.Redis的使用场景、基本数据结构

  • String
    比如抖音无限点赞某个视频或者商品,点一下加一次
  • Hash
    JD购物车早期 设计目前不再采用,当前小中厂可用
  • List
    微信公众号订阅的消息
    商品评论列表
  • Set
    微信抽奖小程序
    微信朋友圈点赞
    QQ内推可能认识的人
  • Zset
    抖音热搜
    根据商品销售对商品进行排序显示

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...