Java常见的面试二

 1、普通类和抽象类有那些区别

  1. 普通类中不能有抽象方法,抽象类中可以有抽象方法
  2. 普通类可以直接实例化,抽象类不能直接实例化

2、抽象类能够使用final修饰吗

        不能,抽象类是由子类继承的,但是final修饰的类不能被继承。两者矛盾所以抽象类不能使用final修饰

3、接口和抽象类有什么区别

         接口是子类通过implement实现的,抽象类需要子类使用extends来继承。

          接口之间可以实现多继承,子类可以进行多实现,但类之间只能单继承。      

           接口中的方法默认修饰符是public ,抽象类中方法的修饰符可以是任意类型的修饰符

4、Java中IO流分为几种

按功能分:输入流(input)和输出流(output)

按类型来分:字节流和字符流

字节流是按8位传输以字节为单位进行输入输出数据,字符流是按16位传输以字节为单位进行输入输出数据

5、BIO、NIO、AIO有什么区别

        BIO:Block IO同步阻塞IO,模式简单操作方便,处理并发能力低

        NIO:Non IO同步非阻塞IO 客户端和服务器通过Channel(通道)通讯,实现了多路复用

        AIO:Asynchronous IO是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步通过事件和回调机制实现的

6、Files的常用方法有哪些

  1. Files.exists()检验文件是否存在
  2. Files.createFile()创建文件
  3. Files.createDirectory()创建文件夹
  4. Files.delete()删除一个文件或目录
  5. Files.copy()复制文件
  6. Files.move()移动文件
  7. Files.size()获取文件个数
  8. Files.read()读取文件
  9. Files.write()写入文件

7、Java中的容器都有那些

Java容器分为Collection和Map两大类

Collection

       List

       ArrayList

        LinkedList

        Vector

        Stack

        Set

        HashSet

        LinkedHashSet

        TreeSet

Map

        HashMap

       LinkedHashMap

        TreeMap

        ConcurrentHashMap

        Hashtable

8、Collection和Collections有什么区别

        Collection是一个集合的接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等

        Collections是一个包装类,包含了很多静态方法,不能被实例化,就像一个集合的工具类。比如排序方法:Collections.sort(list)

9、List、Set、Map之间的区别是什么

List和Set是存储单例数据集合,Map是以键值对的形式存储数据的

List中存储的数据是有序可以重复的,Set中存储的数据无序不可以重复

Map存储的数据是无序的,键是不可以重复的但是值可以重复

Set存储的数据的位置是根据元素的hashcode决定的,所以对于用户来说是无序的

10、HashMap和Hashtable有什么区别

        存储:HashMap的key和value允许为null,而Hashtable不允许

        线程安全:HashMap线程不安全,Hashtable线程安全,所有HashMap的效率要比Hashtable效率高

        推荐使用:在Hashtable的类注释可以看到,Hashtable是保留类不建议使用,推荐在单线程环境下使用Hash Map替代如果需要多线程使用则用ConcurrentHashMap替代

11、HashMap的实现原理

        HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取,当传入key时,HahMap会根据key.hashCode()计算出hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突。如果出现hash冲突会变量该位置上的链表中的所有数据通过equals()方法来对比每个数据的key如果key相同时会进行数据覆盖,如果key不同,在jdk1.8以前使用的是头插法,在1.8之后使用的是尾插法。另外1.8以后当链表上的节点数大于等于8并且数组长度不小于64时,链表会自动转换成红黑树,当链表中的数据小于8时会变成链表。

为什么要将链表转换成红黑树? 

        当数据量大时,链表链表查询的时间复杂度为O(n),红黑数查询的时间复杂度为O(logn),最坏时间复杂度为O(algn)

如果链表数据达到8之后数组长度小于64话会先进行数组扩容直到数组长度达到64才会转成红黑树

数组扩容有两种:一种时数组达到阙值时,数组会扩容两倍。HashMap数组长度默认是16,默认负载因子为0.75。所有刚开始阙值为12。另一种是在没有红黑树的情况下,添加元素链表长度超过8,数组会扩容为两倍。

HashMap的做法是用链表和红黑树存储相同hash值的value。当hash冲突的个数比较少时,使用链表否则使用红黑数

        

        

        

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值