Java 学习笔记
Java 学习记录
叶子飘零水自流
星星之火,可以燎原
展开
-
Java 内存模型 JMM (Java Memory Model)
Java 内存模型 JMM (Java Memory Model)要搞懂并发编程必须搞懂 JMM.JMM 屏蔽了不同操作系统中的内存差异性.定义了线程和主内存之前的抽象关系。线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享变量的副本。本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。JMM 抽象示意图如下:从上图来看,线程A 和 B 操作的共享变量都是本地内存中的副本,如果想要互相看到对方原创 2020-09-19 11:25:33 · 183 阅读 · 0 评论 -
Java学习笔记 (三十) finalize()方法
在可达性分析算法中不可达的对象,并不是一定要回收的。真正判定一个不可达对象要回收,至少要经历两次标记过程。第一次标记如果对象在进行可达性分析之后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选。筛选的条件是此对象是否需要执行 finalize() 方法。当对象没有覆写 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,这两种情况...原创 2019-01-06 22:31:04 · 310 阅读 · 0 评论 -
Java学习笔记 (二十九) java中的四种引用
为了更好的管理内存,有利于垃圾回收.JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种。强引用(Strong Reference)如下: List list=new ArrayList(); Map ma...原创 2019-01-06 18:41:58 · 151 阅读 · 2 评论 -
Java学习笔记 (二十七) 使用NIO写文件
创建NIO Path 对象Path对象是对 文件 或者目录的路径的引用. Path 类似于 FIle ,可以引用文件系统的绝对路径或者相对路径。Path 创建对象可以使用 工厂类 java.nio.files.Paths ,它有一个静态的get()方法。如下: //创建 相对路径文件的引用Path path1=Paths.get("love.txt");//创建绝对路径文件的引用Pa...原创 2018-12-28 23:19:57 · 569 阅读 · 0 评论 -
Java学习笔记 (二十六) 使用NIO读取文件
在一个文件大小的缓冲区中读取文件代码如下: public static void main(String[] args) throws Exception { try ( RandomAccessFile raf = new RandomAccessFile("love.txt", "r"); //获取 该文件通...原创 2018-12-27 22:49:50 · 206 阅读 · 0 评论 -
Java学习笔记 (二十八) IO 知识总结
学习IO 知识一段时间,对java中的IO 有了一个初步的了解,先总结一下学习的知识点。后面有空时在继续完善。欢迎走过路过的朋友指点交流一下。Java学习笔记 (十八) 什么是IO流Java学习笔记 (十九) Java中的IO流Java学习笔记 (二十) FileInputStream 和 FileOutputStreamJava学习笔记 (二十一) 使用 try-with-resourc...原创 2018-12-30 18:34:48 · 163 阅读 · 0 评论 -
Java学习笔记 (二十五) 初步了解NIO
什么是NIO ?jdk 1.4之后,Java中新增了 java.nio包,Java NIO提供了与标准IO API不同的IO工作方式。NIO 的几个概念缓冲区 Buffer缓冲区是一个容器,存放特定原始类型(char、byte、int、long、float等)的固定大小的数据。缓冲区具有内容、位置、限制和容量。通道 ChannelChannel 是一个通道,网络数据通过Channel ...原创 2018-12-26 22:55:03 · 122 阅读 · 0 评论 -
Java学习笔记 (二十四) 缓冲流
缓冲流 BufferedInputStream 和 BufferedOutputStream 以及 BufferedReader 和 BufferedWriter普通IO流每个读或写请求都由底层操作系统直接处理。这会大大降低程序的效率,因为每个这样的请求通常都会触发磁盘访问、网络活动或其他一些相对耗时的操作。缓冲I/O流可以减少这种开销。缓冲输入流从缓冲区的内存区域读取数据;只有当缓冲区为空...原创 2018-12-25 23:00:41 · 122 阅读 · 0 评论 -
Java学习笔记 (二十三) IO管道(Pipes)
Java IO 管道 Pipesjava中Pipes提供了线程之间通信的能力。Pipes可以是数据源,也可以是输出目标。不能使用管道与不同JVM(不同进程)中的线程进行通信。Java中的管道概念与Unix / Linux中的管道概念不同,Unix / Linux中的管道在不同地址空间中运行的两个进程可以通过管道进行通信。在Java中,通信双方必须在同一个进程中运行,并且应该是不同的线程。...原创 2018-12-24 22:54:55 · 357 阅读 · 0 评论 -
Java学习笔记 (二十二) RandomAccessFile
RandomAccessFileRandomAccessFile 该类的实例支持对文件的任意位置进行读写操作。 访问文件任意位置的行为类似于存储在文件系统中的大量字节数组。有一种游标,或指向隐含数组的索引,称为文件指针;输入操作从文件指针开始读取字节,并将文件指针向前推进,超过所读取的字节。如果文件是在读/写模式下创建的,那么输出操作也是可用的;输出操作从文件指针开始写入字节,并将文件指针向前推...原创 2018-12-24 00:32:36 · 199 阅读 · 0 评论 -
Java学习笔记 (二十一) 使用 try-with-resources语句关闭资源.
try-with-resourcestry-with-resources 可以自动关闭资源。非常方便。try 语句里面可以声明一个或者多个资源。资源指的是对象,必须在程序执行完后关闭,比如IO流 执行完后要关闭流。这个对象必须实现了java.lang.AutoCloseable接口。以前关闭流的方式:public static void main(String[] args) thro...原创 2018-12-22 22:32:39 · 1476 阅读 · 0 评论 -
Java学习笔记 (二十) FileInputStream 和 FileOutputStream
FileInputStreamFileInputStream类能够以字节流的形式读取文件内容。FileInputStream是InputStream类的子类。原创 2018-12-22 19:33:48 · 214 阅读 · 0 评论 -
Java学习笔记 (十九) Java中的IO流
Java中的IO流Java 中定义了两种类型的流,那就是字节流与字符流。字节流(Byte Stream)字节流按字节处理数据,对数据进行输入以及输出。字节流又分为输入流(InputStream)和输出流(OutputStream)InputStreamInputStream是一个抽象类,是所有字节输入流类的基类。它们的结构如下图所示:OutputStreamOutputStre...原创 2018-12-20 23:07:01 · 145 阅读 · 0 评论 -
Java学习笔记 (十八) 什么是IO流
什么是流在日常生活中,流就是 事物在两地之间的转移运动,比如人流,水流,车流…等等。什么是IO流呢计算机中的流就是连续的数据流,I/O流就是输入源和输出目标之间的数据流。输入流(InputStream)从数据源读取数据,如下图:将数据读取到程序输出流(OutputStream)将数据写入目标,如下图:将数据写入目标数据源和输出目标可以是任何保存、生成或使用数据的对象,包括磁盘文...原创 2018-12-19 21:58:40 · 244 阅读 · 0 评论 -
Java学习笔记 (十七) 深入了解枚举
上一篇,枚举。枚举是怎么实现的可以通过反编译代码查看具体实现。如下代码:public enum Season { SPRING,SUMMER,AUTUMN,WINTER;}反编译后,如下:可以看见,反编译的后的代码继承了 java.lang.Enum 类,同时被 final修饰。从这一点可以明白为什么枚举类不能继承别的类,以及为什么不能使用final关键字修饰,因为已...原创 2018-12-17 22:01:44 · 201 阅读 · 0 评论 -
Java学习笔记 (十六) 枚举
什么是枚举 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。 ----------------...原创 2018-12-16 21:42:57 · 196 阅读 · 0 评论 -
Java学习笔记 (十五) 自动拆箱与自动装箱
什么是自动拆装箱自动装箱: 就是将基本数据类型自动转换成对应的包装类. 自动拆箱:就是将包装类自动转换成对应的基本数据类型。For example : Integer a=1; //自动装箱 int b=a; //自动拆箱基本数据类型与包装类对应关系,如下: 基本数据类型 包装类 boolean Boolean ...原创 2018-08-24 01:28:23 · 236 阅读 · 1 评论 -
Java学习笔记 (十四) JVM内存结构之运行时数据区域
JVM运行时数据区域(Java Virtual Machine Run-Time Data Areas)Java虚拟机在运行程序期间会划分运行时数据区域,有些数据区域随着jvm的启动而创建,退出而销毁。有些数据区域随着线程的启动和结束而创建和销毁。 这里放一张我盗来的图,图来源文章链接在文末; 从上图可以看出来、PC Register、JVM Stack、Native Method S...原创 2018-08-19 23:49:12 · 310 阅读 · 0 评论 -
Java学习笔记 (十三) String究竟创建了几个对象 以及String的intern方法
String究竟创建了几个对象 看代码:例 1、 public static void main(String[] args) { String s3 = "天道酬勤"; String s4 =new String("天道酬勤"); System.out.println("s3==s4 "+(s3==s4));//fals...原创 2018-08-13 21:52:32 · 273 阅读 · 0 评论 -
Java学习笔记 (十二) String源码分析
该文章基于jdk1.8String 不可变性String类是被final修饰的,意味着String是不可变的,那么为什么这么设计呢?其实源码里的注释给出了答案:their values cannot be changed after they are created. String buffers support mutable strings.Because String obj...原创 2018-08-13 21:31:56 · 204 阅读 · 0 评论 -
Java学习笔记 (十一) 反编译jdk10 本地变量类型推断
反编译jdk10 的本地变量类型推断 观察其实现细节源代码:public class VarTest{ public static void main(String[] args) { var s="abc"; var s2="bbc"; var i=1; var j=2; var k='e'; ...原创 2018-07-26 22:31:41 · 1291 阅读 · 0 评论 -
Java学习笔记 (十) 反编译lambda表达式
反编译lambda表达式观察其实现细节源代码:import java.util.*;public class LambdaTest{ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.a...原创 2018-07-26 22:15:28 · 3826 阅读 · 2 评论 -
Java学习笔记 (九) 反编译String的“+”
反编译String的“+” 观察其实现细节二话不说上源码:public class StringTest{ public static void main(String[] args) { String s1="I"; String s2=" Love"; String s3=" You"; String s4=s1..原创 2018-07-26 21:54:38 · 1226 阅读 · 0 评论 -
Java学习笔记 (八) 反编译 switch 观察其实现细节
看了H大的博客之后,发现还有反编译代码看实现细节的操作,学习一波,吸收营养。文末放博客链接地址。switch对整型支持的实现细节源代码,如下:public class SwitchTest{ public static void main(String[] args) { int a=1; switch (a) { case ...原创 2018-07-26 21:18:38 · 1491 阅读 · 0 评论 -
Java学习笔记 (七) Java中的编译与反编译
Java中的编译 Java语言的编译期是一段“不确定”的操作过程,因为它可能是指一个前端编译器(或编译器的前端)把.java文件转化为.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还有可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把.ja...原创 2018-07-25 22:08:51 · 1793 阅读 · 0 评论 -
Java学习笔记 (六) Java常用命令 javap java class文件分解器
什么是javap,以及javap的用处javap是java class文件分解器,可以反编译java class文件。javap命令格式javap <options> <classes> 首先,写个java类。。。。。如下图: public class HelloWorld{ static int i=1; ...原创 2018-07-24 21:42:18 · 1519 阅读 · 0 评论 -
Java学习笔记 (五) Java常用命令 jhat 虚拟机堆转储快照分析工具
什么是jhat 以及jhat的作用 jhat(Java Heap Analysis Tool)命令是用来分析堆转储快照的,jhat命令内置了一个微型 的HTTP/HTML 服务器,生成Dump文件的分析结果后,可以在浏览器中查看。jhat 命令的语法jhat [-stack &lt;bool&gt;] [-refs &lt;bool&gt;] [-por...原创 2018-07-22 15:48:00 · 1473 阅读 · 0 评论 -
Java学习笔记 (四) Java常用命令 jmap Java内存映像工具
什么是jmap 以及jmap 的作用 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件),jmap的作用不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。但是jmap有不少功能在windows系统下是受限的,除了-dump选项和-h...原创 2018-07-22 14:29:52 · 1336 阅读 · 0 评论 -
Java学习笔记 (三) Java常用命令 jstat 虚拟机统计信息监视工具
jstat的用处 jstat(Java Statistics Monitoring Tool) 是用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选。jstat 命令格式jstat -&amp;amp;lt;optio...原创 2018-07-21 22:58:32 · 1646 阅读 · 0 评论 -
Java学习笔记 (二) Java常用命令 jinfo Java配置信息工具
Jinfo的作用 jinfo可以实时的查看以及调整虚拟机的各项参数。Jinfo的使用jinfo的命令格式jinfo [option] pidjinfo -helpjinfo -help可以获取一些帮助信息,比如一些参数之类的,如下:jinfo pidjinfo 23960 //23960为PID我发现可以直接jinfo pid,不加...原创 2018-07-21 17:23:21 · 1081 阅读 · 0 评论 -
Java学习笔记 (一) Java Dump
什么是Java DumpJava Dump 是Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到Dump文件。Java Dump 分为Thread Dump 和 Heap DumpThread Dump包含所有线程的运行状态。纯文本格式。Heap Dump包含线程Dump,还包含所有堆对象的状态。二进制格式。Java Dump 的用处 DEB...转载 2018-07-21 15:10:16 · 1213 阅读 · 0 评论