zoukankan      html  css  js  c++  java
  • Java基础-容器

    一、整体架构

    几个基础问题:

    1.List如何排序?

    2.List删除某个元素

    3.对比问题(关键是掌握每个的特性):

      List和Set的区别

      ArrayList和HashSet的区别

      HashMap和Hashtable区别

    二、ArrayList

    1.概述

    2.源码

    3.扩容机制

    4.快速失败机制

    5.CopyOnWrite原理及缺点

    三、HashSet

    四、HashMap

    1.hashmap的数据结构 

      - 数组+链表+红黑树(jdk8)

    //数组
    Node[] table
    
    //数组元素的结构
    static class Node<K,V> implements Map.Entry<K,V> {
            final int hash;    //用来定位数组索引位置
            final K key;
            V value;
            Node<K,V> next;   //链表的下一个node
    }

      - 数组table长度length大小强制是2的n次方(“强制”的意思是不管你传入的是否是2的n次方,都会处理成2的n次方),那为什么是2的n次方呢?

          原因是:定位元素在table位置,当length为2的n次方时,有一个规律 “h& (length-1)=h%length”,然而运算效率上&比%元素高,所以底层强制2的n次方。

          简单一句话就是:HashMap中的hash算法,当length为2的n次方时,&比%效率更高

    2.hash冲突解决

      - HashMap解决冲突用的是链地址法,也就是用数组+链表这种结构来解决hash冲突的

    3.机制扩容

      - 扩容的时机(可以参考这篇文章 https://blog.csdn.net/u014532901/article/details/78936283)

         当map中包含的Node的数量大于等于threshold = loadFactor * capacity的时候,且新建的Node刚好落在一个非空的桶上,此刻触发扩容机制,将其容量扩大为2倍

      - 扩容的rehash造成并发死锁问题

        

    3.红黑树

    4.最小树化容量

    5.hash冲突解决

    五、Hashtable

    六、ConcurrentHashMap

    1.jdk7

    2.jdk8

    七、其他面试题

  • 相关阅读:
    用户管理 之 Linux 系统中的超级权限的控制
    硬件管理 之 存储设备分区操作及文件系统管理概述
    用户管理 之 Linux 用户(User)查询篇
    软件工程——需求工程
    自动装载模块
    管理内核模块
    模块功能的注册和取消
    编程实现将任意的十进制整数转换成R进制数
    数据流图分析与设计
    软件工程——系统工程
  • 原文地址:https://www.cnblogs.com/yejiang/p/13507548.html
Copyright © 2011-2022 走看看