前几天在一个群里看到有人讨论hashmap中的加载因子为什么是默认0.75. HashMap源码中的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; 当时想到的是应该是“哈希冲突”和“空间利用率”矛盾的一个折衷. 跟数据结构要么查询快要么插入快一个道理,hashmap就是一个插入慢.查询快的数据结构. 加载因子是表示Hash表中元素的填满的程度. 加载因子越大,填满的元素越多,空间利用率越高,但冲突的机会加大了. 反之,加载因子越小,填满的…
Hashtable 初始容量是11 ,扩容 方式为2N+1; HashMap 初始容量是16,扩容方式为2N; 阿里的人突然问我为啥扩容因子是0.75,回来总结了一下: 提高空间利用率和 减少查询成本的折中,主要是泊松分布,0.75的话碰撞最小, HashMap有两个参数影响其性能:初始容量和加载因子.容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量.加载因子是哈希表在其容量自动扩容之前可以达到多满的一种度量.当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行扩容.r…
说在前面 ​ 在HashMap中,默认创建的数组长度是16,也就是哈希桶个数为16,当添加key-value的时候,会先计算出他们的哈希值(h = hash),然后用return h & (length-1)就可以算出一个数组下标,这个数组下标就是键值对应该存放的位置. ​ 但是,当数据较多的时候,不同键值对算出来的hash值相同,而导致最终存放的位置相同,这就是hash冲突,当出现hash冲突的时候,该位置的数据会转变成链表的形式存储,但是我们知道,数组的存储空间是连续的,所以可以直接使用下标…
新入公司,阅读代码的时候发现了一行代码,为 Map<String, String> map=new HashMap<>(1); 对于这个括号里面的1不能理解,于是查了资料,大概了解了. 解释如下:这个1被称为加载因子. API: /** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and the default load factor (0.75).…
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因子的系数小于等于1,意指  即当 元素个数 超过 容量长度*加载因子的系数 时,进行扩容. 另外,扩容也是有默认的倍数的,不同的容器扩容情况不同. List 元素是有序的.可重复 ArrayList.Vector默认初始容量为10 Vector:线程安全,但速度慢 底层数据结构是数组结构 加载因子为…
HashMap: public HashMap(int initialCapacity, float loadFactor) { //初始容量不能<0 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); //初始容量不能 > 最大容量值,HashMap的最大容量值为2^30 if (initialCapa…
文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Java中,优先使用ClassPath,因为很多程序库在更改路径时更改的是ClassPath而不是Path,比如maven项目把resources目录添加到了classpath里面而没有更改path.在这两种路径表达方式中,/都表示根路径. 可以说:path方式使用的是文件系统的方式:classpath使…
Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader.ExtClassLoader与AppClassLoader. Bootstrap Loader是由C++撰写而成,预设上它负责搜寻JRE所在目录的classes或lib目录下的.jar档案中(例如rt.jar)是否有指定的类别并加载(实际上是由系统参数sun.boot.class.path指定):预设…
今天同事提出了一个问题: 将对象a 转化为类型b,b 的classpath 是在配置文件中配置的,需要在运行中使用Class.forName 动态load进来,因为之前从来没有想过类似的问题,所以懵掉了,然后迅速的查找资料,先将结果做下记录,欢迎大家来讨论一下. 想法一: 能否使用Class.forName的返回值(Class<?>)来进行类型转换,代码如下: a o = new a(); (Class.forName("test.java.b"))o; 类型转换基本上都是…
在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList.LinkedList这种也比较多,而像那几个线程同步的容器就用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐使用了,这是个比较老式的线程安全的容器,JDK比较推荐的是采用Collections里面的关于线程同步的方法. 问题来源: 1.为什么要有HashMap? <Thinking In Java>里面有一个自己采用二维数组实现的保存key-valu…