如何向面试官讲集合?

请问你是怎样理解集合的? 按照以下四条线去讲

1、基本概念

集合在JAVA里是一个庞大的框架,什么是框架呢?就是很多类很多集合。从JDK的层级结构来讲,集合的顶层是一个接口叫Iterable,接下来是Collection,再接下来是List、Set,还有一个不继承任何接口的Map,这是我们常用的几个体系(几个分支)。

现在阐述一下List的特点,是一个接口,实现类有ArrayList、LinkedList、Vector,这几个接口的共同特性是,第一:允许存储相同的值。第二:有序(先进先出)。第三:ArrayList和LinkedList不是线程安全的,而Vector是线程安全的。也就是当一个线程在操作这个集合的增删改,其他线程无法参与。

Set系列有HashSet、TreeSet,这个系列的特点第一:不允许有重复元素。第二:无序,第三:Set集合的底层是链表,一个元素保存着上一个元素的地址和下一个元素的地址,而ArrayList是一个数组。TreeSet是有序的,它支持两种排序方式,自然排序和客户化排序。

接下来是Map的系列,它是键值对的方式存储的,它有以下几个几个实现类,HashMap,HashTable,TreeMap,LinkedHashMap, 还有ConcurrentHashMap。HashTable和Vector一样是线程同步的。ConcurrentHashMap一般用于底层,比如Sping中的IOC容器就是采用的这个集合。 为了在Map集合遍历方便,还有一个比较特殊的内部接口叫做Entry,它负责成双成对的拿到Map集合中的元素。

2、深度拓展

我们知道AarryList和数组的区别是,第一:不定长。第二:不同类。涉及两个问题,第一:既然是不同类,比如我们装的是int的1,而在AarryList是Interger的1,所以它有个自动装箱拆箱的过程。于是为了考虑效率,我们可以考虑使用范型集合,我们的集合中可以规定存储某种类型,这样就避免了频繁的装箱拆箱的过程,缺点是使这个集合装的元素种类比较狭隘。第二:我们的集合装进去以后,如果超出了此集合能够容纳的极限值,将会发生自动扩容。

那我们以ArrayList为例,ArrayList的底层是数组。那么它就会将老数组的元素拷贝到新数组,那么如此一来,随着频繁的扩容,会使以前的老数组,将不断成为垃圾,我们集合底层的扩容最终调用的是System.ArraysCopy(),从源码中看到的。

我们扩容的规律当储蓄的元素超过数组的长度就会拷贝出一个是原数组1.5倍的新数组,所以说集合的扩容,是消耗系统的一个动作。为了减少这种损耗,如果知道元素的数量,尽量在创造集合的时候,在构造方法里确认它的大小,这也是我们在实际的开发设计当中,所采用的一个策略。避免频繁的扩容。

那么Set集合是怎样知道我们的数组是重复的呢?主要靠两个方法,一个是equals()和hashCode(),只有两者完全相同,它才会认为两个相同。于是我们在存储对象的时候,比如说商品1,商品2……为了避免两个元素相同,我们应该要重写这个类的equals()和hashCode(),才能完美的发挥去重的功能。有某一些集合可以排序,比如说TreeSet,TreeSet,它们是以存在集体中的元素必须 要实现Comparable接口或者Comparator接口,我们称之为自然排序和客户化排序,尽量使用客户化排序,因为这是一种无侵入式的设计。创建一个类,这个类去实现Comparator,这样我们也能达到排序的目的,如果不这么做,将会报异常,叫做类无法转换异常。

接下来再讲讲Map,HashTable不允许存储Null,而HashMap可以,HashTable和List里的Vector一样是线程安全的。LinkedHashMap是有序的,HashMap扩容的底层也是数组,它的默认值为16,扩容因子是0.75,当达到12时,会达到32,和ArrayList不太一样。

3、项目运用

在实际项目当中,我们经常会用到集合的遍历,强烈推荐使用迭代器,因为迭代器在进行遍历的时候,可以同时进行业务的操作,比如判断删除,它是不会出现异常的,但是,其它的常规循环会出现异常。

集体还有n多个查询 的操作,比如说我想查询元素个集合中,我想求出最大值,最小值,所以我们集合框架为我们提供了一个很牛逼的框架,叫做Collections,它都有自带的方法,可以帮我们解决这些问题。包括二分查找,排序,填充……跟我们的数组相对应是Arrays.

4、常见异常

我们在实际工作当中,有一个异常要注意,稍不注意,就会掉入坑,也就是说,当我们在用一个list,我们可以用数组来得到,比如Arrays.asList得到的一个list,但这个list无法在增加元素,因为那个asList得到的集合是一个固定了大小的集合,不允许随便操作。这个异常很容易出问题。(也可以讲一个故事)。

如果你强行往hashtable放一个null,马上会出现空指针。

如果你往treeMap里装没有实现Comparable的类,它将报类无法转换异常。

综上所述,集体是一个庞大的体系!有大概20多个类和接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值