Java学习日记-xxx和xxx有什么异同?

290 阅读5分钟

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 和 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 内部则采用 数组 + 链表 实现
  • 对元素位置的计算方法不同

    • HashMap 内部采用一个单独的方法根据 key.hashCode() 重新计算一个哈希值后再确定元素存放位置
    • Hashtable 内部直接采用 key.hashCode() 来确定元素存放位置
  • 两者所继承的类不同

    • HashMap 类继承 AbstraceMap 类
    • Hashtable 类继承 Dictionary 类
  • 是否支持 null

    • HashMap 支持 null 键 和 null 值
    • Hashtable 不支持 null 键 和 null 值