每日问答2

一、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的遍历速度和他的容量有关。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值