java问题总结2021(记录)

**1.nextLine和next两个方法的区别:**
<1>next不会接收回车符,tab或者空格键,在接收有效数据之前会忽略这些符合,若已经读取了有效数据,遇到这些符号会直接退出。
<2>nextLine可以接收空格或者tab键,其输入以enter键结束。

**2.String,StringBuffer,StringBuilder**
StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
效率方面:StringBulider > StringBuffer > String
开发过程中建议优先采用StringBuilder类
实际应用场景中:
1.如果不是在循环体中进行字符串拼接的话,直接使用 String 的 “+” 就好了;
2.单线程循环中操作大量字符串数据 → StringBuilder.append()3.多线程循环中操作大量字符串数据 → StringBuffer.append()**3.ERROR和Exception**
Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理。
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的、不可恢复的状态。既然是非正常情况,不便于也不需要捕获

**4.== 和 equals 的区别是什么**
==比较的是值,判断两个对象是否是同一个对象
equals判断两个对象是否相同

**5.Vector,ArrayList,LinkedList**
Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量。当数组已满,开始扩容时,会先创建新的扩容后数组,并拷贝原有数组数据,最后删除原数组。
ArrayList(擅长”查询”,“更新”)可以根据需要调整容量,不过两者的调整逻辑有区别,Vector在扩容时会提高1倍,而ArrayList则时增加50%
LinkedList(擅长”新增”,”删除”)是双向链表的数据结构实现。

多线程场景下就不能使用ArrayList吗?
ArrayList是线程不安全的,遇到多线程场景,可以通过Collcetions的synchronizedList方法将其转换成线程安全的容器后使用
List<String> syncList = Collections.synchronizedList(arraylist);


ListSet有哪些区别?
List方法可以允许重复对象,而Set方法不允许重复对象
List可以插入多个null元素,而Set只允许插入一个null元素
Lists是一个有序容器,保持了每个元素的插入顺序;Set是一个无序容器,无法保证每个元素的存储顺序,TreeSet通过Comparator或者Comparable维护了一个顺序
效率上面:
List可以动态增长,查找元素效率高,插入删除元素效率低,会引起其他元素的位置改变
Set删除和插入效率高,不会引起元素位置改变 

HashSet的实现原理?
HashSet底层是基于HashMap实现的,能继承HashMap的的所有特性,因此 HashSet 结构也是数组+链表+红黑树,同样也不能使用get方法,HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,不允许key重复,但支持null对象作为key。

HashSet是如何保证Key不重复的?
HashSet 的实例添加一个值时,使用到的是它的 add 方法,源码如下:
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
  由代码中的 add 方法实现可知,其维护了一个 HashMap 来实现元素的添加;我们知道,HashMap 作为双列集合,它的键是不能够重复的,HashMap 针对 hashCode 相同且 equals 比较值相同的时候执行的是更新操作,所以Hashmap中的key是唯一的,也决定了hashset元素值也是唯一的。
ArrayArrayList 有何区别?
Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
ArrayArrayList可以互相转换,ArrayList有: Arrays.asList(array);而ListArray有:List.toArray()方法。

