以下全部简单化回答(本人新手,很多都是直接百度粘贴收集得来的,如有不对请留下正确答案,谢谢)
(问题来源https://www.bilibili.com/video/BV1XL4y1t7LL/?spm_id_from=333.337.search-card.all.click&vd_source=3cf72bb393b8cc11b96c6d4bfbcbd890)
1.重写 重载的区别
重写(override): 对同名,同参数,同返回值的方法进行重写.
重载(OverLoading):同名方法,不同参数和返回值但是同名的方法进行重写,而且可以多个同名(不同参数)方法存在.
2.==和equals()的区别
==对比的是地址
equals()对比的是值
3.重写equals()的时候为什么还要重写hashcode的方法
(来源 https://blog.csdn.net/JokerLJG/article/details/119236911)
如果两个对象通过equals方法比较是相等的,那么它们的hashCode方法结果值也是相等的。
如果两个对象通过equals方法比较是不相等的,那么不要求它们的hashCode方法结果值是相等的。
当在一个应用程序执行过程中, 如果equals方法比较中没有修改任何信息,那么在同一个对象上重复调用hashCode方法时,它必须始终返回相同的值。但如果从一个应用程序到了另一个应用程序,两个应用程序汇中调用hashCode方法的返回值可以是不一致的。
4.线程的创建方式有几种
4.1继承Thread方法
4.2实现Runable接口
4.3实现Callable接口
4.4线程池
5.线程池七大核心参数
https://blog.csdn.net/lhd992692552/article/details/122467521
6.线程池的拒绝策略
AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。(默认这种)
DiscardPolicy:丢弃任务,但是不抛出异常
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) 。也就是当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务从队尾添加进去,等待执行。
CallerRunsPolicy:谁调用,谁处理。由调用线程(即提交任务给线程池的线程)处理该任务,如果线程池已经被shutdown则直接丢弃
原文链接:https://blog.csdn.net/lhd992692552/article/details/122467521
7.jvm的内存模型
8.class文件的加载过程
Loading (涉及双亲委派机制)、Linking(Linking链接的过程分3个阶段:Vertification、Preparation、Resolution。)、Initialzing(静态变量的赋值,这里才赋成初始值 ,才调用静态代码块)
9.双亲委派机制
双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级没有加载该.class文件,自己才会去加载这个.class。
双亲委派的作用
①防止加载同一个.class。通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载。保证了数据安全。
②保证核心.class不被篡改。通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。
原文链接:https://blog.csdn.net/qq_45084630/article/details/123088154
10.new String(“abc”) 创建了几个对象
如果 abc 这个字符串常量不存在,则创建两个对象,分别是 abc 这个字符串常量,以及 new String 这个实例对象。
如果 abc 这字符串常量存在,则只会创建一个对象
https://blog.csdn.net/q331464542/article/details/125201882
10.1 字符串常量池,运行时常量池,静态常量池
1.静态常量池
常量池分为两个类型,一是.class文件中静态的常量池,二是.class文件中的静态常量池被加载到JVM中而形成的运行时常量池。
1.1 静态常量池
.class文件中的常量池可以看作一个数组,数组中存储了一些常量,当需要在字节码指令中用到这个常量的时候,就通过数组的索引来访问它。
1.2 运行时常量池
理解了静态的常量池之后,运行时常量池就很容易想明白了。简单来说,运行时常量池就是.class文件中的静态常量池在JVM中的运行时表示,每一个.class文件的静态常量池都会生成一个对应的运行时常量池。等到JVM在解释String m = #1这条指令时,它可以去这个类的运行时常量池中查找#1的定义。
2 字符串池
字符串池是Java为了重用String对象而设置的一个缓存池,Java1.7之前设置在方法区上,保存的是String对象;Java1.7之后设置在堆上,保存的是String对象的引用,String对象本身存在于堆上的其他位置。下文中以Java1.7之后的情况为标准。
https://blog.csdn.net/weixin_39522312/article/details/110805549
在JDK1.6及之前运行时常量池逻辑包含字符串常量池存放在方法区,此时hotspot虚拟机对方法区的实现为永久代(位于堆内存中)
在JDK1.7 字符串常量池被从方法区拿到了堆中,这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代
在JDK1.8hotspot移除了永久代用元空间取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区(元空间),只不过方法区的实现从永久代变成了元空间(堆外内存)作者:Himeros
链接:https://www.zhihu.com/question/377418017/answer/1062033254 来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
11.GC的算法
12.垃圾收集器
13.CMS和G1的区别
1.cms的内存分布是连续的,G1会被分布多个Region
2.cms young gc没有办法清理大对象, G1可以
3.cms的主要步骤有:初始标识(stw),并发标识,重新标识(stw),并发清理(cms的清理阶段是和应用线程并发进行的,使用的是标记清除算法,会产生大量的内存碎片); g1的mixed gc中的全局并发标识阶段的主要步骤有:初始标识(stw),并发标识,重新标识(stw),初始清理(stw),并发清理, 混合gc中的初始清理+并发清理作用只是回收完全没有引用的region,然后计算要回收的region中垃圾的占比,排好序后为后面混合gc的时候加入CSet回收集中做好准备,比如为后面的8次gc回收做好计划,如每次回收把哪些region加入到cset集合中,真正的回收操作是紧跟着的mixed gc的evacuation阶段,在evacuation阶段中会分8次回收全局并发标识阶段标记的Region,使用的是标记整理的算法,不会产生内存碎片(但是是stw的).
4.g1比cms会使用更多的内存和cpu负载,所以更适合用于大堆的应用
原文链接:https://blog.csdn.net/lixia0417mul2/article/details/124958513
14.知道如何对jvm进行调优
这是一个经验活,自己开发时候用得少,还需要有经验,面对过一些实际场景,针对不同的场景进行优化,还需要查找不同的参数对jvm进行调整优化.
15.hashmap的实现原理
1.HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用NULL建和NULL值,因为key允许重复,因此只能有一个建为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。
2.HashMap是:数组+链表+红黑树(JDK1.8增加了红黑树部分)的数据结构
3.哈希表为解决冲突,可以采用地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。
16.hashmap为什么线程不安全
HashMap的put()方法中,有modCount++的操作,即调用put()时,修改次数加1,“i++”操作,从表面上看 i++ 只是一行代码,但实际上它并不是一个原子操作,它的执行步骤主要分为三步,而且在每步操作之间都有可能被打断。
17.优先队列
https://blog.csdn.net/sheng0113/article/details/123140959
以下 偏向操作系统和多线程了
18.什么是上下文的切换
19.如何减少上下文的切换呢
20.CAS的原理
CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制。CAS 操作包含三个操作数 – 内存地址、预期值和新值。CAS 的实现逻辑是将内存地址的数值与预期数值想比较,若相等,则将内存位置处的值替换为新值。若不相等,则不做任何操作。
JAVA中CAS是通过自旋操作完成赋值,若值不相等再更新预期值、重新计算新值,接着进行CAS操作,直到成功为止。底层是JVM调用操作系统原语指令unsafe,并由CPU完成原子操作,你要知道并发/多线程环境下如果CPU没有原子操作我们是无法完成。
原文链接:https://blog.csdn.net/h273979586/article/details/103098350
21.synchronize锁升级
无锁->偏向锁->轻量级锁->重量级锁
https://blog.csdn.net/weixin_43847283/article/details/125470618
轻量级锁和偏向锁的比较:
1.偏向锁只会在第一次进入时CAS一次,而轻量级锁不停的CAS;
2.在偏向锁中,线程栈帧中复制的对象头Mark Word里的线程id;而在轻量级锁中,线程栈帧中复制的对象头Mark Word中所有信息。
3.当线程访问同步代码块失败时,使用CAS竞争锁,并将偏向锁升级为轻量级锁。(升级前,会先将偏向锁撤销为无锁,再从无锁到轻量级锁)
4.当其他线程竞争偏向锁时,会有撤销为无锁和升级轻量级锁之分;而当其他线程竞争轻量级锁时,会直接升级为重量级锁。
原文链接:https://blog.csdn.net/sophia__yu/article/details/84104542
22.进程和线程的却别
作者:biaodianfu
链接:https://www.zhihu.com/question/25532384/answer/411179772
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
23.进程之间的通信方式
https://www.xinzhiweike.com/wenda/1650882761082692
24.线程之间的通信方式
25.spring中IOC和AOP的概念
https://blog.csdn.net/weixin_50989637/article/details/126157645
26.spring如何解决循环依赖的问题
https://blog.csdn.net/DQWERww/article/details/126128229
27.spring的事务
28.隔离界别
一、Spring事务的隔离级别
1.ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应。
2.ISOLATION_READ_UNCOMMITTED(读未提交): 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
3.ISOLATION_READ_COMMITTED(读已提交): 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
4.ISOLATION_REPEATABLE_READ(可重复读): 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5.ISOLATION_SERIALIZABLE(串行(顺序)执行) 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
(Repeatable Read(可重读)是MySQL的默认事务隔离级别)
原文链接:https://blog.csdn.net/faramita_of_mine/article/details/123961701
29.mysql 有幻读吗,它是如何解决的
有
- 通过对select操作手动加行X锁(SELECT … FOR UPDATE )。原因是InnoDB中行锁锁定的
是索引,纵然当前记录不存在,当前事务也会获得一把记录锁(记录存在就加行X锁,不
存在就加next-key lock间隙X锁),这样其他事务则无法插入此索引的记录,杜绝幻
读。 - 进一步提升隔离级别为SERIALIZABLE (效率很慢)
https://blog.csdn.net/zgaoq/article/details/122145949
redis的一些操作
29.十几种需要过什么技术难点,如何解决
1.数据库中查询条件过于复杂,耗时大. 1.优化sql 2.从逻辑上优化(因为本身数据量就很大,预算也只有一个oracle,没有涉及什么分库分表)
2.遇到不会的技术,没学过的技术. 很简单,学就是了,同事之间可以交流
3.同一时间超大api请求. 短时间内4000+的请求 1.多线程去请求获得数据 2.流程设计就有些问题.最后是优化了请求流程,减少了请求次数,缩减到10次
30平常如何学习?