集合

1、ArrayList与LinkedList的异同

同:

  • 是否可扩展:ArrayList和LinkedList都属于可扩展的
  • 是否同步安全:ArrayList和LinkedList都是不同步的,线程不安全

异:

  • 底层数据结构:ArrayList底层实现是数组,LinkedList底层实现是双向链表
  • 是否支持随机访问:ArrayList支持随机访问,可通过索引随机访问,LinkedList只能遍历访问。所以ArrayList查询快,LinkedList查询慢。
  • 插入和删除是否受元素位置的影响:ArrayList插入删除元素受操作位置影响,插在列表末尾不受影响,插在列表中间,则插入位置后面的元素都需要移动。LinkedList插入不受位置影响。所以ArrayList增删慢,LinkedList增删快。
  • 内存地址是否连续:ArrayList在内存中的空间是物理上,逻辑上都是连续的,LinkedList在内存的空间物理上可以是不连续的,逻辑上是连续的。
  • 内存空间浪费:ArrayList在列表的末尾总是要预留一定容量的空间,LinkedList存储时要存储节点的前驱和后继。

2、ArrayList 与 Vector 区别

ArrayList是线程不安全的,Vector是线程安全的。所以ArrayList适合在单线程下使用,Vector适合在多线程下使用。

3、Array 和 ArrayList 有什么区别?什么时候该应 Array 而不是 ArrayList 呢?

  • Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
  • Array 大小是固定的,ArrayList 的大小是动态变化的。
  • ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator() 等等。

对于处理固定大小的基本数据类型用Array,其他情况尽量用ArrayList。

4、HashMap的数据结构是什么

jdk1.7中HashMap是采用“数组+链表”的数据结构。在jdk1.8中,HashMap采用“数组+链表+红黑树”的数据结构。


image.png

5、HashMap中的常见参数

  • HashMap默认初始化容量(数组大小)为16。
  • HashMap默认最大容量(数组大小)为2的30次方。
  • HashMap链表转红黑树链表的长度需要达到8。
  • HashMap红黑树转链表红黑树中节点个数需要达到6。
  • HashMap默认装载因子为0.75,当数组实际占用容量超过数组长度的0.75时,对HashMap扩容。
  • HashMap链表转红黑树的条件之一,哈希表长度大于等于64。

6、HashMap.put()方法步骤

image.png

7、HashMap怎么确定元素索要插入桶的位置?

1、拿到所导入元素key的hashcode做hash运算,得到一个hash值。
2、hash值和(哈希表长度-1)做与运算得到桶的位置。

8、什么是哈希冲突?HashMap怎么解决哈希冲突?

什么是哈希冲突:当两个不同的输入值,根据同一hash函数计算出相同的hash的现象,我们就把它叫做碰撞(哈希碰撞、哈希冲突)

HashMap解决哈希冲突:

  • 使用链地址法,使得具有相同hash值的不同对象都能在HashMap中存储。
  • 使用两次扰动函数(Hash函数)来降低哈希冲突的概率

9、什么是hash函数?HashMap为什么要实现hash函数?

hash函数是HashMap中实现的根据对象hashcode值来计算出一个hash值。使用hash函数主要是因为,如果使用hashcode取余来定位key,这样hashcode只有低位参与了运算,高位没有参与,哈希冲突的概率比较大。hash函数是对象的hashcode值与自己右移16位得到的值进行异或运算得到hash值。使得hashcode每一位都参与了运算,降低哈希冲突的概率。

10、什么是HashMap 2次扰动?

HashMap两次扰动指的是hash函数,一次是hashcode位运算,一次是异或运算。2次扰动降低哈希冲突的概率。

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);// 与自己右移16位进行异或运算(高低位异或)
}

11、为什么HashMap数组长度要保证为2的幂次方呢?

因为HashMap定位key在数组中的位置是

(n - 1) & hash  //数组长度-1 和 hash值做按位与运算

只有数组长度(n)为2的幂次方,n - 1的二进制数才能全为1。这样与hash值做按位与运算时,hash值参与运算的位才会有意义,避免有的位置永远不能存储元素,增加空间的利用率,避免浪费。
例子:
如果 length 不是 2 的次幂,比如 length 为 15,则 length - 1 为 14,对应的二进制为 1110,在于 h 与操作,最后一位都为 0 ,而 0001,0011,0101,1001,1011,0111,1101 这几个位置永远都不能存放元素了,空间浪费相当大

12、HashMap中什么时候链表会转为红黑树?什么时候红黑树会转为链表?

1:链表转红黑树
同时满足两个条件:

  • 链表的长度大于等于8
  • 数组长度大于等64时

2:红黑树转链表
当数组扩容时,若存在红黑树的节点数小于等于6,则将其转为链表

13、HashMap数组什么时候扩容,怎么扩容?

  • 插入元素后数组实际占用长度超过数组长度的0.75时扩容
  • 两倍扩容

14、HashMap与HashTable的区别

  • HashMap是非线程安全的,HashTable是线程安全的。
  • HashMap的键和值都允许有null值存在,而HashTable则不行。
  • 因为线程安全的问题,HashMap效率比HashTable的要高。
  • Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

14、ConcurrentHashMap

ConcurrentHashMap是升级版的HashTable,采用分段式锁。

  • 底层实现:数组+链表+红黑树
  • 通过把整个Map分为N个Segment,分别加锁。执行修改操作时只需要获得对应段的锁,而不用获得整个Map的锁。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
  • 执行某些方法时(size()、containsValue())仍然需要获取全部的锁。按顺序获取所有的锁,执行完后又按顺序释放所有锁。

15、HashSet是如何保证数据不可重复的?

HashSet底层的实现是HashMap,HashSet把数据作为key值保存,而value用一个相同的虚值保存。

public boolean add(E e) {
    return map.put(e, PRESENT)==null;// 调用HashMap的put方法,PRESENT是一个至始至终都相同的虚值
}

16、List和Map的区别

  • List是存储单列数据的集合,Map存储的是键值对,是双列数据。
  • List存取是有序的,Map的存取是无序的。

17、什么fail-fast、fail-safe机制?

fail-fast:“快速失败”也就是 fail-fast,它是Java集合的一种错误检查机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。记住是有可能,而不是一定,例如,假设存在线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。
fail-safe:任何对集合结构的修改都会在一个复制的集合上进行,因此不会抛出ConcurrentModificationException。
区别:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容