简介:集合是程序员经常用到但很少人能弄的清楚它们之间的关系,也面试官会经常问这类的问题,这篇文章会给你带来收获噢~
首先
什么是集合?
简单的来说集合就是一个方数据(对象引用)的容器。它包括我们常见的List、Set、Map等,那他们之间的关系呢请看下面的这幅图:
iterator方法有三个常用属性:
hasNext():是否存在下一个;
next():获取下一项;
remove():删除有next()最新返回的项。
Conllection接口常用的方法:
size():返回集合中的项数;
isEmpty():判断集合中是否为空
contains(Object):判断集合中是否包含某项
clear():从集合清除某项
add():从集合添加某项
remove(Object):从集合中删除某项
iterator():遍历集合
那么问题一来了:Iterator接口的remove()与Conllection接口的remove()方法有什么区别?
从3个点回答:
1,参数方面:iterator的remove不带参而Conllecion接口的remove带参;
2,性能方面:Conllection接口的remove方法先采用单链表结构一个一个遍历的找到再删除,所以效率低;
Iterator的remove方法结合了next()方法使用直接删除,所以效率高。
3,容错方面:使用Iterator遍历时,Conllection的remove会报异常(原因:首先Conllection就是一个集合,调用iterator时又创建了一个集合,而再集合里面remove,只是移除了你创建的集合,而原来的Conllection集合里面的元素没变,个数不一样,所以会报异常),而Iterator遍历不会,因为iterator内部的对象的个数和原来的个数一样。
问题二:List、Set、Map之间的区别?
List | Set | Map |
继承Collection接口 | 继承Collection接口 | 不继承Collection接口 |
重复/有序 | 不重复/无序 | 无序/键值对存储,键唯一,值可重复 |
可以插入多个null | 只能插入一个null | 键只允许一个null值可以有多个null |
问题三:ArrayList(数组结构)与LinkedList(链表结构)的区别?
ArrayList:
优点:get和set调用花费常数时间,也就是查询的速度快;
缺点:添加删除的速度慢。
LinkedList:
优点:添加和删除的速度快;
缺点:对get和set的调用花费昂贵,不适合做查询。
问题四:HashSet、TreeSet、LinkedHashSet的区别?
1,需要速度快的集合,使用HashSet;
2,需要集合有排序功能,使用TreeSet;
3,需要按照插入的顺序存储集合,使用LinkedHashSet。
问题五:HashMap、TreeMap、linkedHashMap的区别?
1,HashMap查询速度最快;
2,TreeMap有集合有排序功能;
3,需要按照插入的顺序存储集合,用LinkedHashMap;
那么引发了问题六:HashMap与HashSet的区别?
HashMap | HashSet |
实现了Map接口 | 实现了Set接口 |
存储键值对 | 存储对象 |
添加元素用put()方法 | 添加元素用add()方法 |
使用key计算hashcode | 使用成员对象计算hashcode |
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象 | HashSet较HashMap来说比较慢 |
问题七:HashMap的实现原理?
首先HashMap继承了Map集合,通过put和get存储和获取对象,存储对象时,我们将K/V传给put方法时,它调用hashcode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量。如果容量超过了默认的容量会按16*0.75=12来扩充,16表示初始数量,0.75表示容量因子,获取对象时,我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对。
问题八:Array与ArrayList有什么区别?(问的是数组与集合的区别)
实例化Array时会定义一个容量大小和数据类型,长度是固定的,而且只能存储相同数据类型的数据。
而ArrayList可以存储不同数据类型的数据,长度是可变的。
问题九:怎样将一个数组转化为List,list转化为数组?
数组转化为List:Arrays.asList(数组)
list转化为数组:list.toArray()
好了,今天就总结到这里了。