基础题
怎么解决Hash冲突
开放地址法、链地址法、再哈希法、建立公共溢出区
写出一个必然会产生死锁的伪代码
function A {
lock(a);
wait(b);
}
function B {
lock(b);
wait(a);
}
复制代码
A、B分别作为一个线程执行,就会产生死锁。
Spring IoC涉及到的设计模式
- 工厂模式
- 代理模式
- 单例模式
toString()方法什么情况下需要重写
默认每个类都会有toString()方法,会打印类名和哈希值,可是这样不够直观,当需要体现出类里的属性时需要重写toString()方法
判断对象相等时,什么情况下只需要重写 equals(),什么情况下需要重写 equals(),hashcode()?
由于hashcode会用于map的存储中,当重写了equals时,例如对其内容进行判断,此时若不重写hashcode,他们的hashcode就会不同,进行存储的时候会当做是两个对象。
Set内存放的元素为什么不可以重复,内部是如何保证和实现的?
因为Set实际上是继承于HashMap,它的add方法实际上是使用了HashMap的put方法,是根据hashcode去重的。
如何保证分布式缓存的一致性(分布式缓存一致性hash算法?)?分布式session实现?
一致性hash算法主要是解决缓存动态扩容导致缓存失效的问题,实现方式是在一个环里,算出hashcode后找到最近的服务器节点,这样只会影响到很少一部分的数据。
分布式session有三种实现方式:
- session复制,广播到其他机器
- session sticky,用户只会访问对应的机器
- 集中式管理,把session保存在redis中,建议用这种
Java 8流式迭代的好处
主要是可以并行处理数据,代码风格更加紧凑
项目中用到的JDK的哪些特性
例如jdk5的自动装箱、注解,jdk8的lambda表达式、Streams、Optional
说一下TreeMap的实现原理?红黑树的性质?红黑树遍历方式有哪些?如果key冲突如何解决?setColor()方法在什么时候用?什么时候会进行旋转和颜色转换?
根据红黑树实现,红黑树是平衡且排序的二叉树,有以下几个性质:
- 每个节点只能是红色或黑色
- 根节点是黑色
- 空节点是黑色
- 一条路径不能连续出现两个相邻红色节点
- 从任一节点到子节点包含相同数量的黑色节点
红黑树是通过中序遍历的方式,由于红黑树是满足左子树比节点要小,右子树比节点要大,因此按照中序遍历的方式可以让节点从小到大有序输出。
当key冲突时,会将新加入的值替换掉旧的值。
setColor()在颜色转换时使用,以及根节点设置为黑色,新增节点初始设置为红色,再进行平衡搜索。
当树的结构发生变化时,例如插入和删除,会导致颜色变换和旋转,重新变得平衡。
Spring的bean的创建时机?依赖注入的时机?
依赖注入是在Bean对象创建的时候完成的
有个懒加载lazy-init属性,若为default和false,且为单例模式下时,是在Spring启动的时候创建bean。若为多例或者属性为true的时候,在context.getbean的时候创建,即需要时才创建
ArrayList和LinkList的删除一个元素的时间复杂度
ArrayList的本质是数组,LinkedList的本质是链表。删除一个元素其实要分类讨论,如果是删除尾巴的元素,两者都是O(1),如果是头部,ArrayList是O(n),因为需要移动整个列表的元素,而LinkedList是O(1),只需修改前端后端节点的指向即可。如果删除中间的元素,两者都是O(n)。
通常的说法是多用于读的情况用ArrayList,多用于修改的情况用LinkedList。
CopyOnWriteArrayList是什么
实际上是一个特殊的ArrayList,普通的ArrayList如果在遍历的时候修改数据,会报并发的错误。而CopyOnWriteArrayList主要就是解决这个问题,会在新增的时候先copy一个副本,在新的数组上加完元素后再把原来的数组引用指向新的数组。
适用于读操作大于写操作的场景,解决了并发的问题,但也有两个缺点,一个是内存消耗大,另一个是只能保证最终一致性而不是强一致性。
序列化和反序列化底层如何实现的
序列化实际上是指将对象转换成字节,用于保存以及网络传输,反序列化即其逆过程。Jdk中的实现是 ObjectOutputStream 和 ObjectInputStream,ObjectOutputStream可以将对象写成流,而 ObjectInputStream可以从流中读取对象。另外可以通过重写readObject 和 writeObject方法来自定义序列化反序列化的方式。
如何调试多线程的程序
IDEA对调试的红点可以点右键,选择线程,那该线程的断点就会等待你去处理而不是直接过去了。
一个线程连着调用start两次会出现什么情况
由于状态只有就绪、阻塞、执行,状态是无法由执行转化为执行的,所以会报不合法的状态!
HashMap在什么时候时间复杂度是O(1),什么时候是O(n),什么时候又是O(logn)
当没有碰撞时复杂度是O(1),当有碰撞时会存储成列表,此时是O(n),当存储的数量超过了一个阈值时,会存储成红黑树,此时的复杂度是O(logn)
wait方法能不能被重写?
wait是final类型的,不可以被重写,不仅如此,notify和notifyall都是final类型的
一个Controller调用两个Service,这两Service又都分别调用两个Dao,问其中用到了几个数据库连接池的连接?
网络基础
HTTP、TCP、UDP的区别和联系
简单来说 HTTP属于应用层,TCP和UDP属于传输层,HTTP在TCP和UDP的上层。TCP是可靠的需要建立连接的协议,UDP是不可靠不需要建立连接的协议,UDP的速度更快。TCP适用于需要可靠传输的场景,UDP适用于需要高速传输的场景。
TCP和UDP各自的优势,知道哪些使用UDP协议的成功案例
TCP主要提供可靠的传输服务,需要三次握手,但速度较慢。UDP不用先建立连接不需要确认,所以有可能会丢包,但速度较快。UDP的成功案例,例如google创造的quic
TCP和UDP各用了底层什么协议
IP网际协议 ICMP协议 ARP协议
单个UDP报文最大容量
65535
单个TCP报文最大容量
1460
TCP报头格式、UDP报头格式