Java集合
Thxxxxxx
然鹅我不想简介自己
展开
-
ArrayList方法源码
三种构造函数不带参数的构造函数public ArrayList() { // 如果没有传入初始容量,则使用空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA // 使用这个数组是在添加第一个元素的时候会扩容到默认大小10 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}带初始容...原创 2019-06-25 10:29:05 · 144 阅读 · 0 评论 -
为什么重写HashCode()和equal()
先揭晓答案:重写这俩个方法是为了在使用HashMap 传入自定义Key时,HashMap还能根据需求正常使用。现在有这样的需求:根据Key的属性返回value。不重写会怎样,来看代码class Key{ int i; Key(int i){ this.i=i; }}public class DefineKey { public static void main(Str...原创 2019-08-27 11:15:37 · 121 阅读 · 0 评论 -
手写一个HashMap
interface Map<K,V>{ public V put(K k,V v); public V get(K k); public int size(); public interface Entry<K,V>{ public K getKey(); public V getValue(); }}public class MyHashMap&l...原创 2019-08-20 14:07:04 · 103 阅读 · 0 评论 -
ConcurrentModificationException
在使用迭代器遍历时,ArrayList 内部创建了一个内部迭代器iterator,在使用next()方法来取下一个元素时,会使用ArrayList里保存的一个用来记录List修改次数的变量modCount,与iterator保存了一个expectedModCount来表示期望的修改次数进行比较,如果不相等则会抛出异常;而在在foreach循环中调用list中的remove()方法,会走到fas...原创 2019-08-14 19:45:24 · 75 阅读 · 0 评论 -
Collections工具类
void reverse(List list)//反转void shuffle(List list)//随机排序void sort(List list)//按自然排序的升序排序void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑void swap(List list, int i , int j)//交换两个索引位置的元素...原创 2019-07-30 16:45:24 · 108 阅读 · 0 评论 -
LinkedBlockingQueue的put,take方法
put操作:在LinkedBlockingQueue中有putlcok和takelock俩把锁,put操作使用putlock这把锁,利用lockInterruptibly方法加锁,该方法的作用为:如果该线程被标记为中断,可抛出异常。加锁之后,判断count是否等于容量,相等的话条用await()方法线线程加到条件队列中去,直到唤醒,把元素加入到队列,然后判断一下count+1如果还没有达到容量值...原创 2019-06-27 16:42:16 · 1738 阅读 · 0 评论 -
几个需要扩容的集合
ArrayListprivate void grow(int minCapacity) { int oldCapacity = elementData.length; // 新容量为旧容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); // 如果新容量发现比需要的容量还小,则以需要...原创 2019-06-27 15:28:28 · 242 阅读 · 0 评论 -
CopyOnWriteArrayList的addIfAbsent()方法
大致执行过程:首先获取当前数组存取元素,然后找我们要插入数据的下标值,找到了直接返回false,没找到的话,上锁,再次判断数组是否发生变化,这里多一次判断,我认为是为了防止这种可能性的出现:在判断完是否存在元素和加锁之间,另一个线程加入了我们要加的元素,不判断的话,那么同一个元素就有可能出现俩次,违背了addIfAbsent的意愿。加锁之后,如果数组并没有变的话,那么就执行CopyOnWrite...原创 2019-06-27 10:05:59 · 2705 阅读 · 4 评论 -
ConcurrentHashMap源码分析(转载)
我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别。Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashMap类,知道它的所有方法都未进行同步,因此在多线程环境中是不安全的。为此,Java为我们提供了另外一个HashTable类,它对于多线程同步的处理非常简单粗暴,那就是在HashMap的基础上对其所有方...转载 2019-04-19 21:24:05 · 129 阅读 · 0 评论 -
HashMap中hash函数怎么是实现的?
我们可以看到,在 hashmap 中要找到某个元素,需要根据 key 的 hash 值来求得对应数组中的位置。如何计算这个位置就是 hash 算法。前面说过,hashmap 的数据结构是数组和链表的结合,所以我们当然希望这个 hashmap 里面的元素位置尽量的分布均匀些,尽量使得每个位置上的元素数量只有一个。那么当我们用 hash 算法求得这个位置的时候,马上就可以知道对应位置的元素就是我们...转载 2019-06-02 20:48:24 · 1854 阅读 · 0 评论 -
HashMap 1.7 死循环过程
“死锁”过程为什么 hashmap底层数组大小为2的幂次 ,例如 初始化 16计算hash值 时 (length-1)&(hash)16-1 = 0000 1111 低四位 和hash 相同“死锁” 死循环 俩个线程 put 同时进行扩容时 回发生 环列表数组长度*负载因子< 数据个数 且 所放的位置有...翻译 2019-04-24 09:20:18 · 536 阅读 · 0 评论 -
TreeMap方法源码
构造方法public TreeMap() { comparator = null;}/** * 使用传入的comparator比较两个key的大小 */public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator;}/** * key必须实现Com...转载 2019-06-26 10:29:50 · 119 阅读 · 0 评论 -
为什么HashMap要树化呢?
本质上这是个安全问题。因为在元素放置过程中,如果一个对象哈希冲突,都被放置到同一个桶里,则会形成一个链表,我们知道链表查询是线性的,会严重影响存取的性能。而在现实世界,构造哈希冲突的数据并不是非常复杂的事情,恶意代码就可以利用这些数据大量与服务器端交互,导致服务器端CPU大量占用,这就构成了哈希碰撞拒绝服务攻击, 国内一线互联网公司就发生过类似攻击事件。...转载 2019-05-18 20:50:22 · 644 阅读 · 0 评论 -
HashMap的put方法讲解
public V put(K key, V value) { // 调用hash(key)计算出key的hash值 return putVal(hash(key), key, value, false, true);}static final int hash(Object key) { int h; // 如果key为null,则hash值为0,否则调用k...转载 2019-06-13 19:56:48 · 800 阅读 · 0 评论 -
ArrayBlockingQueue中的方法
添加操作(1)add(e)时如果队列满了则抛出异常;(2)offer(e)时如果队列满了则返回false;(3)put(e)时如果队列满了则使用notFull等待;(4)offer(e, timeout, unit)时如果队列满了则等待一段时间后如果队列依然满就返回false;删除操作(1)remove()时如果队列为空则抛出异常;(2)poll()时如果队列为空则返回...原创 2019-06-15 22:22:40 · 1212 阅读 · 0 评论 -
HashMap方法源码
三种构造函数public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR);}public ...转载 2019-06-25 18:19:00 · 206 阅读 · 0 评论 -
LinkedList方法源码
在队首队尾添加元素方法// 从队列首添加元素private void linkFirst(E e) { // 首节点 final Node<E> f = first; // 创建新节点,新节点的next是首节点 final Node<E> newNode = new Node<>(null, e, f); // 让...原创 2019-06-25 11:07:34 · 144 阅读 · 0 评论 -
你不知道LinkedList中的方法
linkedList.indexOf(3) // 返回此列表中首次出现的指定元素的索引linkedList.lastIndexOf(3) // 返回此列表中最后出现的指定元素的索引linkedList.removeFirstOccurrence(3) // 从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表)linkedList.removeLastOccurren...原创 2019-09-01 10:29:23 · 246 阅读 · 0 评论