![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 60
Java技术总结
张孟浩_jay
分享Java后端、MySQL、数据结构、计算机基础、算法、并发编程技术!欢迎朋友们交流关注,共同进步!
展开
-
Java中抽象类
抽象类可以代码复用,将一些需要差异化的逻辑抽出一个抽象方法,其他子类可以继承该抽象类,实现对应的逻辑,这样就可以复用其他不需要差异化表达的代码逻辑。原创 2023-08-29 14:44:15 · 179 阅读 · 0 评论 -
Java中HeapByteBuffer和DirectByteBuffer的区别
HeapByteBuffer 和 DirectByteBuffer 都是申请一块内存,只不过HeapByteBuffer是在Java的堆内存中申请,而DirectByteBuffer是在JVM外部申请。有什么区别呢?我们都知道JVM会对 堆区 进行GC,会移动存活对象在内存中的位置,HeapByteBuffer也不例外,也会被移动位置。而DirectByteBuffer由于是在JVM外部,所以不会收到JVM的GC影响。这个差别就体现在了IO上边。如果将HeapByteBuffer中的数据写入的时候原创 2021-10-28 16:31:53 · 456 阅读 · 0 评论 -
Java中守护线程
Java线程中分为用户线程和守护线程两种。守护线程就是用来守护用户线程的。只有当所有的非守护线程运行结束之后,守护线程才会退出。守护线程经常用来做收尾工作,比如垃圾清理之类的。守护线程中代码不一定全部执行完,即使守护线程没有结束,JVM也会退出。守护线程的使用Thread t = new Thread();//设置为守护线程,一定要在start()之前设置t.setDaemon(true);t.start();守护线程中创建的线程也默认是守护线程。...原创 2021-09-06 22:24:58 · 199 阅读 · 1 评论 -
Java中线程生命周期详解
因为IO和多核CPU的出现,为了提高CPU的利用率,引入了多线程。本文就说一下线程的生命周期!线程有以下几种状态:1、New新创建的一个线程,还未调用start()2、Runnable以下两种状态1、当线程准备就绪就等待CPU了 ready2、当前线程正在运行 Running这两种状态统称为Runnable3、Blocked当线程获取synchronized锁失败的时候,这种状态就是Blocked。这种时候是等待JVM来唤醒的。4、Waiting当线程调用t.wait()或者t.原创 2021-09-06 20:12:44 · 159 阅读 · 1 评论 -
Java中IO中零拷贝
本文说下Java中的零拷贝。再说零拷贝前,我们先说下普通的拷贝。普通拷贝原创 2021-09-06 16:19:26 · 408 阅读 · 1 评论 -
Java中NIO报错Exception in thread “main“ java.nio.channels.IllegalBlockingModeException
异常信息Exception in thread "main"java.nio.channels.IllegalBlockingModeException当使用Java中NIO时,如果爆出上述异常,就说明对应的Channel没有配置configureBlocking(false),也就是将Channel获取数据变为非阻塞。原创 2021-09-04 09:53:25 · 1320 阅读 · 2 评论 -
Java中IO详解
IO是构建程序的一个非常重要的一环。一个好的IO能够大大的提高程序的运行效率。IO分为BIO、NIO、AIO三种。接下来我们挨个详细讲解。IO详解1、BIOBIO的全名是Blocking IO,就是阻塞式IO。BIO是Java中最古老的IO工具,Java出来的时候就有了。服务器对应的是一个ServerSocket,它可以监听客户端发来的连接请求,然后为客户端创建一个Socket,客户端本身也有一个Socket,客户端和服务器就利用这一对Socket来传递数据,读取和写入是通过数据流实现的。由于利原创 2021-09-01 22:02:12 · 269 阅读 · 1 评论 -
JDK1.7中HashMap并发成环的原因
JDK1.7中HashMap存在并发成环的问题。问题发生在扩容搬运的时候,具体代码如下。void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; //table是旧table,也就是扩容前的table for (Entry<K,V> e : table) { //e为槽位的头节点,通过头节点遍历槽位 while(null !=原创 2021-08-31 12:11:30 · 336 阅读 · 1 评论 -
Java中字节码执行过程
我们都知道Java是一个解释语言,将字节码解释为机器码然后运行。这篇文章我们就说下具体的细节。说明:以下观点是我结合网络上的观点自己总结的,可能会存在错误,望大佬批评指正!执行过程:我们都知道一个字节码肯定是属于某个线程的,程序的基本运行单位就是线程。在JVM中一个线程对应着一个虚拟机方法栈、本地方法栈和PC计数器(记录字节码的位置)。上图就是虚拟机方法栈的结构,本地方法栈的结构和虚拟机方法栈大概一致。一个栈帧对应着一个方法,里面存放着有方法对应的字节码代码,字节码是无法直接执行的。一个JV原创 2021-08-29 18:51:20 · 1145 阅读 · 1 评论 -
Java中>>>和>>的区别
1、>> 带符号右移正数,在高位补0负数,在高位补12、>>> 无符号右移无论正数负数都在高位补0原创 2021-08-28 20:20:11 · 568 阅读 · 5 评论 -
Java8中lambda详解
lambda出现原因在Java8之前是无法将方法赋值给一个变量的。Java8的一个重大特性就是引入了函数式编程,也就是变量可以被赋值为方法了,方法可以当作方法的参数和返回值,这就叫做函数式编程!Java提供了四种函数式接口来定义函数变量,函数式接口对象通过初始化匿名内部类来实现。名字type描述FunctionFunction< T , R >方法接受T对象,返回R对象ConsumerConsumer< T >方法接受T对象,不返回对象原创 2021-08-27 18:55:06 · 1149 阅读 · 1 评论 -
return和finally执行详解
这篇文章我们来看一下return和finally的执行顺序示例public static int case2() { int x; try { x = 1; return ++x; } finally { x = 3; }}运行结果为2,为什么呢?我们通过字节码文件来找到答案。Java为两个x定义了两个变量,名字都为x,两个x的作用域不一样!执行顺序我们看下字节码文件0: iconst_1 // 将常量1原创 2021-08-21 20:56:34 · 492 阅读 · 1 评论 -
第四篇:JVM中堆结构、垃圾回收GC、垃圾回收器
JVM中的堆区主要存储的是实例化对象,随着对象的创建以及使用完毕,堆区的内存是经常波动的,所以堆区是垃圾回收GC的主要地方。1、对象死了吗?1.1、引用计数算法对象中存在一个引用数变量,当一个对象被引用时,引用数+1,当引用数为0的时候,说明该对象没用了,就可以回收了。引用计数算法存在一个缺陷:互相引用,当两个对象互相引用的时候,两者的引用数都不会等于0,两者都需要等待对方被回收后,引用数才会变为0。二者相互等待。两个对象永远不会回收。1.2、根搜索算法:如上图所示,从GC Root开始遍历原创 2021-08-08 22:07:05 · 258 阅读 · 1 评论 -
第十三篇:equals()和hashcode()详解
在Java论坛中,equals()和hashcode()的关系一直被热切讨论。今天我们来总结以下:1、equals()equals方法的作用是来判断两个对象是否相等。equals方法实在Object类中定义的。我们都知道Java中的所有类都是基于Object的,也就是说所有类都可以重写equals方法。equals方法默认也就是在没有重写的时候调用的是public boolean equals(Object obj) { return (this == obj);}是 == 。也就是比原创 2021-08-12 21:52:05 · 265 阅读 · 1 评论 -
第十一篇:Java中Map详解 HashMap、HashTable、LinkedHashMap、TreeMap、HashMap扩容原理详解
1、Map是什么?Map中存放的数据是以key-value键值对存在的。通过Map我们可以用key来获取对应的value。Map也就做散列表和Hash表。2、HashMapHashMap的底层原理是哈希表。我们都知道哈希表会存在Hash冲突,对待Hash冲突一般有两种方式:1、线性探测法:插入元素:当出现冲突时,依次往后遍历,如果出现空槽,则将值插入。查找元素:首先找到hash位置,然后比较,如果不相同,则往后遍历比较,如果碰到空槽,则说明该值不存在缺点:删除效率不高,需要将后面的元素挪动到原创 2021-08-12 18:19:47 · 760 阅读 · 1 评论 -
第十二篇:Java集合详解、ArrayList、Vector、LinkedList、Queue、PriorityQueue、Deque、HashSet、TreeSet
Java中的集合是我们编程中常用的东西,集合的作用是用来存放对象的,让我更好的管理对象!Java集合分为三类:List、Queue、Set1、ListList是一个集合,按照元素插入的先后顺序进行排列。1.1、ArrayListArrayList的底层是数组,当空间不足的时候,会进行动态扩容。数组的好处就是随机存储块,但是插入和删除效率不高,删除需要搬运元素,插入有的时候需要动态扩容。ArrayList是线程不安全的,没有加锁,会出现线程不安全问题ArrayList需要注意的就是遍历删除指原创 2021-08-11 21:54:31 · 498 阅读 · 2 评论 -
第十篇:Java之Integer和int 自动装箱和拆箱
我们都知道Java是一种面向对象的语言,而八大基本数据类型不属于对象引用,而属于基本数据类型。所以Java推出了Integer等对应的包装类。Integer对应的对象存储在堆上的对象中,int对应的存储在常量池中。其他的七种基本数据类型也是一样。1、Integer的创建方式1、Integer a = new Integer(1);这时就是在堆中新建一个Integer对象,并且数据1直接存储在对象上,而不是存储指针指向基本数据类型常量池。2、Integer a = Integer.valueOf(原创 2021-08-11 10:27:35 · 1265 阅读 · 1 评论 -
第九篇:Java之动态代理 Proxy和cglib
Spring框架是Java程序员熟知的框架。Spring有两大特性,IOC和AOP。AOP就是我们熟悉的切面编程,和我们今天说的动态代理关系密切。Java中动态代理有两种方式:Proxy和cglib1、ProxyProxy要求被代理的类必须要继承接口才能实现代理,实现Proxy需要四步1、定义接口interface PersonInterface{ public String print(String name);}2、定义被代理的类class Person implements原创 2021-08-10 22:34:18 · 457 阅读 · 1 评论 -
第八篇:Java之静态方法和非静态方法、静态变量与非静态变量
为什么非静态方法可以使用静态变量和静态方法而静态方法不能使用非静态方法和非静态变量public class StaticTest { static int staticX = 1; int nonStaticX = -1; public static void staticMethod(){ staticX = 2; } public void nonStaticMethod(){ nonStaticX = -2;原创 2021-08-10 16:16:08 · 653 阅读 · 1 评论 -
第七篇:Java之反射详解
1、反射:反射有什么用呢?通过反射,我们可以在程序运行的时候动态的创建对象,并且获取某个类中的所有属性、所有方法。可能你还是有些糊涂,反射具体有什么用?假设一下这个场景,我们编写一个程序,用户可以输入类名和方法名,然后程序会自动创建对象并执行对应的方法。实际上就是动态的创建对象和动态的执行方法,这是传统的new 对象方式办不到的事情,只能通过反射来解决。框架类的配置文件的开发方式就是依赖于反射机制2、反射详解class User{ private String name; pr原创 2021-08-10 15:12:15 · 153 阅读 · 1 评论 -
第六篇:Java之String、StringBuilder、StringBuffer的区别
String是Java中最基础的类,我们在上一篇详细介绍了String。for(int i = 0;i < 10;i++){ str+=i;}1、StringBuilder和String的区别如上面代码所示,a、String 因为String是final类,也就是不可以被修改,为什么会这么做呢?因为程序中对于String的读取是很频繁的,将String修饰为final后,相当于String是只读的,访问的时候不需要做限制和加锁。所以,当执行上述代码时,会新建10个新的Strin原创 2021-08-09 21:44:13 · 160 阅读 · 1 评论 -
第五篇:一张图搞清楚Java中的String,String.intern()
本文是通过HSDB工具查看对象的布局和地址,自己判断得出的结论。因为字符串是Java中一个使用频率非常高的类,频繁的创建对象会消耗很大的资源,所以JVM开辟了一个字符串常量池。字符串常量池存放在堆中。如上图所示,1、String s3 = new String(“1234”),如果字符串常量池中不存在“1234”,就先在字符串常量池中加入“1234”,然后在堆中创建一个对象,对象中存储的是指针,指针指向“1234”在字符串常量池中的地址。s3引用中存储的指针是对象的地址。2、s3.intern(原创 2021-08-09 21:08:36 · 154 阅读 · 1 评论 -
第三篇:从类的初始化和对象创建来看JVM内存模型
JVM是Java的核心和关键!了解JVM的内存结构,更有利于我们对Java有着更清晰的认识!符号引用和直接引用:当加在类文件的时候,如果当前类文件引用了其他类文件,而其他类文件当前还未加在,无法确定其地址,所以这时给其赋予一个唯一的符号引用。待其他类文件加载完成后,将符号引用改为直接引用。直接引用也就是地址。JVM内存模型图...原创 2021-08-08 19:24:36 · 275 阅读 · 1 评论 -
第二篇:Java之异常
1、异常类层次图Object是Java中一切类的基类。Throwable是Java异常类中的基础类,其有两个子类:Error和Exception。Exception是指能够预料到的异常,比如IOException等。Exception又分为可检查和不可检查异常。可检查异常有IOException等,这类异常必须在编码阶段强制对其捕获,进行异常处理。不可检查异常有NullPointerException等异常,这类异常不会强制被捕获,往往是由于逻辑错误导致的异常。Error是指不太正常的比较严重的错原创 2021-08-03 16:40:40 · 153 阅读 · 1 评论 -
第一篇:Java简介
1、Java的特点:1、一次编译,多平台运行:Java首先将程序编译为字节码,也就是class文件,然后通过JVM也就是Java虚拟机对字节码进行解释运行。不同的平台对应着不同的JVM,将字节码解释为不同平台对应的机器码执行。Java是一种解释语言。2、GC 垃圾回收机制Java内置了垃圾回收器,不需要程序员手动回收垃圾。2、JDK和JRE的区别JDK:Java Development Kit,Java开发工具包。提供了编译、调试等工具来帮助开发。JRE:Java Runtime Envi原创 2021-08-03 14:57:52 · 176 阅读 · 1 评论