![](https://img-blog.csdnimg.cn/20190828083005794.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JDK
文章平均质量分 77
JDK相关文章
超人汪小建(seaboat)
公众号:【远洋号】,笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、计算机视觉、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢编程、绘画、看书、写作和运动,擅长素描、篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚技术自由,崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《图解Java并发原理》、《人工智能原理科普》。
展开
-
2018汇总JDK源码篇
从JDK源码看String(上)从JDK源码看String(下)从JDK源码看StringBuffer从JDK源码看StringBuilder从JDK源码看Java域名解析JVM的ServerSocket是怎么实现的(上)JVM的ServerSocket是怎么实现的(下) 从JDK源码角度看Short从JDK源码角度看Integer从JDK源码角度看L...原创 2019-01-15 09:24:20 · 999 阅读 · 0 评论 -
Java9后String的空间优化
前言据我所知 Java 开发人员几乎任何时候都会想到 String,字符串确实已经成为最常用的类了,而且是大量使用。我们都知道,String 其实是封装了字符,里面必须由字符或字节数组来存放,从 Java9 开始 Java 语言开发者对 String 做了一些空间的优化。从char到byteJDK9 之前的库的 String 类的实现使用了 char 数组来存放字符串,char 占...原创 2018-05-19 09:33:21 · 1619 阅读 · 0 评论 -
JVM的ServerSocket是怎么实现的(上)
概况JDK 为我们提供了 ServerSocket 类作为服务端套接字的实现,通过它可以让主机监听某个端口而接收其他端的请求,处理完后还可以对请求端做出响应。它的内部真正实现是通过 SocketImpl 类来实现的,它提供了工厂模式,所以如果自己想要其他的实现也可以通过工厂模式来改变的。继承结构--java.lang.Object --java.net.ServerSock...原创 2018-03-28 08:21:17 · 3142 阅读 · 1 评论 -
深入谈谈String.intern()在JVM的实现
前言String 类的intern方法可能大家比较少用也比较陌生,虽然实际项目中并不太建议使用intern方法,可以在 Java 层来实现类似的池,但我们还是要知道它的原理机制不是。 关于intern方法通过该方法可以返回一个字符串标准对象,JVM 有一个专门的字符串常量池来维护这些标准对象,常量池是一个哈希 map 结构,字符串对象调用intern方法会先检查池中是否已经存在该字...原创 2018-04-09 08:27:44 · 1507 阅读 · 0 评论 -
JVM的ServerSocket是怎么实现的(下)
概况JDK 为我们提供了 ServerSocket 类作为服务端套接字的实现,通过它可以让主机监听某个端口而接收其他端的请求,处理完后还可以对请求端做出响应。它的内部真正实现是通过 SocketImpl 类来实现的,它提供了工厂模式,所以如果自己想要其他的实现也可以通过工厂模式来改变的。继承结构--java.lang.Object --java.net.ServerSock...原创 2018-03-30 08:44:35 · 1554 阅读 · 0 评论 -
从JDK源码看Java域名解析
前言在互联网中通信需要借助 IP 地址来定位到主机,而 IP 地址由很多数字组成,对于人类来说记住某些组合数字很困难,于是,为了方便大家记住某地址而引入主机名和域名。早期的网络中的机器数量很少,能很方便地通过 hosts 文件来完成主机名称和 IP 地址的映射,这种方式需要用户自己维护网络上所有主机的映射关系。后来互联网迅猛发展起来,hosts 文件方式已经无法胜任,于是引入域名系统(DN...原创 2018-03-03 08:44:37 · 2855 阅读 · 0 评论 -
System.arraycopy为什么快
前言在 Java 编程中经常会遇到数组拷贝操作,一般会有如下四种方式对数组进行拷贝。 * for遍历,遍历源数组并将每个元素赋给目标数组。 * clone方法,原数组调用clone方法克隆新对象赋给目标数组,更深入的克隆可以看之前的文章《从JDK角度看对象克隆》。 * System.arraycopy,JVM 提供的数组拷贝实现。 * Arrays.copyof,实际也是调用Syste...原创 2018-03-10 08:25:14 · 8314 阅读 · 2 评论 -
本地方法怎么映射Java层的数据类型
前言Java 语言上定义了不同的数据类型,比如有基础类型int、double等等,还有所有类的父类Object等,这些都是 Java 层面的类型,而使用本地方法的处理过程需要有它们对应的类型。大概的流程Java 层编写的本地方法,被编译器编译为字节码,字节码将按照规范将不同类型的参数给记录到 class 文件中,比如 B 表示 byte、I 表示 int、J 表示 long 等等。...原创 2018-03-16 08:57:55 · 772 阅读 · 0 评论 -
从JDK角度看对象克隆
对象克隆对象克隆其实是很常见的操作,它完成的功能是将现有对象内容(属性)拷贝到新的对象中,得到的是一个新的对象,而并不只是一个对象引用。其实对于属性不多的对象我们可以直接通过编写代码逐一属性复制,比如我们可以直接 new 一个新对象,然后通过 set 方法将属性值一个个设置进去。但这种做法我们也是比较不屑,看起来不够高端,而且字段一多就会造成代码冗长。另外,可能有些私有变量也无法这样拷贝,...原创 2018-02-23 08:34:09 · 1654 阅读 · 0 评论 -
我的2017年文章汇总——JDK源码篇
2018已经开始,可能还有360天结束。Eventually a single thing can only get so big. You need to do something else.近期准备把过去一年写的文章按照分类重新整理推送一遍,包括:“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”。本篇推原创 2018-01-07 14:08:09 · 3710 阅读 · 0 评论 -
Java线程的CPU时间片
Java中线程会按优先级分配CPU时间片运行,那么线程什么时候放弃CPU的使用权?可以归类成三种情况:当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield()方法。当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上。当前运行线程结束,即运行完run()方法里面的任务。...原创 2018-04-29 10:04:17 · 6125 阅读 · 0 评论 -
从JDK源码看StringBuilder
概况在 Java 中处理字符串时经常会使用 String 类,实际上 String 对象的值是一个常量,一旦创建后不能被改变。正是因为其不可变,所以也无法进行修改操作,只有不断地 new 出新的 String 对象。为此 Java 引入了可变字符串变量 StringBuilder 类,它不是线程安全的,只用在单线程场景下。继承结构--java.lang.Object -...原创 2018-05-25 08:13:40 · 1650 阅读 · 0 评论 -
从JDK源码看StringBuffer
概况Java 中处理字符串时经常使用的 String 是一个常量,一旦创建后不能被改变。为了提供可修改的操作,引入了 StringBuilder 类,可看前面的文章《从JDK源码看StringBuilder》。但它不是线程安全的,只用在单线程场景下。所以引入了线程安全的 StringBuffer 类,用于多线程场景。总的来说主要是通过在必要的方法上加 synchronized 来实现线程安...原创 2018-06-03 16:28:05 · 724 阅读 · 0 评论 -
向JVM注册本地方法是怎么实现的
前言Java 中我们经常会遇到要调用本地方法的情况,而且 Java 核心库中的很多类也大量使用了本地方法,使用 JNI 时本地函数需要按照约定好的格式进行命名,如果不想写长长的函数名则需要将方法注册到 JVM 中,这里看看怎么向 JVM 注册本地方法。命名约定JVM 中对本地方法名有约定,在使用 JNI 时需要遵守,即为Java_<fully qualified class ...原创 2018-09-03 08:27:44 · 765 阅读 · 1 评论 -
从Java到JVM到OS线程睡眠
前言Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过Thread.sleep使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么。简单例子以下是一个简单的例子,使主线程睡眠5秒钟。public class TestSleep { public static void main(String[] args) { try { ...原创 2018-08-20 08:32:29 · 770 阅读 · 0 评论 -
从JDK源码看String(下)
lastIndexOf方法该方法用于返回指定字符在此字符串中最后一次出现处的索引,有多种方法参数。可传入 int 类型,也可传入 String 类型,另外还能传入开始位置。根据编码的不同分别用 Latin1 和 UTF16 两种方式处理。public int lastIndexOf(int ch) { return lastIndexOf(ch, length() - ...原创 2018-08-13 08:30:29 · 670 阅读 · 0 评论 -
从JDK源码看String(上)
概况Java 语言使用 String 类用来代表字符串,实际上 String 对象的值是一个常量,一旦创建后不能被改变。正式因为其不可变,所以它是线程安全地,可以多个线程共享。相信对于 String 的使用大家都再熟悉不过的了,这里就了解下 JDK 中怎么实现 String 类的。继承结构--java.lang.Object --java.lang.String...原创 2018-08-06 18:44:10 · 2144 阅读 · 4 评论 -
《字符串连接你用+还是用StringBuilder》续
前言前面的一篇文章《字符串连接你用+还是用StringBuilder》,有朋友找我反馈了一些问题,其中一位朋友说JDK10下生成的字节码跟文章中并不一样,这里继续看下是什么情况。问题描述如下图,按照《字符串连接你用+还是用StringBuilder》的代码在 javap 后发现它并没有创建 StringBuilder 类和一些相应的操作,与文章的描述的并不符合,使用的JDK版本为J...原创 2018-07-16 08:21:26 · 894 阅读 · 0 评论 -
Java如何获取当前线程
前言Java 中经常会遇到要获取当前线程的情况,这时一般我们就会通过Thread.currentThread()来获取,接下去就看看执行该语句在 JVM 中做了什么吧。简单例子以下是一个简单的例子,获取当前线程并打印线程名称,输出是”main”,即主线程。public class CurrentThreadTest { public static void mai...原创 2018-07-05 08:26:48 · 45463 阅读 · 1 评论 -
从Java到JVM到OS线程的优先级
前言Java 的线程的调度机制由 JVM 实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及“线程优先级”。优先级别Java 把线程优先级分成10个级别,线程被创建时如果没有明确声明则使用默认优先级,JVM 将根据每个线程的优先级分配执行时间的概率。有三个常量Thread.MIN_PRIORITY、Thread.NORM_PRIORIT...原创 2018-06-25 08:34:46 · 709 阅读 · 0 评论 -
字符串连接你用+还是用StringBuilder
前言据我所知字符串确实已经成为 Java 开发人员最常用的类了,而且是大量使用。我们都知道,String 其实是封装了字符,所以俩字符串连接就是将字符串对象里面的字符连起来。很多人习惯使用+来连接字符串,也有人会用 StringBuilder 的append方法。“+”编译后看看如果我们在程序中直接使用+来连接字符串的情况,用下面一个简单的例子来说明,进行两个字符串连接操作,即s3...原创 2018-06-21 08:29:23 · 1497 阅读 · 0 评论 -
直接内存和堆内存谁快
前言直接内存大多时候也被称为堆外内存,自从 JDK 引入 NIO 后,直接内存的使用也越来越普遍。通过 native 方法可以分配堆外内存,通过 DirectByteBuffer 对象来操作。直接内存不属于 Java 堆,所以它不受堆大小限制,但是它受物理内存大小的限制。配置可以通过 -XX:MaxDirectMemorySize 参数来设置最大可用直接内存,如果启动时未设置则...原创 2018-05-30 08:25:35 · 3072 阅读 · 2 评论 -
细看Java序列化机制
概况在程序中为了能直接以 Java 对象的形式进行保存,然后再重新得到该 Java 对象,这就需要序列化能力。序列化其实可以看成是一种机制,按照一定的格式将 Java 对象的某状态转成介质可接受的形式,以方便存储或传输。其实想想就大致清楚基本流程,序列化时将 Java 对象相关的类信息、属性及属性值等等保存起来,反序列化时再根据这些信息构建出 Java 对象。而过程可能涉及到其他对象的引用,所原创 2018-01-31 08:35:06 · 980 阅读 · 0 评论 -
从JDK角度认识枚举enum
前言对于比较稳定的值集合,Java 提供了枚举来定义,通过它可以很方便管理集合。那么 Java 的枚举是通过怎样的机制实现的?本文将从 JDK 角度来看看枚举的原理。定义枚举使用很简单,比如定义一个表示“环保”、“交通”、“手机”三个值的集合,那么就可以直接定义如下,然后可直接 Labels.ENVIRONMENT 使用,public enum Labels { E原创 2018-01-12 09:04:12 · 1529 阅读 · 0 评论 -
从JDK源码角度看Long
概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相关的操作。继承结构--java.lang.Object --java.lang.Number --java.lang.Long主要属性public s原创 2017-09-19 10:06:48 · 5176 阅读 · 3 评论 -
从JDK源码角度看Float
关于IEEE 754在看Float前需要先了解IEEE 754标准,该标准定义了浮点数的格式还有一些特殊值,它规定了计算机中二进制与十进制浮点数转换的格式及方法。规定了四种表示浮点数值的方法,单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上)与延伸双精确度(79位以上)。多数编程语言支持单精确度和双精确度,这里讨论的Float就是Java的单精确度的实现。浮点数的表示浮点数由三部分组原创 2017-10-09 15:43:40 · 2014 阅读 · 0 评论 -
从JDK源码看System.exit
前言在编写的Java程序中有时会遇到用 System.exit 来关闭JVM,其中调用 exit 方法时会包含一个状态参数n,即System.exit(n)。这其实是一个约定值,如果为0则表示正常关闭,而非0则表示非正常关闭。这里我们从JDK源码看下不同状态都是怎么处理的。System与Runtime先看System类的exit方法如下,可以看到它是间接调用了Runtime对象的exit方法。pub原创 2017-10-16 08:38:10 · 1616 阅读 · 0 评论 -
从JDK源码看关闭钩子
关闭钩子Java提供了Shutdown Hook机制,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作。使用的方法也很简单,Java.Runtime.addShutdownHook(Thread hook)即可。关闭钩子其实可以看成是一个已经初始化了的但还没启动的线程,当JVM关闭时会并发地执行注册的所有关闭钩子。钩子执行时机向JVM注册关闭钩子后的什么时候会被调用,什么时候不会被调用呢?原创 2017-10-23 09:54:23 · 1379 阅读 · 0 评论 -
从JDK源码看Writer
概况Writer 是一个用于写字符流的抽象类,它将一些相通的写相关操作抽象到此类,方便各种写操作类的实现。一般来说子类只需要实现它的 write、flush 、close 等三个方法,但如果有需要还可以重写 Writer 提供的公共方法。JDK 在 Writer 的基础上实现了很多有用的 xxxWriter ,包括 BufferedWriter、CharArrayWriter、FilterWrite原创 2017-10-30 09:18:56 · 1112 阅读 · 0 评论 -
从JDK源码看InputStream
概况JDK 给我们提供了很多实用的输入流 xxxInputStream,而 InputStream 是所有字节输入流的抽象。包括 ByteArrayInputStream 、FilterInputStream 、BufferedInputStream 、DataInputStream 和 PushbackInputStream 等等。继承结构--java.lang.Object --java.i原创 2017-11-07 10:53:17 · 2043 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(Windows)上篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-13 16:05:59 · 2210 阅读 · 1 评论 -
JDK不同操作系统的FileSystem(Windows)中篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-20 08:32:05 · 2017 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(Windows)下篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-11-30 11:35:39 · 1269 阅读 · 0 评论 -
从JDK源码角度看Integer
概况Java的Integer类主要的作用就是对基本类型int进行封装,提供了一些处理int类型的方法,比如int到String类型的转换方法或String类型到int类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相关的操作。继承结构--java.lang.Object --java.lang.Number --java.lang.Integer主要属性第一部分pu原创 2017-08-15 16:31:41 · 12113 阅读 · 9 评论 -
从JDK源码角度看Short
概况Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然也包含与其他类型之间的转换方法。继承结构--java.lang.Object --java.lang.Number --java.lang.Short主要属性public static fin原创 2017-08-01 20:25:31 · 3168 阅读 · 0 评论 -
从JDK源码角度看Byte
Java的Byte类主要的作用就是对基本类型byte进行封装,提供了一些处理byte类型的方法,比如byte到String类型的转换方法或String类型到byte类型的转换方法,当然也包含与其他类型之间的转换方法。主要实现代码如下:public final class Byte extends Number implements Comparable<Byte> { public stati原创 2017-07-06 15:39:05 · 3560 阅读 · 3 评论 -
从JDK源码看字节流和字符流
在各种 IO 中都会涉及到流的概念,比如网络 IO、磁盘IO、内存IO或其他设备IO,于是抽象出流概念,可以分为两大类:输出流和输入流。有了这些抽象就能很方便表达网络从某端传输到另外一端,或对磁盘进行读写操作。而 Java 还分出字节流和字符流,对字节和字符提供了方便的操作。从JDK源码看InputStream从JDK源码看OutputStream从JDK源码看Writer从JDK源码看Reader原创 2017-12-19 09:45:18 · 1591 阅读 · 0 评论 -
从JDK源码看Reader
概况Reader 是一个用于读字符流的抽象类,它将一些相通的读相关操作抽象到此类,方便各种读操作类的实现。一般来说子类只需要实现它的 read 和 close 两个方法,但如果有需要还可以重写 Reader 提供的公共方法。JDK 在 Reader 的基础上实现了很多有用的 xxxReader ,包括 BufferedReader、CharArrayReader、FilterReader、Inpu原创 2017-12-17 16:09:26 · 2697 阅读 · 0 评论 -
JDK不同操作系统的FileSystem(unix-like)上篇
前言我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。关于FileSystem类JDK 里面抽象出了一个 FileSystem 来表示文件系统,不同的操作系统通过继承该类实现各自的文件系统,比如 Windows NT/2000 操作系统则为 WinNTFileSystem,而 u原创 2017-12-08 09:21:08 · 2693 阅读 · 1 评论 -
从JDK源码看OutputStream
概况前面已经了解了输入流《从JDK源码看InputStream》,接着看对应的输出流,JDK 给我们提供了很多实用的输出流 xxxOutputStream,而 OutputStream 是所有字节输出流的抽象。包括 ByteArrayOutputStream 、FilterOutputStream 、BufferedOutputStream 、DataOutputStream 和 PushbackO原创 2017-12-13 16:18:40 · 2258 阅读 · 0 评论