HashMap 源码阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 HashMap 源码阅读HashMap 这种Key,Value 的存储结构,是我们在写代码中经常使用到的.可以说使用是非常频繁的,不过现在使用JSONObject也是非常多的,二者都是实现了Map接口
所以看下HashMap源码是非常有必要的
结构这里我们要看下 HashMap的内部类
这里的 Node 节点就是 HashMap存放数据的结构. hash 计算出来的哈希值,key就是HashMap中的key,value就是key对应的value的值. 这个 next 就是 key 不一样,计算出来的hash却是一样的,这样就有了hash冲突,所以就将节点存放在next里面了,从尾部插入进去. java8 后,如果next的长度是大于8的话,就会转化了红黑树来存储,那样获取值的速度变快了
static class Node<K,V> implements Map.Entry<K,V> ...
LinkedList源码分析
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 LinkedList源码分析虽然一般都是使用ArrayList集合比使用LinkedList集合要多,但是这并不妨碍我们对LinkedList的源码研究和学习
数据结构和参数LinkedList 是一个双向链表的结构,这点可以直接看其内部内就可以非常明显的看出来. 静态私有的内部类,只提供一个构造函数
头节点的上一个指针是Null;尾节点的下一个指针是Null
如果头节点和尾节点都是null的话,则说明该LinkedList只有一个元素
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = elemen ...
Class加载
😀 class加载过程
📝 类加载生命周期
加载(Loading)
验证(Verification)
准备(Preparetion)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸载(Unloading)
其中 , 验证/准备/解析 三个部分统称为 连接(Linking)
加载何时加载
遇到 new , getstatic, putstatic 和 invokestatic 这四条字节码指令时,如果类型没有进行过初始化,则需要先触发其初始化阶段.
使用 new 关键字实例化对象
读取或者设置一个类型的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外)的时候
调用一个类型的静态方法的时候
使用 java.lang.reflect包的时候对类型进行反射调用的时候,如果类型没有进行初始化,则需要触发其初始化
当初始化类的时候,如果发现其子类还没有进行初始化,则需要先触发其父类的初始化
当虚拟机启动时,用户需要指定一个启动类(main方法),虚拟机会先初始化这个主类
当使用JDK 7新加入的 ...
Java反射学习
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 题记最近在看Spring源码的时候, 可以看到在加载类等的时候,都是大量使用的反射。估摸着MyBatis这种框架,其内部也是会大量的使用反射。所以看得出来反射在第三方的框架中使用是非常多的,于是说学习反射技术是很有必要的,不论是你写代码造轮子还是去理解第三方框架的底层实现.
话不多bb,直接上代码看看是个什么操作.
方法我们这里写一个简单的pojo类,也就是我们经常使用的.
public class User { private Integer id; private String name; public String age; public User(){ } public User(Integer id, String name) { this.id = id; this.name = name; ...
linux上压缩文件
😀 这里写文章的前言:Linux上压缩以及解压文件
📝 压缩 .tar 文件filename: 替换成你需要的名字
/path/to/directory-or-file: 替换成你要压缩的文件夹路径
tar -cvf filename.tar /path/to/directory-or-file
📝 压缩 .tar.gz 文件filename: 替换成你需要的名字
/path/to/directory-or-file: 替换成你要压缩的文件夹路径
tar -czvf filename.tar.gz /path/to/directory-or-file
📝 压缩 .zip 文件filename: 替换成你需要的名字
/path/to/directory-or-file: 替换成你要压缩的文件夹路径
zip -r filename.zip /path/to/directory-or-file
📝 重启nginx注意此处的 /usr/local/n ...
Java常见基础
😀 这里写文章的前言:Java基础巩固
📝 为什么重写 hashCode 方法也要重写 equals在基于哈希实现的容器里,如果想使用某个类,不仅需要定义它的hashCode()方法,还需要定义equals()方法。这两个方法一起使用,才能实现对哈希容器的正确查找。
官方文档讲的很清楚,防止依赖hashcode的api出现错误,比如经典的set和map, 一般情况下是不需要的。
代码如下:
只要将 Person 对象中 hashCode 或者 equals 注释掉一个的话,set集合中的值就会是2
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return Objects.ha ...
ArrayList源码分析
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 ArrayList源码分析ArrayList 是代码中使用非常频繁的,所以看底层的代码时非常有必须的.
数据结构和参数DEFAULT_CAPACITY : 默认集合大小;默认值是10
EMPTY_ELEMENTDATA : 空的Object数组,用于后续的初始化和赋值
DEFAULTCAPACTITY_EMPTY_ELEMENTDATA: 默认空的Object数组,也是用于后续的判断和赋值
elementData: 存放ArrayList数据的数组
size: 记录ArrayList中元素的个数;size不一定是elementData的长度
ArrayList 是一个由 Object [] 的数组来实现的;transient Object[] elementData ,这个变量就是存放数据的
长度是用 size 这个变量来记录的,而不是直接调用的数组的长度
如果ArrayList list = ...





