欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 面试题----集合相关

程序员文章站 2022-05-06 17:52:32
...

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区别

  1. HashMap是线程不安全的
  2. ConcurrentHashMap是线层安全的,是hashTable 和hashMap的结合体.ConcurrentHashMap采用了分段锁技术,不会像HashTable把全表锁住,也不会像HashMap不上锁.
  3. 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的遍历速度和他的容量有关。