1. 获取字节码对象的三种方式
  2. Class clazz = Class.forName(“全路径”);
  3. Class clazz = 类名.class;
  4. Class clazz = 对象名.getClass();
  5. 反射的概念

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  1. 反射机制的作用

① 在运行时判断任意一个对象所属的类;

② 在运行时构造任意一个类的对象;

③ 在运行时判断任意一个类所具有的成员变量和方法;

④ 在运行时调用任意一个对象的方法;

⑤ 生成动态代理。

⑥ 在运行时处理注解。

⑦ 在运行时获取泛型信息。

  1. xml与html的区别

HTML代表超文本标记语言。

XML代表可扩展标记语言。

HTML是静态的,用于显示数据。

XML是动态的,用于传输数据。

HTML是一种标记语言。

XML提供了定义标记语言的框架。

HTML可以忽略小错误。

XML不允许错误。

HTML不区分大小写。

XML区分大小写。

HTML标记是预定义标记。

XML标记是用户定义的标记。

HTML中的标签数量有限。

XML标记是可扩展的。

HTML不保留空格。

XML可以保留空格。

在HTML中,不需要结束标记。

在XML中,结束标记是必需的。

  1. HashMap HashTable 和TreeMap有什么区别

Java常见面试题_数组

 

  1. HashMap底层结构

JDK1.8之前 (数组+链表)

JDK1.8之前HashMap底层是数组和链表结合在一起使用,也就是链表散列.数组的长度规定是2的幂.数组中存放的对象是Entry<key,value>对象 ,不允许有重复的key存在

Java常见面试题_xml_02

 

JDK1.8之 (数组+链表+红黑树)

如果链表的长度超过8则转为红黑树, 当红黑树中的元素小于6时又变为链表

相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阀值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

Java常见面试题_数组_03

 

  1. hashMap 中什么时候需要进行扩容,扩容方法 resize()又是如何实现的?

调用场景: 

1.初始化数组 table

2.当数组 table 的 size 达到阀值时进行扩容

实现过程:

通过判断旧数组的容量是否大于0来判断数组是否初始化过。

l如果小于0:进行初始化,判断是否调用无参构造器。

l如果大于0: 进行扩容,扩容成两倍(小于最大值的情况下),之后在进行将元素重新进行与运算复制到新的散列表中。

概括的讲:`

扩容需要重新分配一个新数组,新数组是老数组的2倍长,然后遍历整个老结构,把所有的元素挨个重新hash分配到新结构中去。

PS:可见底层数据结构用到了数组,到最后会因为容量问题都需要进行扩容操作。

  1. 接口和抽象类的区别是什么

1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法。

2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定。

3. 一个类可以实现多个接口,但最多只能实现一个抽象类。

4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定。

5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

备注: 在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。