声明,本文用的是jdk1.8
花了一个星期,把Java容器核心的知识过了一遍,感受集合已经无所畏惧了!!(哈哈哈....),如今来总结一下吧~~java
回顾目录:面试
Java容器可分为两大类:数组
Collection安全
List微信
Set多线程
HashSet并发
Mapapp
HashMap框架
着重标出的那些就是咱们用得最多的容器。工具
其实,我也不知道要怎么总结好,由于以前写每一篇的时候都总结过了。如今又把他们从新罗列出来好像有点水,因此,我决定去回答一些Java容器的面试题!
固然了,个人答案未必就是正确的。若是有错误的地方你们多多包含,但愿不吝在评论区留言指正~~
共同点:
区别:
同步性:
扩容大小:
共同点:
区别:
同步性:
是否容许为null:
contains方法
继承不一样:
共同点:
不一样点:
存储结构不一样:
元素是否可重复:
是否有序:
咱们知道Set集合实际大都使用的是Map集合的put方法来添加元素。
以HashSet为例,HashSet里的元素不能重复,在源码(HashMap)是这样体现的:
// 1. 若是key 相等 if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; // 2. 修改对应的value if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; }
添加元素的时候,若是key(也对应的Set集合的元素)相等,那么则修改value值。而在Set集合中,value值仅仅是一个Object对象罢了(该对象对Set自己而言是无用的)。
也就是说:Set集合若是添加的元素相同时,是根本没有插入的(仅修改了一个无用的value值)!从源码(HashMap)中也看出来,==和equals()方法都有使用!
ArrayList的底层是数组,LinkedList的底层是双向链表。
ArrayList的增删未必就是比LinkedList要慢。
若是删除操做的位置是在中间。因为LinkedList的消耗主要是在遍历上,ArrayList的消耗主要是在移动和复制上(底层调用的是arraycopy()方法,是native方法)。
这个我在前面的文章中也没有详细去讲它们,只是大概知道的是:Iterator替代了Enumeration,Enumeration是一个旧的迭代器了。
与Enumeration相比,Iterator更加安全,由于当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。
区别有三点:
看一下源码的方法就知道了:
Java1.5并发包(java.util.concurrent)包含线程安全集合类,容许在迭代时修改集合。
一部分类为:
须要同时重写该类的hashCode()方法和它的equals()方法。
通常来讲,咱们会认为:只要两个对象的成员变量的值是相等的,那么咱们就认为这两个对象是相等的!由于,Object底层比较的是两个对象的地址,而对咱们开发来讲这样的意义并不大~这也就为何咱们要重写equals()
方法
重写了equals()方法,就要重写hashCode()的方法。由于equals()认定了这两个对象相同,而同一个对象调用hashCode()方法时,是应该返回相同的值的!
肯定完咱们的集合类型,咱们接下来肯定使用该集合类型下的哪一个子类~我认为能够简单分红几个步骤:
是否须要同步
迭代时是否须要有序(插入顺序有序)
是否须要排序(天然顺序或者手动排序)
ArrayList的默认初始容量为10,要插入大量数据的时候须要不断扩容,而扩容是很是影响性能的。所以,如今明确了10万条数据了,咱们能够直接在初始化的时候就设置ArrayList的容量!
这样就能够提升效率了~
2018年4月15日17:14:03,上面找了一些面试题答了一下,感受不够过瘾呀。不少我以为比较重要的知识点我都没有找到对应的面试题(可能我搜索的能力太水了?)。
将这篇文章做为集合的总结篇,但以为没什么好写就回答一些面试题去了,找了一会面试题又以为不够系统。而这篇总结我又不想复制前面的章节总结到这里来。因而我决定画一个脑图来结束这篇文章!
2018年4月15日19:31:33 画完啦!!!!!
须要更多脑图的同窗可关注公众号:Java3y,回复【脑图】便可~
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够 关注微信公众号:Java3y。为了你们方便,刚新建了一下 qq群:742919422,你们也能够去交流交流。谢谢支持了!但愿能多介绍给其余有须要的朋友
文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
目前初步打算写多线程,大家以为怎么样呢?能够在评论区留言~