Java
文章平均质量分 77
二豪的梦呓
一辈子只有一个职业:学生
展开
-
排序算法总结
以下所有的排序全部是正序。选择排序首先找到数组中最小的一个数,然后将该值和第一个元素交换。如果最小的数就是第一个元素本身,自己和自己交换。再剩下的元素中找到第二小的数,和第二个元素交换,如此反复,直到整个数组排序。选择排序就是不断地选择最值。时间复杂度: O(N^2)空间复杂度 :O(1)选择排序运行时间和输入数组无关。不论输入的数组是否有序,选择排序所耗费的时间是固定的。因为每次选择最小值并不能为下一轮选择最值提供什么有用的信息。‘选择排序的数据移动最少。选择排序只需要O(N)次的交换数据原创 2022-02-24 22:04:22 · 159 阅读 · 0 评论 -
Java集合体系
任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。Java的集合体系由最上层的接口、中间的一些抽象类、以及最后各种具体的实现类组成。Java集合的基本接口是Collection接口和Map接口。Java中经常使用的语法糖"for each"循环可以与任何实现了Iterable接口的对象一起工作。Iterable借口包含了Iterator接口,这就是常用的迭代器,其中包含hasNext()、next()、remove()、forEachRemaining(Consumer)4原创 2021-12-15 17:56:07 · 2604 阅读 · 1 评论 -
Java中的Iterator接口实现
Iterator是Java中常用的接口,在Iterable接口中有一个iterator()方法,它返回一个Iterator对象。集合框架中的迭代器就是来源与此。Iterator()的功能简单,只能单向移动:1.调用iterator()方法返回一个Iterator对象。2.第一次调用Iterator的next()方法,返回序列的第一个元素。此后每调用一个next(),会返回序列的下一个元素。调用next()方法前最好先调用hasNext()方法,判断序列后面是否还有元素。3.remove()删除上次n原创 2021-12-13 17:48:38 · 1361 阅读 · 0 评论 -
吃透Java异常体系
Java的异常都是派生于Throwable类的一个实例,所有的异常都是由Throwable继承而来的。Throwable有分为了Error类和Exception类。Error(错误)Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。Error表示比较严重的问题,一般是JVM运行时出现了错误,如没有内存可分配抛出OOM错误、栈资源耗尽抛出StackOverflowError错误、Java虚拟机运行错误Virtual MachineError、类定义错误NoClassDefFoun原创 2021-12-08 22:05:19 · 590 阅读 · 0 评论 -
Java中的equals()和hashCode()
Java中有这么句话,如果重写了equals(),那么必须重写hashcode()。那么为啥要这么干呢?他俩到底是啥关系?怎样重写都行吗?今天来撸一撸经常用到的equals和hashcode()Object 类Object类是Java中最顶层的类,所有的类都继承自它。Object类中方法有:1.clone方法 默认实现浅拷贝2.getClass 方法 获得运行时类3.toString 方法 将对象转化为字符串4.finalize 方法 用于释放类所持有的资源 GC时才会调用5.equals 方原创 2021-12-06 17:09:02 · 627 阅读 · 0 评论 -
反向理解synchronized锁升级
在总结前文吃透synchronized关键字中,锁升级介绍是由低到高,一步一步的出发。其实也可以反其道而行之,想想怎么锁降级,这样能更好的理解锁升级的思路。原先synchronized关键字就是现在的重量级锁,不论遇到何种情况都是重量级锁,需要内核态和用户态之间的相互切换。在JDK1.6之后引入了锁升级,分为无锁-偏向锁-轻量级锁-重量级锁。从开发人员角度想,为啥要这么做呢?无锁状态和重量级锁肯定好理解,一个最轻,一个最重。记住无论何时何地,只要出现两个线程一直争夺同一个锁,必然是用重量级锁。不管原先是原创 2021-11-24 21:57:16 · 344 阅读 · 0 评论 -
吃透synchronized关键字
Java中的锁分为显示锁和隐式锁。原创 2021-11-22 21:28:45 · 2394 阅读 · 1 评论 -
volatile关键字是怎样实现的
理解volatile关键字可以分为两块,一块是它到底是怎么实现功能的,另一部分就是Java内存模型中volatile的内存语义。前者是变量加上volatile之后,处理器和编译器会怎样的处理,后者是在整个Java程序中,添加了volatile之后,编译器会保证volatile这一块不会被重排序。点击查看Java内存模型Java语言对volatile的定义:Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。volatile又被称为轻量级的s原创 2021-11-19 17:29:34 · 594 阅读 · 1 评论 -
吃透Java内存模型
首先强调,Java内存模型和Java运行时数据区的别搞混了。Java内存模型不是介绍内存是怎么分配的,它是一系列的规定来保证程序能更好的执行的。Java运行时数据区才是将内存分成了哪些部分,各部分分别放的是社么。...原创 2021-11-15 21:56:59 · 1776 阅读 · 4 评论 -
Java后端编译优化
虚拟机最开始是通过解释器进行解释执行的,解释器是最基础的,但是没有优化,效率和速度都有待提高。但是只依靠解释器不进行优化也是可以的。即时编译器和提前编译器都是采取的优化措施,是可选择的。即时编译器:当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认 定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代 码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称 为即时编译器提前编译器:解释器与编译器主流的虚拟原创 2021-11-11 17:54:07 · 721 阅读 · 0 评论 -
Java前段编译优化
前段编译器:把*.java文件转变成*.class文件的过程(代表:JDK的Javac)即时编译器(JIT编译器):运行期把字节码转变成本地机器码的过程(代表:HotSpot虚拟机的C1、C2编译器)提前编译器:直接把程序编译成与目标机器指令集相关的二进制代码的过程(代表:JDK的Jaotc、Excelsior JET)Java中即时编译器在运行期的优 化过程,支撑了程序执行效率的不断提升;而前端编译器在编译期的优化过程,则是支撑着程序员的 编码效率和语言使用者的幸福感的提高。Javac编译器Ja原创 2021-11-09 21:00:35 · 143 阅读 · 0 评论 -
JVM虚拟机方法调用和选择
虚拟机是JVM最核心的组成部分之一。物理机和虚拟机的区别二者都有代码执行的能力物理机的执行引擎是建立在处理器、硬件、指令集和操作系统层面上的。虚拟机的执行引擎是自己实现的,可以自行指定指令集与执行引擎结构体(包括不被硬件支持的指令集格式)JVM执行引擎概念模型, 就是一个理论模型:执行引擎输入的是字节码,处理过程是字节码解析的等效过程,输出的是执行结果。所有JVM执行引擎都是这个模式,但是不同的JVM可以选择不同的执行过程,也就处理过程可以不同,可选择解释执行、编译执行、解释+编译二者兼备。**原创 2021-11-08 21:28:26 · 423 阅读 · 0 评论 -
Java类加载机制
类加载机制:类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型。类的生命周期:一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称 为连接(Linking)。其中解原创 2021-11-05 22:10:44 · 697 阅读 · 0 评论 -
Class类文件结构
计算机只能执行机器码,而机器码是一系列0和1的组合。直接编写机器码肯定不行,为了简化开发就有了汇编语言,由汇编语言翻译成机器码。汇编开发也复杂,就有了C语言,由C语言翻译成汇编语言。后来就由C写出了Java。在各种IDE平台上写的程序都是.java文件,经过编译器编译为.class文件,然后JVM拿到这些.class文件经过解释器生成可执行的机器码。各种不同平台的虚拟机和所有平台都统一使用的程序存储格式—字节码,是构成平台无关性的基石。.class文件就是存储字节码的,不同平台产生的Class格式是统一的。原创 2021-11-03 22:27:58 · 152 阅读 · 0 评论 -
JVM的内存分配策略
内存的分配与内存的回收一样,都是为了减少GC时间而服务的。总体来说内存的分配是在堆上进行(但是也可能经过JTI编译后被拆分标量类型在栈上分配),优先在Eden区里分配。如果启动本地线程分配缓冲,按线程优先在TLAB上分配。1.对象优先在Eden区分配绝大多数对象的生存时间很短,所以将对象先分配在Eden区,等到Eden区满了之后进行Young GC,GC时Eden区存活的对象和From区的存活对象进入To区。如果To区放不下,就要放到老年代里。怎样判断老年代能不能放下呢?就是下文的空间分配担保。优先在原创 2021-11-02 17:17:30 · 587 阅读 · 0 评论 -
JVM的各种垃圾收集器
新生代Serial收集器 (复制算法)新生代收集器,Serial英文连续串行,这个收集器是单线程的收集器。它的“单线程”不仅仅是只会使用一个CPU或者一条线程完成垃圾收集工作,更重要的是它在进行垃圾收集时,其他工作线程必须暂停,直至收集结束。优点就是简单高效,对于只有单个CPU的环境来说,没有线程交互的开销,专心做垃圾收集效率最好。缺点时收集时其他线程需要暂停,如果暂停时间不长还可以接受,太长的话影响程序的效率,而且如果有多个CPU的话只使用一个就浪费资源,速度慢。ParNew收集器(复制算法)新生原创 2021-10-30 22:25:38 · 151 阅读 · 0 评论 -
JVM的安全点
HotSpot是目前使用最广泛的JVM。它在实现各种垃圾收集算法时,在具体实现上做了一点小优化。在可达性分析法中,可以作为GCRoots节点的有四种(虚拟机栈中的引用对象、本地方法栈的引用对象、方法区的静态属性引用变量、方法区的常量引用对象),但是这些内容很大(方法区有时候就有数百M),要想检查完所有符合要求的对象,必定很费时间。另外可达性分析应当是对某瞬间的程序快照进行的,不然一边进行可达性分析,一边程序运行,最后出的结果肯定是牛头不对马尾。这个时间点导致GC进行时必须停顿所有Java执行的线程。目前原创 2021-10-29 22:23:23 · 974 阅读 · 1 评论 -
JVM中的垃圾回收器算法
各种各样的垃圾回收器,总体的回收算法有三种:标记-清除:首先标记出所有需要回收的对象,在标记完成之后统一回收所有被标记的对象。这个算法是所有回收算法的基础,下面的算法都是在这个基础上的改进。标记-清除有两个缺点:1.标记和清除分两个阶段,但是这两阶段的效率都不是很高。2、容易产生大量的内存‘碎片’。标记-清除的位置是不确定的,而新建对象需要的内存应该是在一块的。假设需要新建一个对象内存为10,而现在却有100段不连续的容量为1的空间。虽然可用空间为100,但是却连10的对象都无法新建,这种情况下不得不再次原创 2021-10-28 22:25:34 · 75 阅读 · 0 评论 -
JVM的垃圾回收
看了周志明的《深入理解Java虚拟机》,重新理解了JVM的垃圾回收机制。建议没看过原书的先去读一下原书,一在网上看各种博文大多数都是从那本书中出来的,而且很多都只是截取了一部分,并不能很好的表达JVM的意思。我原先就是背八股,背的云里雾里的,这次看过原文豁然开朗。强烈安利~~~首先要理解JVM的内存划分:方法区、程序计数器、虚拟机栈、本地方法栈、堆。垃圾回收主要是指的堆的回收,但是也包括方法区。只不过方法区内垃圾回收的效率和结果不尽如人意,堆中垃圾回收一次可以收回70%—95%,而方法区远远达不到这个。原创 2021-10-27 19:34:46 · 90 阅读 · 0 评论 -
Java中线程安全的类
上次面试的时候,面试官说Java集合中有四个线程安全的类,你知道那几个吗?随口说了Vector、Hashtable、ConcurrentHashMap。但是内心的蒙的,Java中线程安全的类海了去了,为啥只有4个呢?查资料,大多数说的都是在jdk1.1中出了4个线程安装的类,在1.2之后出的都是非线程安全的累。4个线程安全的类分别是:Vector、Hashtable、stack、enumeration。但这种说法个人认为是不对的,Java中的线程安全的类有非常多。而且上述4个类像stack被Deque替原创 2021-10-25 22:14:01 · 1179 阅读 · 0 评论 -
接口引用
啃某项目代码的时候,发现接口也被引用到了类内部。具体如下:public interface CommonError { public int getErrCode(); public String getErrMsg(); public CommonError setErrMsg(String errMsg);}public class BusinessException extends Exception implements CommonError{ priv原创 2021-10-03 17:44:31 · 656 阅读 · 1 评论 -
IDEA切换JDK版本
在使用import sun.misc.BASE64Encoder时程序报错,查询发现在Java8之后改包被 import org.apache.commons.codec.binary.Base64替换,而自己使用的是Java9。两种解决方案,切换回Java8或者使用新的包。考虑到Java8仍是目前的主流,为了以后的简便,选择使用JDK8。IDEA可以导入多个版本的JDK,可以为不同的工程设置不同的JDK。点击右上角 file->project structure->SDKS->绿色加号原创 2020-11-12 17:48:28 · 1670 阅读 · 0 评论