Java面经

为什么重写equal()方法也要重写hashcode()方法

在使用HashMap存放键值对时,首先会判断key的hashcode()在map中是否存在,若不存在直接存入,若存在会调用equal方法进行比较。那么我们现在知道一个前提了,即equal()相等,那么其hashcode()一定相等。如果我们重写equal不重写hashcode()话,导致equal()相等,而hashcode()不相等,即HashMap存放数据时,出现异常。

ArrayList多线程为什么不安全?

在add方法中,未加锁,导致修改数组同一个位置多次,结果出现异常。

而vector在add方法上添加synchronized修饰,所以线程安全,但性能低。

Java中wait()和sleep()的区别?

所属类不同:wait()是Object类中,sleep()是Thread类中

调用方式:wait()必须在同步代码块中调用,sleep()可以在任何地方调用

锁:wait()会释放它所持有的对象锁,而sleep()不会释放锁

唤醒:wait()会进入等待状态,直到其他线程调用同一个对象上的 notify() 或 notifyAll() 方法唤醒它。调用sleep()在睡眠时间结束后,线程会自动恢复执行,

自动装箱、自动拆箱 

用于在基本数据类型和它们对应的包装类之间进行自动转换。 其核心目的是简化代码编写,消除基本类型和包装类型在代码中显式转换的繁琐性

什么是二叉查找树?

是一种特殊的二叉树数据结构,用于高效地存储、查找、插入和删除数据。其核心特性是有序性。

所有节点满足以下特性:

  1. 左子树上所有结点的值均小于或等于它的根结点的值。
  2. 右子树上所有结点的值均大于或等于它的根结点的值。

出现问题

容易变成链表,当插入数据单调递增或递减时。时间复杂度退回O(n)。

为了避免这种特殊的情况发生,引入了平衡二叉树(AVL)和红黑树(red-black tree)。

平衡二叉树

树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

左旋:根节点变为它右节点的左节点根节点的右节点变为根节点,右节点的左子树变为原来根节点的右子树。

Java面经_第1张图片

右旋:根节点变为左节点的右节点,根节点的左节点变为根节点,左节点的右子树变为原来根节点的左子树。

Java面经_第2张图片 

问题:在插入或删除的时候很容易出现不平衡的情况,一旦这样,就需要进行旋转以求达到平衡。 

一般使用场景在于查询场景, 而不是 增加删除 频繁的场景。

红黑树O(log n)

红黑树牺牲了部分平衡性,以换取插入/删除操作时较少的旋转操作,整体来说性能要优于AVL树。

特性

  • 颜色属性)性质1:节点非黑即红

  • 根属性)性质2:根节点一定是黑色

  • 叶子属性)性质3:叶子节点(NIL)一定是黑色

  • 红色属性)性质4:每个红色节点的两个子节点,都为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

  • (黑色属性)性质5:从任一节点到其每个叶子的所有路径,都包含相同数目的黑色节点。

你可能感兴趣的:(java成神之路,java,开发语言)