一、JAVA中集合和数组的区别
1. 集合的容量可变,数组的容量不可变
2. 数组只能存储单一类型的数据,集合可以存放各种类型的数据
3.数组可以存放基本数据类型,集合只能存放引用数据 类型,要存放基本数据类型, 就要引用基本数据类型的包装类
数组类型空间必须连续且支持下标访问,集合内存空间可以连续可以不连续,以数组为底层容器的集合支持下标访问,链表不支持
集合可以以一段连续的内存空间(数组)作为底层容器,也可以用使用链表作为底层容器,
使用链表作为底层容器时,增删不会移动大量元素,但数组会移动大量元素(尾部增删除外)
二、Collection和Collections的区别
1.Collections 是一个工具类,具体可以实现Shuffle()打乱元素顺序,Reverse将集合翻转,sort()对元素进行升序排序
2 Collection 是Set、List、Vector集合的父类接口
三、list和set的区别
1.有序性 List按元素存放顺序确定存放的位置,所以集合内元素有序;
Set集合不按存放顺序确定存放的位置,所以Set集合内元素无序。
2. list集合可以存放重复元素,set集合可以去重复.为保证一定存放的是无重复
需要重写 hashcode()和equals()方法.
-
List中提供索引的方式来添加元素和获取元素,而Set并不提供。由此可见List集合可是达到精确的存储和获取,而Set只能一个一个的比较,显然效率和实用性是比不上List集合的
-
List集合是有序存储,Set集合是无序存储。这里的有序和无序针对的是存储地址来说的。
-
List可以存储重复的值,Set不可以存储重复的值
四、ArrayList和LinkedList 和Vector的区别
1. ArrayList 底层是 数组,元素存放的位置都是连续的,查改效率高,增删效率低,线程不安全
2. LinkedList 底层是链表,元素存放的位置不一定是连续的,增删的效率高,查改的效率低,线程不安全
3. Vector 底层是数组,其中的很多方法加锁,线程安全.相对于ArrayList 和LinkedList而言,效率很低
ArrayList和Vector数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。
Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认扩充为原来的1.5倍
Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要稍逊于ArrayList
LinkedList是采用双向列表来实现的,随机访问则效率较低,但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器
五、HashMap和HashTable的比较
1.HashMap是异步的,线程不安全;HashTable是同步的,线程安全
2.HashMap可以存一个KEY为空值,value可以存任意个,HashTable不能存空值
3.HashMao效率高,HashTable效率低
HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口
HashTable:初始size 为11,newsize=olesize*2+1
HashMap:初始size为16,扩容:newsize = oldsize*2,装载因子都是0.75
两者计算hash的方法不同:
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对 应的值为null。在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。Hashtable 的键值都不能 为null,所以可以用get()方法来判断是否含有某个键。
六、HashMap和ConcurrentHashMap区别
1. HashMap是线程不安全的
2. ConcurrentHashMap是线层安全的,是hashTable 和hashMap的结合体.ConcurrentHashMap采用了分段锁技术,不会像HashTable把全表锁住,也不会像HashMap不上锁.
3. ConcurrentHashMap中一次锁住一个桶。ConcurrentHashMap默认将hash表分为16个桶
3.1 HashMap在多线程情况下操作不能保证数据同步。
3.2 ConcurrentHashMap多线程操作同样不能保证数据同步。
七、HashMap底层实现原理
首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率
八、HashMap和LinkedHashMap的区别
LinkedHashMap 是HashMap的一个子类,但是内部维持了一个双向链表,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。
在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。