HashMap和HashTable的区别
- HashMap允许null作为键值,而HashTable不允许;
- HashMap不是线程安全的,HashTable是线程安全的。
HashMap的实现原理
- HashMap是基于Map的非同步的实现,允许null作为键和值,无序,是一种“散列链表”的数据结构(数组+链表)
- HashMap的存储
- 计算KEY的哈希值;
- 判断哈希值是否与数组中元素的哈希值相同,
- 如果相同,再根据equals()判断KEY对象是否已存在,
- 如果存在,覆盖VALUE值,KEY值不会覆盖;
- 如果不存在,在此元素上形成链表,新加的对象位于链表的头部(可解决HASH冲突的问题)。
- 如果相同,再根据equals()判断KEY对象是否已存在,
- HashMap的读取
- 先根据哈希码值读取元素在数组中的存储位置
- 再通过equals()方法获取相同KEY的VALUE值
- resize(扩容)
- 当数组中的大小超过0.75 * 初始容量的时候,就会进行resize
- 原因:当HashMap中的元素越来越多的时候,碰撞几率就会增大,为了增强查询效率,就需要resize
初始化HashMap的时候,需要指定初始长度吗?
可以指定,也可以不指定,不指定的时候,默认初始长度为16,当HashMap中的长度超过12的时候,就会resize,这时就会重新计算hash保证散列的均匀性,频繁的resize的代价是很高的,所以建议在可以估量HashMap大小的时候给定一个初始值(2的幂)
Java多态的表现形式
- 重载(overload)
- 同一类中,方法名相同,参数类型,参数顺序,参数个数不同
- 重写(override)
- 子类中对父类方法的覆盖,方法名和参数完全相同,访问权限要大于等于父类的访问权限,不能抛出比父类方法更多的异常,可以不抛出异常
java类的初始化过程
- 初始化父类静态成员变量,子类静态成员变量
- 初始化父类静态代码块,子类静态代码块
- 初始化父类普通成员变量,初始化父类构造方法
- 初始化子类普通成员变量,初始化子类构造方法
数据库连接池的工作机制
- JavaEE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接.客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙.如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定;
- 当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。
开发中使用泛型代替非泛型的数据类型,程序的运行性能会变得更好
这句话是错误的,泛型仅仅是一颗语法糖,在编译阶段,虚拟机会把泛型擦除,所以运行性能是没有改变的,顶多编译速度慢一些。
接口不能实现接口,可以继承不止一个接口