**6.HTTP的三次握手和四次挥手**
三次握手和四次挥手的过程(参考:https://blog.csdn.net/qq_39390545/article/details/117689817?spm=1001.2014.3001.5501)
如果已经建立了连接,但是客户端突然出现故障怎么办?
TCP有个保活计时器,服务器每次收到客户端请求都会重新复位这个计时器,时间通常是2个小时,若两个小时没有收到客户端任何数据,服务器就会发送探测报文段,以后每格75秒发送一次,若一连发送10次探测报文仍然没有反应,服务器就认为客户端出了故障,接着就会关闭连接

POST和Get请求的区别:
(1)get请求url长度是有限制的,post没有
(2Post比get安全,get参数直接暴露在url上面,不能用来传递敏感信息;post是放在Request body中
(3Get只接收ASCII字符,post没有限制
(4Get请求会别浏览器主动缓存,post不会
(5Get在浏览器中回退时是无害的,而post会再次提交请求

**7.数据库**
ACID特性:原子性、一致性、隔离性、持久性

从原理上解释ACID具体是怎么实现的?
对MySQL来说,逻辑备份日子(binlog)、重做日志(redolog)、回滚日志(undolog)、锁技术+MVCC就是MySQL实现实务的基础。

并发场景下数据会存在哪些问题:脏读、不可重复读、幻读

**8.Redis缓存**
Redis哨兵模式(百度熟悉)
Redis故障自动切换过程(百度熟悉)
哨兵进程的工作方式(百度熟悉)

缓存主要存在于内存中,内存空间是有限的,比如:redis只能存储10G数据,但要写入20G的数据,怎么办?会先干掉10G的数据,保留另外10G数据。
那么干掉哪些数据,保留哪些数据?根据热度干掉不常用的数据

数据已经过期了,怎么还占着内存?这是由redis的过期策略来决定。


什么是redis的过期策略和内存淘汰策略?
Redis过期策略:Redis中过期的key不会立刻从内存中删除,而是同时会以下面两种策略进行删除:定期删除,惰性删除

定期删除:Redis100ms进行一次过期扫描
惰性删除:获取某个key的时候,redis会检查一下这个key设置的过期时间是否过期了,如果过期此时会删除,不会给你返回任何信息。

如果定期删除漏掉了很多过期key,然后也没有及时去查,也没有走惰性删除,此时会怎样?如果大量过期key堆积在内存中,导致redis内存快耗尽了,怎么办?
用内存淘汰机制

Redis内存淘汰策略是指在Redis的用于缓存内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。

Redis的内存用完了会发生什么实际问题?
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲掉旧的内容。

**9.进程和线程**
进程和线程有哪些区别?
形象记忆:进程-->火车;线程-->车厢;线程在进程下行进(车厢是无法运行的)
(1)一个进程可以包含多个线程
(2)不同进程间数据很难共享
(3)同一进程下不同线程间数据很容易共享
(4)进程要比线程消耗更多的计算机资源
(5)进程间不会相互影响,一个线程挂掉将导致整个进程挂掉
(6)进程可以拓展到多机,线程最多扩展到多核CPU,而不能扩展到多机(不同火车可以开在不同轨道,同一火车的车厢不能开在不同轨道上面)
(7)进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等他结束,才能使用这一块内存
(8)进程使用的内存地址可以限定使用量

什么是用户(User)线程?
运行在前台,执行具体的任务,如:程序的主线程,连接网络的子线程等都是用户线程

什么是守护(Daemon)线程?
运行在后台,为其他前台线程(非守护线程)服务。当所有用户线程都结束运行时;守护线程会随JVM一起结束工作。

所以,守护线程时依赖于用户线程,当所有用户线程都退出了,守护线程也就退出了;而用户线程是独立存在的,不会因为其他用户线程退出而退出。

形成死锁的的四个必要条件是什么?
(1)互斥  (2)占有且等待  (3)不可抢占  (4)循环等待

如何避免死锁?
基本思想:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进死锁状态的动态策略。

死锁避免和死锁预防有啥不同?
死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现;而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发送死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

**10.MyBatis**
怎么理解ORM(对象关系映射)框架?常见的ORM框架有哪些?
对象映射关系(ORM):主要实现程序对象到关系数据库数据的映射。
常见的ORM框架:Mybats(batis),Hibernate,Jpa,JdoMybatisHibernate优势区别
Mybatis优势:
Mybatis可以进行更为细致的SQL优化,可以减少查询字段。
Mybats容易掌握,而Hibernate门槛较高。

Hibernate优势:
Hibernate的DAO层开发比Mybatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比Mybatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,Mybatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。Myabtis本提提供的缓存机制不好。

HibernateMybatis的缓存机制有哪些区别?
相同点:HibernateMybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三放缓存方案,创建适配器来完全覆盖缓存行为。
不同点:
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再具体的表-对象映射中配置那种缓存。
Mybatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref实现。


Mybatis是如何做到防止sql注入的?
parameterType表示了输入的参数类型,resultType表示了输出的参数类型,要想防止sql注入,理所当然地要在输入参数上下功夫。



**11.Linux命令**
Kill -9和kill的区别?

Kill命令默认的信号是15,也就是kill -15,被称为优雅的退出。当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理由程序自己决定。
Kill -9在执行时,应用程序是没有时间进行准备工作的,立即杀掉程序,通常会带来一些副作用,如:数据丢失或者终端无法恢复到正常状态等。

Linux一般怎么在后台运行程序?
方式1:nohup命名 &
方式2:screen

**12.HashMap**

HashMap实现的原理?
HashMap在JDK1.7及以前是”链表散列”的数据结构,即数组+链表的结合体。
JDK8转化为:数组+链表+红黑树
实现原理:当向数组添加一个键值对时,首选计算键值对中key的hash值,以此确定插入数组中的位置,但是可能存在同一个hash值的元素已经被放在数组同一个位置了,这种现象称为碰撞,这时按尾插法(JDK1.7之前为头插法)的方式添加key-value到同一hash值得元素的最后面,链表就形成了。

如何实现HashMap的有序?
使用LinkedHashMapTreeMap

LinkedHashMap如何实现有序?
LinkedHashMap内部维护了一个单链表,有头尾节点,同时LinkedHashMap节点Entry内部除了继承HashMapNode属性,还有before和after用户标识前置节点和后置属性。可以实现按插入的顺序或访问顺序排序。

TreeMap怎么实现有序的?
TreeMap是按照key的自然顺序或者Comprator的顺序进行排序,内部是通过红黑树来实现。
1.TreeMap实现了SortedMap接口,它是一个key有序的Map2.要么key所属的类实现Comparable接口,或者自定义一个实现了Comparator接口的比较器,传给TreeMap用于key的比较

HashMap扩容机制?
capacity即容量,默认为16
LoadFactor加载因子,默认为0.75
Threshold阈值。阈值=容量*加载因子。默认为12。当元素数量超过阈值变会触发扩容。
注意:(1)一般情况下,当元素数量超过阈值时便会触发扩容(调用resize())
(2)每次扩容的容量都是之前容量的2倍。
(3)扩展后Node对象的位置要么在原来位置,要么移动到原偏移量两倍位置。

HashMap在jdk1.8都做了哪些优化?

链表红黑树如何相互装换?阈值多少?
链表转红黑树的阈值为:8
红黑树转链表的阈值为:6
原因:hash碰撞8次的几率为百万分之6,从概率上面说,阈值是8足够用;至于为什么红黑树转回来链表的条件阈值是6而不是79?因为如何hash碰撞次数在8附近徘徊,可能会频繁发送链表和红黑树互相转化操作,为了预防这种情况的发生。

HashMap是线程安全的吗?如何解决线程不安全的问题?
在多线程的情况下,不是线程安全的。
在java中有HashTable,SynchronizedMap,ConcurrentHashMap这三种是实现线程安全的Map.

**13.Spring框架**
Spring IOC的理解?
IOC(控制反转)将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。
IOC容器实际上就说一个Map(key,value),Map中存放的是各种对象。



未完待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值