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