分类 jdk源码 中的文章

ArrayList和LinkedList集合源码

ArrayList 底层使用数组实现,适合插入较少 适合随机查找O(1),原理:地址连续 扩容O(n) 源码中int newCapacity = oldCapacity + (oldCapacity » 1);即扩容为原来的1.5倍 插入O(n),尾插为O(1),最坏O(n),平均即为 O(n) LinkedList 底层使用(双向)链表,适合插入较多 随机查找O(n) 头尾插入O(1) 使用场景 ArrayList:一般场景,都是用ArrayList来代表一个集合,只要别频繁的往里面插入和灌入大量的元素就可以了,遍历,或者随机查,都可以。 LinkedList:适合,频繁的在list中插入和删除某个元素,然后尤其是LinkedList他其实是可以当做队列来用的,这个东西的话呢,我们后面看源码的时候,可以来看一下,先进先出,在list尾部怼进去一个元素,从头部拿出来一个元素。如果要在内存里实现一个基本的队列的话,可以用LinkedList……

阅读全文

Hashmap源码

Hashmap 对key进行hash,放到数组对应的位置 p = tab[i = (n - 1) & hash] 。i的位置为i = (n - 1) & hash 从JDK8以后结构为:数组 + 链表 + 红黑树,从原来的hash冲突时由纯链表变为,当链表长度大于8以后变为红黑树。 fail-fast机制是什么东西,这个在开发的时候是一个比较常见的异常,ConcurrentModificationException 核心变量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //应该是数组的默认的初始大小,是16,这个跟ArrayList是不一样的,初始的默认大小是10 //这个数组的大小,一般会自己手动指定一下,就跟你用ArrayList一样,你需要去预估一下你的这个数据结构里会放多少key-value对,指定的大一些,避免频繁的扩容 static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认的负载因子,如果你在数组里的元素的个数达到了数组大小(16) * 负载因子(0.75f),默认是达到12个元素,就会进行数组的扩容 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; } //这是一个很关键的内部类,他其实是代表了一个key-value对,里面包含了key的hash值,key,value,还有就是可以有一个next的指针,指向下一个Node,也就是指向单向链表中的下一个节点 //通过这个next指针,就可以形成一个链表 transient Node<K,V>[] table; //这个是什么东东?Node<K, V>[],这个数组就是所谓的map里的核心数据结构的数组,数组的元素就可以看到是Node类型的,天然就可以挂成一个链表,单向链表,Node里面只有一个next指针 transient int size; //这个size代表的是就是当前hashmap中有多少个key-value对,如果这个数量达到了指定大小 * 负载因子,那么就会进行数组的扩容 int threshold; //这个值,其实就是说capacity(就是默认的数组的大小),就是说capacity * loadFactory,就是threshold,如果size达到了threshold,那么就会进行数组的扩容,如果面试这么回答,你就是在打自己的脸。扩容的时机是size>threshold //负载因子,默认值,threshold,扩容,扩容,rehash的算法,JDK 1.……

阅读全文