1.roundUpToPowerOf2()和tableSizeFor()是什么 roundUpToPowerOf2():JDK1.7中HashMap初始化时的一个方法,目的为:返回大于或等于最接近输入参数的2的整数次幂的数 tableSizeFor():JDK1.8中HashMap构造函数中用于初始化扩容阈值threshold的一个方法,其目的同上:返回大于或等于最接近输入参数的2的整数次幂的数2.roundUpToPowerOf2()方法解析 ro...
HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 hash使用:int hash = key.hashCode(); int i...
1.Iterable是什么 Iterable接口是java集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素。源码第一行告诉我们:实现此接口的对象可以使用增强for,看来这个甜甜的语法糖的底层实现确实是使用了迭代器。Iterable接口内部有三个成员方法: 第一个接口来自JDK1.5,后两个来自JDK1.8。不知道小伙伴会不会有疑问,反正我第一次看的时候疑惑得很,为什么接口里可以写实现方法!!!仔细一看有个default,好吧Java 8的新产...
1.SynchronizedList、Vector概述 SynchronizedList:java.util.Collections中的一个静态内部类,可以通过List进行构造,用于返回线程安全的List集合 Vector:java.util包中的类,一个和ArrayList相同底层实现的线程安全的List集合 那么问题来了,这两个类一定存在着某种不同,否则直接把老的类删除掉就可以了,究竟有哪些不同呢,我们往下看。2.SynchronizedList和Ve...
1.二叉搜索树(Binary Search Tree) 二叉搜索树:又称为二叉排序树, 属于树的一种, 通过二叉树将数据组织起来, 树的每个节点都包含了健值key、数据值data、左子节点指针、右子节点指针。其中健值key是最核心的部分, 它的值决定了树的组织形状; 数据值data是该节点对应的数据。 特点: (1)左右子树也分别是二叉搜索树。 (2)左子树的所有节点key值都小于它的根节点的key值。 (3)右子树的所有节点key值都大于他的根...
1.底层实现原理
1.HashMap底层实现原理先来看一下HashMap中定义了哪些
1. 底层实现结构不同 JDK1.7:数组+链表 JDK1.8:数组+链表+红黑树2. 扰动函数不同 JDK1.7:九次扰动,四次位运算+五次异或运算 JDK1.8:两次扰动,1次位运算+1次异或运算3. resize()函数功能不同 JDK1.7:resize()为扩容,inflateTable()为初始化底层数组 JDK1.8:resize()为初始化+扩容4. 扩容的判断时机不同 ...
1.Key为null的键值对存储位置 JDK1.7存放null值源码: 可以看到1.7中将null值存放在数组0号索引处,JDK1.8源码: 由于在hash函数中,null的hash为0,所以红框中的代码可以简化成:if ((p = tab[i = 0]) == null) tab[i] = newNode(hash, key, value, null);可以看到1.8中也是将null值存放在数组0号索引处,综上两种情况,HashM...
1.LinkedHashMap是什么 一个基于LinkedList和HashMap实现的Map,继承自HashMap,实现了Map接口。源码上的注释告诉了我们以下几件事: 底层实现:基于LinkedList和HashMap实现,允许null元素,内部维护了一个贯穿所有内部节点的双向链表,可以通过构造函数来指定其迭代顺序(插入顺序/访问顺序)。 性能:与HashMap一样,add、contains、remove提供恒定的时间性能,假设hash函数在bucket之...
1.LinkedList是什么 一个基于双向链表的List实现,继承自AbstractSequentialList,实现了List、Deque、Cloneable、Serializable,支持快速随机访问、克隆及序列化(不了解的小伙伴可以移步我前几篇博文,对这几个接口有做详细的说明,Deque(Double Queue)接口小伙伴们感兴趣的话可以自己看下,定义了一些双向链表的常用方法)。源码上的注释告诉了我们以下几件事: 底层实现:LinkedList基于双向链表实现,可存...
前言:写这篇文章之前笔者查阅过一些资料,发现网上大多数的博文要么就是东拼西凑别人的话,管它JDK版本对不对应,抄就完了,抄顺手了连图片也抄过来;要么就是博文写的内容自己都没验证过就往上发。笔者是菜鸡,但觉得既然决定写博文就要对自己和看的人负责,搞技术还是要做到知其然知其所以然,看源码最好还是自己动动手。如果亲爱的读者您在我的任何一篇博文中发现问题,欢迎批评指正,笔者必虚己受人。1.Collection整体架构图 吐槽完毕,进入正题。架构图推荐自己动手用Idea Diagra...
1.什么是序列化与反序列化 在Java程序运行期间所创建的对象都暂时保存在内存中,服务端创建的用户session也是如此,假设有一天用户的session过多,并且这些session中有很多僵尸粉,长期不活跃还占用着服务器的内存资源,那么能不能有一种方法可以将处于内存中的对象持久化到硬盘中,等僵尸粉突然活跃后再将其取出重新加载进内存呢?这便用到了序列化技术: 序列化:把对象转换为字节序列的过程 反序列化:把字节序列恢复为对象的过程2.Serializable...
1.Cloneable是什么 Cloneable和Serializable接口一样,本质上都是一种标志性接口,无具体实现,意在告知JVM此类可实现克隆功能。当程序中想要使用一个对象的clone方法,仅仅用public重写基类clone方法还不够,还要实现Cloneable接口,否则会抛出CloneNotSupportedException异常。2.clone方法的追根溯源 在Java Object类中默认提供了clone方法: 访问类型为prote...
1.什么是RandomAccess RandomAccess和Cloneable、Serializable接口一样,本质上都是一种标志性接口,无具体实现,意在告知JVM此类(在恒定时间内)可支持快速随机访问。源码中一大段话翻译过来讲了这么几件事: (1)给List使用的标记型接口,目的是使其支持(在恒定时间内)的快速随机访问...
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号