- 获取字节码对象的三种方式
- Class clazz = Class.forName(“全路径”);
- Class clazz = 类名.class;
- Class clazz = 对象名.getClass();
- 反射的概念
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- 反射机制的作用
① 在运行时判断任意一个对象所属的类;
② 在运行时构造任意一个类的对象;
③ 在运行时判断任意一个类所具有的成员变量和方法;
④ 在运行时调用任意一个对象的方法;
⑤ 生成动态代理。
⑥ 在运行时处理注解。
⑦ 在运行时获取泛型信息。
- xml与html的区别
HTML代表超文本标记语言。 | XML代表可扩展标记语言。 |
HTML是静态的,用于显示数据。 | XML是动态的,用于传输数据。 |
HTML是一种标记语言。 | XML提供了定义标记语言的框架。 |
HTML可以忽略小错误。 | XML不允许错误。 |
HTML不区分大小写。 | XML区分大小写。 |
HTML标记是预定义标记。 | XML标记是用户定义的标记。 |
HTML中的标签数量有限。 | XML标记是可扩展的。 |
HTML不保留空格。 | XML可以保留空格。 |
在HTML中,不需要结束标记。 | 在XML中,结束标记是必需的。 |
- HashMap 、HashTable 和TreeMap有什么区别
- HashMap底层结构
JDK1.8之前 (数组+链表):
JDK1.8之前HashMap底层是数组和链表结合在一起使用,也就是链表散列.数组的长度规定是2的幂.数组中存放的对象是Entry<key,value>对象 ,不允许有重复的key存在
JDK1.8之后 (数组+链表+红黑树):
如果链表的长度超过8则转为红黑树, 当红黑树中的元素小于6时又变为链表
相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阀值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
- hashMap 中什么时候需要进行扩容,扩容方法 resize()又是如何实现的?
调用场景:
1.初始化数组 table
2.当数组 table 的 size 达到阀值时进行扩容
实现过程:
通过判断旧数组的容量是否大于0来判断数组是否初始化过。
l如果小于0:进行初始化,判断是否调用无参构造器。
l如果大于0: 进行扩容,扩容成两倍(小于最大值的情况下),之后在进行将元素重新进行与运算复制到新的散列表中。
概括的讲:`
扩容需要重新分配一个新数组,新数组是老数组的2倍长,然后遍历整个老结构,把所有的元素挨个重新hash分配到新结构中去。
PS:可见底层数据结构用到了数组,到最后会因为容量问题都需要进行扩容操作。
- 接口和抽象类的区别是什么
1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法。
2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定。
3. 一个类可以实现多个接口,但最多只能实现一个抽象类。
4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定。
5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
备注: 在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。