首先要说一下数组
1.数组和集合的区别
空间大小比较:数组的空间大小是固定了,所以需要提前确定合适的空间大小,集合的空间是动态增长的,而且每次添加新的元素的时候都会检查内部数组的空间是否足够存储
内容比较:数组在存放的时候一定是同种类型的元素,集合就不一定了可以包含基本类型和对象类型,集合却只能包含对象类型
方法上的比较:集合方法比数组更多样化,支持迭代器操作
集合的种类
2.Collection 和 Collections 有什么区别?
1、Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
2、Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
3.List、Set、Map 之间的区别是什么?
List接口
继承了Collection接口
List集合的特点:
-
可以添加重复的数据
-
数据可以通过下标单独访问
-
数据可以排序
Set接口
继承了Collection接口
Set集合的特点:
-
不能添加重复的数据
-
数据不能单独访问
Map接口
Map集合的特点:
-
数据以键值对保存
-
键不能重复
-
数据可以通过键访问
4.ArrayList 和 LinkedList 的区别是什么?
-
数据结构:ArrayList是数组,LinkedList是双向链表
-
ArrayList查找性能高(因为通过下标快速定位),插入和删除性能低(移动大量数据)
-
LinkedList查找性能低(因为要向前或向后依次查找),插入和删除姓高(只需要修改前后指针,不用移动)
5.ArrayList 和 Vector 的区别是什么?
-
Vector是线程安全的,ArrayList是非线程安全的
-
ArrayList性能高于Vector
-
Vector的扩容量可以指定,如果不指定就扩容2倍;ArrayList扩容1.5倍
6.set集合
HashSet集合
数据结构:散列表
通过哈希算法(散列)计算数据的位置,无序
注意:添加的数据必须实现hashCode和equals方法
HashSet中封装一个HashMap集合,数据添加到HashMap的键
reeSet集合
添加的数据会自动排序,对象必须实现Comparable接口
LinkedHashSet集合
一种散列表集合,同时添加单向链表保存添加顺序
能够保留添加顺序
7.HashMap 和 Hashtable 和ConcurrentHashMap有什么区别?
hashtable用法和结构和HashMap一样
区别:
-
Hashtable是线程安全的,HashMap是非线程安全的
-
HashMap的性能高于Hashtable
-
Hashtable不能接收null作为键和值,HashMap可以
hashTable再进行操作时会锁住一整个code表
ConcurrentHashMap是cope表分成了很多段(即16个桶),那么操作时就会分段锁,可以同时进行多个操作
8.hashMap的原理
数据结构: 一维数组 + 单向链表 + 红黑树
添加数据的步骤:
-
通过键的hashCode值计算出数组的下标
-
判断该下标位置是否为空,如果为空,直接添加键值对
-
如果该位置有数据(哈希冲突、哈希碰撞),就调用键的equals方法和该位置的原有键做比较
-
如果相等,就用新值覆盖原来的值
-
如果不相等,放到原有数据后面,形成单向链表
-
在jdk1.8后,单向链表的长度达到8,就转换为红黑树
HashMap的默认长度 16
TreeMap集合
键会自动排序
LinkedHashMap集合
键会保留添加顺序