BAT面试题-JAVA集合框架

Java中的集合类及关系图

List和Set继承自Collection接口。Set无序不允许元素重复,HashSet和TreeSet是两个主要的实现类。List有序且允许元素重复,ArrayList、LinkedList和Vector是三个主要的实现类。Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

集合框架的优势:降低开发和维护成本、提高代码质量、提高复用性和可操作性。

 

什么是泛型、为什么要使用以及泛型擦除

泛型,即“参数化类型”。创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免运行时出现ClassCastException异常。泛型使得代码简洁我们不需要显式转换和instanceOf转换符。

Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。

类型擦除的主要过程如下:
1)将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2)移除所有的类型参数。

 

Collection和Collections的区别

Collection是合集类的上级接口,继承他的接口有set和list;Collections是针对集合类的一个工具类,它提供一系列静态方法实现各种集合的搜索、排序和线程安全等操作。

 

集合底层数据结构总结

ListArrayList:数组;Vector:数组;LinkedList:双向链表(Jdk1.6前为循环链表)

MapHashMap:JDK8前是数组+链表组成,链表主要是为了解决hash冲突。JDK8以后当链表的长度大于阈值(默认8)时,将链表转化为红黑树,减少搜索时间。LinkedHashMap:继承自HashMap,在底层仍然基于拉链式散列结构由数组和链表或红黑树组成,另外增加了一条双向链表,使得上面的结构可以保持插入的顺序。Hashtable:数组加链表,链表为了解决Hash冲突。TreeMap:红黑树(自平衡的排序二叉树)。

SetHashSet:无序基于HashMap实现;LinkedHashSet:继承自HashSet,内部通过LinkedHashMap实现。TreeSet:有序唯一,基于红黑树。

 

HashMap实现原理

HashMap基于hashing原理,HashMap底层是数组+链表组成。通过put()和get()方法储存和获取对象。当将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

当两个不同的键对象的hashcode相同时它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

 

HashMap和HashTable、ConcurrentHashMap区别

1)HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。
2)HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。
3)HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能一样。
4)HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。
5)HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。
6)哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

concurrentHashMap是线程安全的。它对整个桶数组进行分割分段,再每段上加锁,颗粒度比HashTable小,更推荐使用。JDK8以后使用CAS算法实现。concurrentHashMap同样的键值不允许为null。

 

ArrayList和vector区别

ArrayList和Vector都实现了List接口,都是通过数组实现的。Vector是线程安全的,而ArrayList是非线程安全的。

List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。实际情况下需要多线程访问的时候使用CopyOnWriteArrayList

 

HashSet和TreeSet、linkedHashSet的区别

HashSet底层是hash表,它的元素是无序的,TreeSet是树型结构,它是有序的。linkedHashSet是基于linkedHashMap的,linkedHashMap底层是双链表,所以linkedHashSet存储的顺序排序的。同样的HashMap无序的,HashTree是有序的,linkedHashMap是按插入的顺序排序的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值