4.6k 4 分钟

# 类文件结构 计算机是不能直接运行 java 代码的,必须要先运行 java 虚拟机,再由 java 虚拟机运行编译后的 java 代码。这个编译后的 java 代码,就是本文要介绍的 java 字节码。 Java 代码间接翻译成字节码,储存字节码的文件再交由运行于不同平台上的 JVM 虚拟机去读取执行,从而实现一次编写,到处运行的目的。 JVM 也不再只支持 Java,由此衍生出了许多基于 JVM 的编程语言,如 Groovy, Scala, Koltin 等等。 许多开发语言支持将源代码编译为 .class 字节码文件格式,以便交给 JVM 运行 #...
3.9k 4 分钟

# 引用类型 # 强引用 最普遍的引用,如果一个对象具有强引用,GC 绝不会回收。如果不使用,要弱化引用 Object o = new Object();o = null;// help GCpublic void test() { Object o = new Object();}/**test 方法内部有一个强引用,引用保存在栈中,new 的对象保存在堆中,当方法运行结束会退出方法栈,则引用内容的引用不存在,Object就会被回收。*/ 如果 o 是全局变量,需要在不用对象时赋值为 null。 #...
2.1k 2 分钟

# 前言 首先, TreeMap 与哈希没有任何关系,其次,哈希和 Map 也不是一回事,请不要先入为主。Map 只是一个键值对的数据结构,哈希是将对象计算哈希码的一种算法。 TreeMap 只是通过红黑树将键值对存起来,一方面实现了二叉搜索树的排序性,另一方面维护了整棵树的平衡性,防止树退化为链表增大查询 / 插入的时间复杂度。 # 排序方式 TreeMap 对插入数据实现了排序,如果是自定义数据,要么该类实现 Comparable 接口,要么 TreeMap 在构造方法中传入 Comparator 接口。 # Comparable 以 Student 类来说明,继承 Comparable...
1.7k 2 分钟

# 简介 LinkedHashSet 也是用了适配器模式,对 LinkedHashMap 进行包装,所以本文主要分析 LinkedHashMap 。 从名字上可以看出容器是 Linked list 和 HashMap 的混合体,可以将 LinkedHashMap 看作采用 linked list 增强的 HashMap。 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{...
2.2k 2 分钟

# 前言 关于这些集合的讲解,作者默认读者都知道该如何使用,所以不会从最基础的开始讲起,会直接跳过什么是映射关系,哈希值等概念的讲解。对于源码的解析也是最主要使用的那些方法。 # 一些概念 负载因子:集合容量都有上限,如果加入集合的数量超过一定允许值,集合就会扩容。负载因子就是衡量当前情况是否需要进行扩容的标准。 // 如果数据占用率达到 75%,就会扩容,扩容会重新计算哈希值static final float DEFAULT_LOAD_FACTOR = 0.75f; 红黑树:一种数据结构,在 HashMap 里面查询效率是...
1.8k 2 分钟

整个网络协议与工具线路参照 pdai 的 Java 全栈知识体系学习,前半部分关于计算机网络的知识,padi 也是直接使用了博客园的博主桂城老托尼关于《计算机网络第五版》(谢希仁)的读书笔记,在学习期间,作者也会参考《计算机网络 - 自顶向下方法》进行内容补充。 # 计算机网络基础 如果学计算机网络觉得看文字过于枯燥,可以看一下中科大的郑烇老师的计算机网络的课。 # 因特网概述 一个网络可能由光纤,路由器,计算机(包括服务器)等组成,本质上就是结点和链路的组成。而因特网则是把许多网络连接在一起。 组成: 边缘部分:由所有连接在因特网的主机组成,这些主机又叫做端系统 (end...
2.2k 2 分钟

# 其他集合 因为像 ArrayList,LinkedList 之类的容器比较简单,此处不会过多解释,只会列出一些需要注意的点。 ArrayList: ArrayList 为了效率没有实现同步,有需求的情况下需要自己实现。 向 ArrayList 中加入元素(add)时,都会进行容量检查,扩容都会交给 grow 方法。 remove 函数中,删除中间某一个元素会导致后面的元素向前移动,需要将最后一个位置赋为 null(为了让 GC 起作用)。 tirmToSize() ,将数组容量修改为当前元素个数大小; indexOf() 与 lastIndexOf() 就是获取元素第一次 /...
1.1k 1 分钟

# 容器控制操作 补充一些 Docker 的命令,对于这种单纯的命令查看,建议直接看菜鸟教程。 # 进入容器,退出:ctrl+P,ctrl+Q;终止容器运行的程序:ctrl+Cdocker attach 容器ID/名称# 执行命令,这里执行的是 bash,并开启一个可输入终端docker exec -it 容器ID/名称 bash# (假设容器可以执行 java),就相当于让容器执行 java -versiondocker exec 容器ID/名称 java -version# 允许容器处理善后再停止运行docker kill 容器ID/名称# 直接强制停止容器docker stop...
2.5k 2 分钟

# 数据卷 基于分层机制,在容器中操作的文件都是在最顶层进行,这也导致容器的销毁会导致数据丢失。通过数据卷可以实现数据共享和持久化。 # 文件挂载 Linux 根目录以外的文件想要被访问,就需要将其关联到根目录下的某个目录实现,这种关联就叫挂载,目录就是挂载点,解除关联就是卸载。 最直接的就是读取 U 盘的文件,如果没有挂载操作,就只能在图形化界面使用 U 盘,在命令行找不到的。 进行挂载时建议重新创建一个文件夹,如果使用了系统文件夹(etc 之类的),挂载操作会使得原有目录中文件被隐藏,可能会导致系统崩溃。 mount 设备号 挂载点目录umount 挂载点目录#...
3k 3 分钟

# Docker 默认网桥 安装 Docker 服务会默认创建一个 docker0 网桥,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。 容器有三种网络类型,分别是 bridge , host , none ,创建容器时默认是 bridge 。我们可以使用命令查看 docker network ls先创建一个容器再来讲解 docker run -it ubuntuapt updateapt install net-tools iputils-ping curl 可以看到这个容器的 IP 是 172.17.0.3 。该 ubuntu...