请你解释为什么集合类没有实现Cloneable和Serializable接口?
实现Cloneable接口可以的类有克隆对象的功能,实现Serializable接口的类则可以实现序列化,序列化就是将对象状态存储起来,例如保存到文件或者数据库中。克隆或者序列化的语义和含义跟具体实现相关,所以应该由集合的具体实现类来决定如何被克隆或者序列化。
请说明java集合类的基本框架有哪些?
首先是Collection接口,该接口有两个子接口List和Set集合,List集合和Set集合最大的区别就是Set集合不允许存放重复元素,而List集合允许。
其次就是以键值对方式存储数据的Map集合,Map集合有HashMap、LinkedHashMap、HashTable、TreeMap几个主要的实现类。
请解释下TreeMap?
TreeMap是Map的实现类,实现的是一个排序的红黑树结构,TheeMap根据key的自然顺序实现排序处理或者根据创建映射时提供的Comparator接口进行排序,TreeMap中的key一定不能为null。
ArrayList是否会越界?
ArrayList实现了基于动态数组的数据结构,在并发操作时是有可能会发生下标越界。
请你解释HashMap的容量为什么是2的n次幂?
HashMap的底层实现是链表和红黑树,负载因子是0.75,树的阈值是8,当存储的数据达到了容量的75%时则会将容量变为原来的两倍,当链表长度大于8时会将链表结构转化为红黑树的结构。2的n次幂是为了让散列更加均匀,例如出现极端情况都散列在数组中的一个下标。
如果HashMap的key是一个自定义的类怎么办?
必须重写hashcode()和equals()方法,因为Map集合在根据key获取数据时会利用hashcode()方法生成的结果进行比较,哈希码相同时才调用equals()方法进行比较。
HashMap的底层原理?
HashMap是基于链表和红黑树实现的,HashMap的负载因子是0.75,当链表的长度大于容量的75%时会扩容为原来的两倍。jdk1.8引入了红黑树结构做优化,当链表的长度大于等于8时,链表转换为红黑树,当桶中链表长度小于等于6时会将红黑树还原为链表。
ArrayList扩容机制?
创建ArrayList对象时,如果没有指定容量,则默认创建一个空的Object[]数组,当第一次添加元素时容量变为10。之后当数组容量不够时ArrayLIst容量扩容为原来的1.5备。