一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代码还是同事的代码? 很多看过我博客的老朋友总是留言让我出一套windbg的系列或者视频,我也不会呀,没办法,人在江湖飘,迟早得挨上几刀,逼着也得会几个花架子,废话不多说,这一篇就来看看 HashSet 是如何扩容的. 二:HashSet的扩容机制 1. 如何查看 了解如何扩容,最好的办法就是翻看Ha…
一.HashSet保证元素唯一原理: 依赖于hashCode()和equals()方法1.唯一原理: 1.1 当HashSet集合要存储元素的时候,会调用该元素的hashCode()方法计算哈希值 1.2 判断该哈希值对应的位置上,是否有元素 1.3 如果该哈希值位置上没有元素,那么就直接存储该元素 1.4 如果该哈希值位置上有元素,那么就产生了哈希冲突 1.5 如果产生了哈希冲突,就得调用该元素的equals()方法,和该位置上的所有元素进行一一比较:       如果有任何一个元素与该元素相…
一.数组与集合比较 数组: 1)长度开始时必须指定,而且一旦指定,不能更改 2)保存的必须为同一类型的元素 3)使用数组进行增加/删除元素-比较麻烦 集合: 1)可以动态保存任意多个对象,使用比较方便 2)提供了一系列方便的操作对象的方法: add.remove.set. get等 3)使用集合添加,删除新元素-更加简洁 二.常见集合体系图 (1)常见单列集合 List: 有序可重复.支持索引.可根据索引值取数据.可以存入多个null值 Set: 无序不可重复.无索引.最多只包含一个null值…
JAVA中的部分需要扩容的内容总结如下:第一部分: HashMap<String, String> hmap=new HashMap<>(); HashSet<String> hset=new HashSet<>(); Hashtable<String, String> htable=new Hashtable<>();第二部分: CopyOnWriteArrayList<String> coarray=new CopyO…
在面试后台开发的过程中,集合是面试的热话题,不仅要知道各集合的区别用法,还要知道集合的扩容机制,今天我们就来谈下ArrayList 和 HashMap的默认大小以及扩容机制. 在 Java 7 中,查看源码可以知道:ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂,为什么呢???下文有解释).这就是 Java 7 中 ArrayList 和 HashMap  类 的代码片段: // from ArrayList.java JDK 1.7 pri…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) Java 中提供了很多的集合类,包括,collection的子接口list.set,以及map等.由于它们的底层构成不同,以及数据的构造为单列.多列.可重复.不可重复,导致其扩容机制也不尽相同. 一.List 获取ArrayList 容量大小的方法: public static int getArrayListCapacity(ArrayList<?> arrayList) { Class<A…
本篇主要分析ArrayList的自动扩容机制,add和remove的相关方法. 作为一个list,add和remove操作自然是必须的. 前面说过,ArrayList底层是使用Object数组实现的.数组的特性是大小固定,这个特性导致的后果之一就是,当ArrayList中成员个数超过capacity后,就需要重新分配一个大的数组,并将原来的成员拷贝到新的数组之中. add操作前都需要保证capacity足够,因此扩容机制和add放在一起讲解. 1.ArrayList的自动扩容机制 ArrayLi…
什么时候扩容: 网上总结的会有很多,但大多都总结的不够完整或者不够准确.大多数可能值说了满足我下面条件一的情况. 扩容必须满足两个条件: 1. 存放新值的时候当前已有元素的个数必须大于等于阈值 2. 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值) 下面我们看源码,如下: 首先是put()方法 public V put(K key, V value) { //判断当前Hashmap(底层是Entry数组)是否存值(是否为空数组) if (t…
https://www.jianshu.com/p/c1b616ff1130 http://youzhixueyuan.com/the-underlying-structure-and-principle-of-hashmap.html 为什么Map桶中个数超过8才转为红黑树: https://mp.weixin.qq.com/s?__biz=MzIwMzY1OTU1NQ==&mid=2247485820&idx=1&sn=c1369ba4235fd546c76ccd56eb770…
一.ArrayList的扩容机制 1.扩容的计算方式是向右位移,即:newSize = this.size + (this.size>>1).向右位移,只有在当前值为偶数时,才是除以2:奇数时是抹去最后一位,也就是先减1,然后除以2:附上源码,如下图: 2.扩容的上限:ArrayList的长度并不是没有限制的,它的默认最大长度值是,Integer.MAX_VALUE-8,但是可以突破到 Integer.MAX_VALUE.所以请注意:如果到达ArrayList的默认最大值的时候,扩容不再是1.…