吐血整理!这200道阿里P6必备Java面试题,我简直太爱了( 三 )

说说Map集合和它的实现类

  • Map接口 , 专门用来实现键值对操作的集合类接口 。它的实现类有HashMap、HashTable、TreeMap和LinkedHashMap 。
  • 实现类HashMap , 底层使用Hash表实现 , 它通过元素的hashCode来确定存储的位置 , 所以有很快的查询速度 , 但它遍历时的顺序是不确定的 。HashMap只允许一个key为null , 但可以多个key的value为null 。HashMap是非线程安全的 , 所以多线程环境下 , 对HashMap进行并发写会出现不一致性问题 , 可以通过Collections的synchronizedMap()方法对HashMap进行包装 , 让HashMap具有线程安全的能力 , 或者使用ConcurrentHashMap 。在JDK1.8之前 , HashMap底层是使用Hash表和链表实现 , 当发生hash冲突时 , 同一个位置的元素会形成链表存储 , 但是元素一多时 , 查询就会变为链表的遍历 , 效率比较低 。在JDK1.8时 , HashMap底层就变成Hash表和链表红黑树实现 , 当链表中的元素个数超过8时 , 链表转换为红黑树 , 避免遍历 , 优化了查询效率 。HashTable , 底层和JDK1.7的HashMap类似 , 但它的key和value都不能为null , 而且Hashtable是线程安全的 , 它的每个方法都有synchronized 关键字 , 所以多线程环境下可以使用它 。TreeMap , 底层是通过二叉树实现 , 它能在元素添加时 , 进行排序 , 它要求元素必须实现Comparable接口 , 复写compareTo()函数 , 或者在创建TreeMap时传入自定义Comparator比较器对象 , 否则会在运行时抛出java.lang.ClassCastException类型的异常 。LinkedHashMap , 它是HashMap的一个子类 , 保存了插入顺序 , 而其他Map实现类是无序的 。
什么是泛型?什么是泛型擦除?
  • 泛型可以对类型进行抽象 , 可以让类型支持不同类型而重用 , 例如容器类ArrayList , 通过泛型 , ArrayList可以存储不同的元素 , 并且泛型后的Array元素是具体类型而不是Object , 避免了类型转换的麻烦 , 而且编译时会报错 , 避免了类型转换可能发生的类型转换错误 。
  • 泛型擦除 , 因为Java的泛型是通过编译时实现的 , 生成的Java字节码中是不存在泛型信息的 , 所以泛型信息 , 在编译器编译时 , 会将泛型信息去除 , 这个过程就是泛型擦除 。所以List上附加的泛型信息 , 在JVM来说是不可见的 , 在它眼里都是Object类型 。
Java异常面试题Java异常分为哪几种?
  • 编译时异常
  • 运行时异常
介绍一下Java的异常处理机制
  • 捕获异常 , 使用try-catch-finally
  • 异常抛出 , 使用throws关键字
如果自定义一个异常
  • 继承一个异常类 , 运行时异常继承RuntimeException , 编译时异常继承Exception 。
try-catch-finally , try中有return , finally还执行吗?
  • 执行 , finally的执行在return之前 , 不管try中有没有异常 , 都会执行 。另外如果finally中有return , 则会在try的return之前执行 , 那么try中的return就执行不到了 。
Excption与Error的关系
  • Excption与Error都是Throwable的子类 。
  • Excption有运行时异常和编译时异常 , 他们都是可以捕获和处理 。编译时异常常见有:IOException、FileNotFoundException、SQLException , 必须在代码中处理 , 否则编译会报错 。运行时异常常见有:ClassCastException、IndexOutOfBoundsException、NullPointerException
  • Error , 和运行时异常一样 , 编译器也不会对错误进行检查 。当资源不足、约束失败、或是其它程序无法继续运行的条件发生时 , 就产生错误 。程序本身无法修复这些错误的 。常见子类有OutOfMemoryError
Java中的IO和NIO面试题Java的IO流分为几种
  • 按流的流向分 , 可以分为输入流和输出流
  • 按操作的单元分 , 可以分为字节流和字符流
  • 按照流的角色分 , 可以分为节点流和处理流
Java IO流中40多个类 , 都是从以下4个抽象基类中派生出来的: