JAVA知识点整理
文章平均质量分 76
JAVA
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
FastThreadLocal 快在哪里 ?
FastThreadLocal 快在哪里 ?原创 2023-10-07 22:07:36 · 487 阅读 · 0 评论 -
java多态理解和底层实现原理剖析
这里的关键点在于实例变量和实例方法在数组中的占据的索引位置是不变的 ,例如: 子类继承了某个父类,子类自己的方法表中也是父类方法优先,接着是自己的方法,这样可以确保父类方法在子类和父类方法表中的索引都是一致的。超类的方法出现在来自子类的方法前,并且方法表中方法指针排序顺序和方法在class文件中出现顺序相同,当然,如果存在子类覆盖父类方法的情况,那么子类覆盖的方法会出现在超类中该方法第一次出现的位置。相反,当虚拟机调用一个实例方法时,它会基于对象的实际类型(运行时确定)来选择调用的方法。原创 2023-02-26 21:48:08 · 994 阅读 · 0 评论 -
个人谈谈对ThreadLocal内存泄露的理解
首先,我们采用普通的map集合作为线程副本数据存储实现,那么当前我们的应用程序失去了对ThreadLocal对象的强引用时,我们就再也无法通过ThreadLocal去访问ThreadLocalMap中我们存储的线程副本数据了,那么此时就可以认为这样一对key:value键值对是垃圾,需要被回收掉。对于普通的map实现而言,我们无法区分到底哪些ThreadLocal对象确定是应用程序不再访问的,可以被回收掉的,因此也就无法回收这些垃圾键值对占据的空间了,反而会导致某种意义上的内存泄露。原创 2023-02-19 12:00:38 · 2241 阅读 · 0 评论 -
深入理解 Java 泛型擦除机制
set 与 get 方法通过反编译后并不会保留类型信息,统一处理成了 Object,这个才是我们通常所说的泛型擦除,由于被编译器当作 Object 类型处理,那么我们就可以通过反射 set 任意类型的参数。我们都知道 Java 中的泛型可以在编译期对类型检查,避免类型强制转化带来的问题,保证代码的健壮性。上面这个例子中定义了一个 String 类型的集合,通过反射获取 add 方法并调用该方法添加了一个 int 类型的元素,代码执行过程中并不会出现异常,而且能正常输出 size = 2。转载 2023-02-18 21:48:39 · 405 阅读 · 0 评论 -
神奇的MappedByteBuffer
MappedByteBuffer使用虚拟内存,因此分配(map)的内存大小不受JVM的-Xmx参数限制,但是也是有大小限制的。如果当文件超出1.5G限制时,可以通过position参数重新map文件后面的内容。MappedByteBuffer在处理大文件时的确性能很高,但也存在一些问题,如内存占用、文件关闭不确定,被其打开的文件只有在垃圾回收的才会被关闭,而且这个时间点是不确定的。原创 2022-10-29 11:44:33 · 1752 阅读 · 0 评论 -
JDK10新特性
JDK10新特性局部变量类型推断引入并行 Full应用程序类数据共享线程本地握手在备用存储装置上进行堆内存分配基于Java的实验性JIT编译器删除javah工具JDK10新增API局部变量类型推断JDK10 可以使用 var 进行 局部变量类型推断。var str = "abc"; // 推断为 字符串类型 var l = 10L; // 推断为long 类型 var flag = true; // 推断为 boolean 类型 var list = new ArrayList<Stri原创 2022-05-31 12:02:53 · 1199 阅读 · 0 评论 -
Java中令人困惑的classpath和jar到底是什么鬼?
Java中令人困惑的classpath和jar到底是什么鬼?ClassPath是什么如何去设置classPath以及是否需要设置classPathjar包小结ClassPath是什么在Java中,我们经常听到classpath这个东西。网上有很多关于“如何设置classpath”的文章,但大部分设置都不靠谱。到底什么是classpath?classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class。因为Java是编译型语言,源码文件是.java,而编译后的.class文件才是原创 2022-03-06 16:46:20 · 910 阅读 · 0 评论 -
JDK9新特性
JDK9新特性模块化系统目标步骤模块化出现的背景与概念模块化的概念演示小结交互式编程交互式编程的概念Jshell工具使用小结多版本兼用jar的作用基本使用方法使用演示java 8代码Java 9代码编译运行 Main class小结接口方法私有化接口方法私有化的作用接口定义私有化方法一个例子:分别计算奇数与偶数的和小结Java9改进try-with-resources语法先说Java7的try-with-resources(Java9改进版在后文)避免走入误区try-with-resources在Java原创 2022-02-05 21:35:13 · 1079 阅读 · 1 评论 -
重新java系列之IO流
重新java系列之IO流内容介绍学习目标字符输入流字符输入流【Reader】FileReader类构造方法读取字符数据使用演示:字符输出流字符输出流【Writer】FileWriter类构造方法基本写出数据关闭和刷新写出其他数据使用演示缓冲流概述Java缓冲流原理画图分析字节缓冲流构造方法效率测试使用演示利用字节流的复制统计各种写法形式下缓冲流的性能执行情况。字符缓冲流构造方法特有方法使用演示练习:文本排序案例分析转换流字符编码和字符集字符编码字符集编码引出的问题InputStreamReader类构造方法原创 2022-01-14 10:55:24 · 396 阅读 · 0 评论 -
java重学系列之IO字节流
java重学系列之IO流字符集和编码IO概述什么是IOIO的分类顶级父类们总结字节流一切皆为字节字节输出流【OutputStream】FileOutputStream类构造方法写出字节数据数据追加续写写出换行基本使用演示追加数据字节输入流【InputStream】FileInputStream类构造方法读取字节数据一个一个字节读取使用字节数组读取解决中文读取乱码字节流练习:图片复制JDK 1.7关闭资源新方式try...resources字符集和编码目标:字符集/编码集字符集:各个国家为自己国家的字原创 2022-01-13 15:20:26 · 403 阅读 · 0 评论 -
Stream流
Stream流再整理Stream基本API使用将数组转换为管道流将集合类对象转换为管道流将文本文件转换为管道流Stream的filter与谓语逻辑什么是谓词逻辑?谓词逻辑的复用and语法(交集)or语法(并集)negate语法(取反)Stream管道流的map操作回顾Stream管道流map的基础用法处理非字符串类型集合元素再复杂一点:处理对象数据格式转换flatMapStream的状态与并行操作中间操作:有状态与无状态Limit与Skip管道数据截取Distinct元素去重Sorted排序串行、并行与顺序原创 2022-01-10 11:40:58 · 219 阅读 · 0 评论 -
Java文件相关处理类
Java文件相关处理类ImageIoImageIoImageIo类常用方法以及图片操作ImageIO工具类简介及应用原创 2021-11-19 23:29:10 · 247 阅读 · 0 评论 -
JAVA知识盲区整理2
JAVA知识盲区整理2java中TimeUnit的使用Java.time.ZonedDateTime带时区的日期与时间信息的类ZooKeeper学习笔记java中TimeUnit的使用java中TimeUnit的使用Java.time.ZonedDateTime带时区的日期与时间信息的类Java.time.ZonedDateTime带时区的日期与时间信息的类ZooKeeper学习笔记ZooKeeper学习笔记...原创 2021-10-17 20:00:56 · 202 阅读 · 0 评论 -
Java中的getResource()方法,及路径相关问题
在Java中需要加载一个文件时,使用getResource()方法进行加载,会报错[Caused by: java.lang.NullPointerException: Location is required.这是对.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不够深入的原因。二者主要区别如下: getClass().getResource(fileName):表示只会在当前调用类所在的同一路径下查原创 2021-10-09 19:06:29 · 2886 阅读 · 2 评论 -
JAVA--泛型复习
泛型复习泛型的生命周期泛型类泛型接口泛型方法关于泛型方法的总结泛型通配符有限制的通配符泛型的生命周期 Java中的泛型,只在编译阶段有效,在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换方法。也就是说,泛型信息不回进入到运行时阶段。泛型类class A<T>{ private T key; public T getKey() { return key; } publ原创 2021-09-11 23:02:46 · 228 阅读 · 0 评论 -
JAVA知识盲区整理
JAVA知识盲区整理静态内部类的调用时机静态内部类Java中volatile关键字及其作用静态内部类的调用时机 调用外部类的静态变量,静态方法可以让外部类得到加载,不过这里静态内部类没有被加载 静态内部类的加载不需要依附外部类,在使用时才加载。不过在加载静态内部类的过程中也会加载外部类 静态修饰过后的一切物件都只与类相关,不与对象引用相关 静态变量,静态方法,静态块等都是类级别的属性,而不是单纯的对象属性。他们在类第一次被使用时被加载(记住,是一次使用,不一定是实例化)。我们可以简单得用 类名原创 2021-08-30 17:39:37 · 600 阅读 · 0 评论 -
JAVA---多线程篇
多线程进程与线程并行与并发多线程的创建和启动Thread类创建线程的两种方式方式一:继承Thread类方式二 :实现Runnable接口指定线程的名称,并获取继承方式和实现方式的联系和区别Thread类相关的方法1线程的优先级Thread相关方法2yield方法演示:join方法演示:sleep方法演示:stop方法和isAlive方法演示线程的生命周期线程的同步和死锁多线程的安全问问题解决思路解决办法,同步锁在普通方法上加上同步锁synchronized,锁的是整个对象,不是某一个方法不同的对象就是不同的原创 2021-08-17 17:03:14 · 911 阅读 · 53 评论 -
JAVA8新特性-----新时间与日期API
新时间与日期API新的时间和日期APIInstant : 时间戳Duration计算时间间隔,Period计算日期间隔时间校正器新的时间和日期API //只获取当前系统的日期 LocalDate now = LocalDate.now(); System.out.println("当前系统的日期:"+now); //只获取当前系统的时间 LocalTime time = LocalTime.now(); S原创 2021-08-13 17:02:14 · 230 阅读 · 0 评论 -
Java8新特性-----接口中的默认方法和静态方法
接口中的默认方法和静态方法接口中的默认方法类优先原则接口中的静态方法接口中的默认方法在JDK 8之前,一个接口不能包含任何实现。接口只包含常量和方法签名。从JDK 8开始,可以定义接口中方法的默认实现。这些方法称为默认方法。使用关键字"default"声明一个默认方法,它包含一个方法体。所有实现类接口的默认方法都可用。如果实现类想要使用它,它可以使用它,或者它可以忽略默认实现并创建自己的实现。即使接口现在可以定义默认方法,如果要创建实例,接口仍然必须由类实现。请注意,实现类只需要实现抽象原创 2021-08-11 22:53:21 · 324 阅读 · 0 评论 -
Java8新特性----Stream
Stream流What is Stream ?注意:Stream操作三部曲使用演示:中间操作筛选与切片内部迭代: 迭代操作由Stream API完成终止操作:一次性执行全部内容,即惰性求值外部迭代limit ===> 短路skip ===>跳过前n个元素distinct进行元素去重(自定义类需要重写对应的hashcode和equals方法)映射map的使用演示:flatMap使用演示:map与flatmap的区别排序Stream的终止操作如下查找与匹配归约--reduce收集collect里原创 2021-08-11 22:38:49 · 2022 阅读 · 13 评论 -
Java8新特性-----方法引用和构造器引用
方法引用和构造器引用方法引用的概念语法格式对象::实例方法名注意:类::静态方法名类::实例方法名注意构造器引用需要调用的构造器的参数列表要与函数式接口中的参数列表保持一致数组引用方法引用的概念若lambda体中的内容有方法已经实现了,我们可以使用方法引用(我们可以理解为方法引用时lambda表达式的另外一种表现形式)语法格式对象::实例方法名public class TestMain{ @Test void test() { PrintStream原创 2021-08-11 16:51:01 · 161 阅读 · 0 评论 -
Java8新特性----Lambda表达式详细探讨
Java8新特性Lambda表达式入门演示案例1如何解决 cannot be cast to java.lang.Comparable问题?案例2优化方式一 : 策略设计模式优化方式二: 策略设计模式+匿名内部实现接口,减少创建实体类的麻烦优化方式三: lambda表达式优化方式四: stream流Lambda语法语法格式一 : 无参数,无返回值注意: 局部内部类与局部变量语法格式二: 有一个参数,无返回值语法格式三: 如果一个参数,那么小括号可以不写语法格式四:有两个参数,有返回值,lambda体中有多条原创 2021-08-11 16:03:06 · 2551 阅读 · 82 评论 -
2021IDEA插件使用说明
https://plugins.zhile.io点击该标识原创 2021-08-04 10:07:11 · 749 阅读 · 0 评论 -
JAVA之IO流
IO流IO流分类File类注意,\在文件中是路径的分隔符,但是在java编程中一个\的意思时转义符,在java中\\或者/才是文件的分隔符文件类里面的基础方法文件的新建,删除创建单层目录,多级目录返回当前文件的子集流的分类文件字节输入流FileInputStream ----将文件中的数据读取出来文件字节输出流FileOutputStream---将数据写入文件中文件字节输入输出流复制图片案例文件字节流非常通用,可以用来操作字符的文档,还可以用来操作其他任何文件(图片,压缩包等),因为字节流使用的是二进制文原创 2021-07-26 13:58:35 · 133 阅读 · 0 评论 -
JDBC从零开始的保姆级教程!!!
JDBC从零开始的保姆级教程!!!一级目录二级目录三级目录一级目录二级目录三级目录原创 2021-07-06 10:55:50 · 1547 阅读 · 157 评论 -
Java之注解相关知识点整理
注解JDK中预定义的注解自定义注解演示元注解: 描述注解的注解在程序中使用(解析)注解:获取注解中定义的属性值简单的测试框架JDK中预定义的注解@override: 检测被注解标注的方法是否继承至父类(接口)的@Deprecated:该注解标注的内容表示已过时@SuppressWarnings:压制警告//压制当前类可能弹出的所有警告被压制@SuppressWarnings("all")public class stu{ String name; //当前方法的所有警告被压制原创 2021-07-04 11:38:15 · 1164 阅读 · 60 评论 -
JAVA之反射知识点整理
JAVA之反射知识点整理概念好处反射机制的含义及其功能处理流程图反射相关APIClass类获取class对象的方式注意演示class对象功能概念将类的各个组成部分封装成其他对象,这就是反射机制好处在程序运行过程中操作这些对象可以解耦,提高程序的可扩展性反射机制的含义及其功能含义:反射是被视为动态语言的关键,反射机制能够让程序在执行期间借助Reflection API获取任何类的内部信息,并能直接操作任意对象的内部属性和方法功能:在运行时判断任意一个对象所属的类在运行时构造任原创 2021-07-03 20:47:28 · 2137 阅读 · 90 评论 -
Junit单元测试保姆级教程
Junit单元测试保姆级教程测试分类junit的使用判定结果演示加上assert断言初始化方法释放资源方法注意测试分类1.黑盒测试不需要写代码,给输入值,看程序是否能够输出期望的值2.白盒测试需要写代码,需要关注程序的具体执行流程junit的使用1.定义一个测试类建议: 测试类名:被测试的类名Test CalculatorTest 包名: ***.***.**.test cn.itcast.test2.定义测试方法,可以独立运行建议:原创 2021-07-02 19:15:40 · 742 阅读 · 49 评论 -
JAVA篇----内部类
内部类主要特性:1.内部类可以对同一个包中的其他类隐藏2.内部类方法可以访问外部类的作用域中的数据,包括原本的私有数据3.内部类对象总有一个隐式引用,指向创建它的外部类对象,这个引用在内部类的定义中是不可见的。4.静态内部类中没有这个附加的引用(指针),所有Java的静态内部类就相当于C++中的嵌套类5.静态内部类不能使用外部类中非static成员变量和方法6.内部类中声明的所有静态字段必须是final,并初始化一个编译时常量。如果这个字段不是常量,就可能不唯一。7.内部类中不能用static原创 2021-06-22 16:00:46 · 183 阅读 · 1 评论 -
JAVA篇-----final关键字
1.final标记的类不能被继承2.final标记的方法不能被子类重写3.final标记的变量为常量原创 2021-06-22 15:08:02 · 115 阅读 · 0 评论 -
JAVA篇之------代码块
代码块非静态代码块:没有static修饰的代码块静态代码块:用static修饰的代码块用处非静态代码块:没有static修饰的代码块可以有输出语句可以对类的属性声明进行初始化操作可以调用静态或者非静态的变量或方法若有多个非静态的代码块,那么按照从上到下的顺序依次执行再次创建对象的时候都会执行,且先于构造函数执行代码:public class Per { { System.out.println("非静态代码块1"); } { Sys原创 2021-06-22 15:00:04 · 572 阅读 · 22 评论 -
随机点名器---JAVA篇
随机点名器案例分析思路代码实现效果演示案例分析文件中存放了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器。思路创建字符缓冲输入流对象创建ArrayList集合对象调用字符缓冲输入流对象的方法读取数据把读取到的数据输入到集合中释放资源使用Random产生一个随机数,随机数的范围:[0,集合长度)把第六步产生的随机数作为索引,到集合中获取对应的值把获取到的值输出在控制台上代码实现import java.io.*;import java.util.ArrayLi原创 2021-06-14 16:23:09 · 2244 阅读 · 13 评论 -
斗地主之洗牌发牌----Java篇
斗地主案例分析思路代码实现完整代码和演示结果哈希表优化案例分析需求:实现斗地主过程中的洗牌,发牌和看牌。并且确保每一位玩家手上拿到的牌是随机并且按照大小排序好的思路创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现往牌盒里面装牌洗牌,也就是把牌打散,用Collections的shuffle()方法实现发牌,也就是遍历结合,给三个玩家发牌看牌,也就是三个玩家分别遍历自己的牌代码实现1.创建牌盒,存放所有牌 //创建一个牌盒,也就是定义一个集合对象,用Arra原创 2021-06-11 19:14:12 · 2844 阅读 · 23 评论 -
装箱和拆箱---JAVA基础篇
装箱和拆箱装箱拆箱注意总结装箱定义:把基本数据类型转换为对应的包装类型代码演示: //装箱 Integer i=Integer.valueOf(100); //自动装箱 Integer ii=100;//等价于:Integer.valueof(100);拆箱定义:把包装类型转换为对应的基本数据类型代码演示: //拆箱 ii=ii.intValue()+200; //自动拆箱原创 2021-06-09 18:57:54 · 160 阅读 · 0 评论