xxx和xxx有什么异同?
答 "异同” 类的问题时指导思想:
1、答区别之前,先答相同点
2、不论是相同点还是区别,都要分类答(分若干个小点)
1、在Java异常体系种,Error 与 Exception 的区别是什么?
相同
- 都是 java.lang.Throwable 类的子类
- 都用于处理程序运行中发生的特殊情况
区别
- 处理方式不同
- Error 通常无法在程序中予以处理,需要交给JVM来处理
- Exception 通常由程序员通过 throw 或 catch 等方式告知JVM如何处理
- 严重程度不同
- Error 表示由 JVM所无法预期的错误,是一种可能能恢复但恢复起来很困难的问题
- Exception 表示JVM可预期的,是一种可以捕获并由在程序中做出处理的特殊情况
2、简述 ArrayList 、Vector 、LinkedList 的区别
相同
- 都是 java.util.List 接口的实现类
- 都是有序、可排序、可重复的集合
- 都支持迭代器操作
区别
-
实现接口不同
- ArrayList 和 Vector 未实现 Queue 接口、Deque 接口,不支持队列操作
- LinkedList 实现了 Queue 接口 和 Deque 接口,支持队列操作,同时支持栈操作
- 自己翻看API查看 Queue 、Deque 接口中声明的方法
- 自己翻看API查看 LinkedList 中对栈操作的支持
-
内部实现不同
- ArrayList 内部采用数组来存储元素
- Vector 内部采用数组来存储元素
- LinkedList 内部采用 链表 来存储元素
-
线程安全
- ArrayList 非线程安全,适用于单线程环境
- Vector 线程安全,适用于多线程环境
- LinkedList 非线程安全,适用于单线程环境
-
扩容方式不同
- ArrayList 内部采用
倍数增长的方式扩容 - Vector 内部采用
增加固定增量的方式扩容 - LinkedList 内部采用链表实现,不需要扩容
- ArrayList 内部采用
-
增删效率不同
- ArrayList 和 Vector 内部采用数组实现,因此增删慢 (想想为什么?)
- LinkedList 内部采用链表实现,因此增删快 (想想为什么?)
-
是否支持随机访问
- ArrayList 和 Vector 内部采用数组实现,因此随机访问效率较高 (想想为什么?)
- LinkedList 内部采用链表实现,因此随机访问效率较低 (想想为什么?)
3、final 、finally 、finalize 的区别
相同
- 这三个词除了长的像,没有任何关系
区别
- final 关键字是个修饰符表示最终的、不可更改
- 被 final 修饰的类,没有子类
- 被 final 修饰的方法,不能被重写
- 被 final 修饰的变量,在初始化后不能再次赋值 (不能二次赋值)
- finally 关键字用于异常处理
- finally 不能单独使用,必须跟 try … 语句 或 try … catch 语句连用
- 程序运行时,不论是否发生异常,finally 代码块都会执行
- 除非遇到 System.exit 方法,否则 finally 代码块一定会执行
- finalize 是 Object 类中定义的一个实例方法
- finalize 方法是 Java 语言诞生之初为了向C++程序员妥协而提供的一个类似于C++中析构函数的方法
- finalize 方法不是析构函数!finalize 方法不是析构函数!finalize 方法不是析构函数!
- 当垃圾回收器(GC)执行垃圾回收操作时,可能会通过调用某个对象的 finalize 方法
- 当垃圾回收器(GC)调用某个对象的 finalize 方法时,可能导致该对象重新恢复到可触及状态,从而无法回收该对象所占用的内存
- 当垃圾回收器(GC)调用某个对象的 finalize 方法后,仍然没有任何引用变量再引用该对象,则GC会回收该对象所占用的内存
4、this 和 super 的区别
在 Java 语言中, 实例 和 对象 是一个概念。
相同
- this 和 super 都表示实例的引用
- 因此 this 和 super 都不能出现在 static 区域
- this 和 super 都可以用于调用构造方法
- 当通过 this( [arguments] ) 或 super( [arguments] ) 调用构造方法时,它们必须位于构造方法的第一行
- 同一个构造方法内部 this( [arguments] ) 或 super( [arguments] ) 不能同时出现
区别
-
所表示实例不同
- this 表示本类的实例 ( 也就是当前实例 )
- super 表示父类的实例
-
调用的构造方法不同
- this 用于调用本类内部的其它重载的构造方法
- super 用于调用父类中的构造方法
-
访问的成员不同
- 通过
this.可以访问本类中以及从父类中继承的、可见的 成员 ( 方法 和 属性(字段) ) - 通过
super.可以访问从父类中继承的、可见的成员 ( 方法、字段(属性) )
- 通过
-
使用方式不同
this关键字可以单独使用,比如 直接输出 this 或当作返回值this关键字在本类中可以省略 ( 比如 getName 方法 中,return this.name;可以写作return name ;)super关键字不可以单独使用,必须通过super( [arguments] )或super.形式来使用
5、HashMap 和 Hashtable 的区别
相同
- 两者都实现 Map 接口,用于存放
键-值对 - 内部都采用 哈希表 实现,都采用 哈希算法计算
键-值对的存放位置
区别
-
是否支持线程安全
- HashMap 非线程安全,理论上效率较高
- Hashtable 线程安全,理论上效率较低
-
内部实现不同
- 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
- 当链表长度大于8时会自动转换成红黑树
- 当链表长度小于6时,红黑树重新转换成链表
- 而 Hashtable 内部则采用 数组 + 链表 实现
- 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
-
对元素位置的计算方法不同
- HashMap 内部采用一个单独的方法根据 key.hashCode() 重新计算一个哈希值后再确定元素存放位置
- Hashtable 内部直接采用 key.hashCode() 来确定元素存放位置
-
两者所继承的类不同
- HashMap 类继承 AbstraceMap 类
- Hashtable 类继承 Dictionary 类
-
是否支持 null
- HashMap 支持 null 键 和 null 值
- Hashtable 不支持 null 键 和 null 值