集合可分为两大类:
一、ArrayList和Vector的区别
共同点:
这两个类都实现了List接口,他们都是有序的集合(储存有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。
区别
同步性:ArrayList是非同步的,Vector是同步的
即便需要同步的时候,我们可以使用Collections工具类来构建出同步的ArrayList而不用Vector。
扩容大小:Vector正常原来的一倍,ArrayList增长原来的0.5倍
二、HashMap和Hashtable的区别
共同点
从储存结构和实现来讲基本上都是相同的,都是实现Map接口
区别
- 同步性:HashMap是非同步的,HashTable是同步的
- 是否允许为null:HashMap允许为null,Hashtable不允许为null
- contains方法:Hashtable有contains方法,而HashMap吧contains方法去掉了,改成了containsValue和containsKey
- 继承不同:
三、List和Map的区别
都是常用的容器,都是接口
不同点
- 储存结构不同:List是储存单列的集合,Map储存的是key—value键值对的集合
- 元素是否可以重复:List允许重复,Map不允许key重复
- 是否有序:List集合是有序的,Map是无序的
四、set里的元素是不能重复的,那么用什么方法来区分重复与否呢?用==还是equals()?
set集合实际大都是使用的是Map集合的put方法来添加元素。
以HashSet为例,Hashset里的元素不能重复
// 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相等,则修改value值。而在Set集合中,value值仅仅是一个Object对象罢了(该对象对Set本身而言是无用的)。
也就是说,Set集合如果添加的元素相同时,是根本没有插入的(仅修改了一个无用的value值 ),而在源码中可以看出,==和equals方法都有使用!
五、Collection和Collections的区别
1.Collection是集合的上级接口,继承它的有Set和List接口
2.Collections是集合的工具类,提供了一系列的静态方法对集合的搜索,查找,同步等操作
六、说出ArrayList,LinkedList的储存性能和特性
ArrayList的底层是数组,LinkedList的底层是双向链表
- ArrayList它支持以角标位置进行索引出对应的元素(随机访问),二LinkedList则需要遍历整个链表来获取对应的元素,因此一般来说ArrayList的访问速度要快于LinkedList
- ArrayList由于是数组,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的,因此一半来说LinkedList的增删速度更快。
6.1扩展: ArrayList的增删未必就是比LinkedList要慢。
如果增删都是在末尾来操作【每次调用的都是remove()和add()】,此时ArrayList就不需要移动和复制数组来进行操作了。如果数据量有百万级的时,速度是会比LinkedList要快的。(我测试过)
如果删除操作的位置是在中间。由于LinkedList的消耗主要是在遍历上,ArrayList的消耗主要是在移动和复制上(底层调用的是arraycopy()方法,是native方法)。LinkedList的遍历速度是要慢于ArrayList的复制移动速度的 如果数据量有百万级的时,还是ArrayList要快。
七、Enumeration和Iterator接口的区别
与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,他会阻止其他线程去修改集合。
区别有三点:
- Iterator的方法名比Enumeration更科学
- Iterator有fail-fast机制,比Enumeration更安全
- Iterator能够删除元素,ENumeration不能删除元素
八、ListIterator有什么特点
- ListIterator继承了Iterator接口,它用于遍历List集合的元素
- ListIterator可以实现双向遍历,添加元素,设置元素
九、并发集合类是什么?
包含线程安全集合类,允许在迭代时修改集合。
- 迭代器被设计为fail—fast的,会抛出ConcurrentModificationException。
- 一部分类为:
- CopyOnWriteArrayList
- ConcurrentHashMap
- CopyOnWriteArraySet
十、Java中HashMap的key值要是为类对象则该类需要满足什么条件?
需要同时重写该类的hashCode方法和equals方法。
- 在插入元素的时候是先算出该对象的hashCode。如果hashCode相等的话,那么表明该对象是存储在同一个位置上。
- 如果调用equals方法,两个key相同,则替换元素
- 如果调用equals方法,两个key不相同,则说明该hashCode仅仅是碰巧相同,此时是散列冲突,将新增的元素放在桶子上。
十一、ArrayList集合加入一万条数据,应该怎么提高效率
ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。所以,我们可以直接在初始化的时候就设置ArrayList的容量,这样就可以提高效率了。