JAVA面试题和答案(一)

基础题

怎么解决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报头格式

转载于:https://juejin.im/post/5adaea97518825672205c786

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值