![](https://img-blog.csdnimg.cn/20200113100036629.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java中常用的必要知识点
文章平均质量分 58
Java知识点大杂烩
保暖大裤衩LeoLee
芜湖~~~
展开
-
JDK8中ConCurrentHashMap源码详解,以及原理
初始化ConcurrentHashMap<String, Object> cMap = new ConcurrentHashMap<>();默认的构造方法中是空方法,数组的长度默认是16,在第一次put操作的时候进行数组的初始化。/** * Creates a new, empty map with the default initial table size (16). */public ConcurrentHashMap() {}但是在实际的使用中,如原创 2021-03-13 19:31:46 · 364 阅读 · 0 评论 -
JDK8HashMap原理分析&源码保姆式详解
基本概念HashMap是一个数组+链表的散列表,数组的每个元素存储了链表的第一个头节点 当链表存储节点长度超过8并且整个结构中的元素超过64个之后,链表开始树化,变成红黑树 红黑树的引入是为了解决链表过程造成的查找以及插入性能损失,红黑树是一个自平衡的二叉查找树,效率较高 数组的长度是2的次方 数组的扩容可以缓解链表查找纵深过高造成性能损失HashMap插入元素基本过程获取key的hash值 hash值经过扰动算法使存放的数据更为散列 构造出承载key和value的Node节点原创 2021-03-14 21:49:20 · 143 阅读 · 1 评论 -
Java多线程——ForkJoin初步认识及基本使用
概述也是刚接触ForkJoin,简单记录一下,纯属初体验。Fork/Join是JDK1.7加入的新的线程池实现,其体现的是一种分治思想,适用于能够进行任务拆分的CPU密集型运算(默认创建与CPU核心数相同大小的线程池,由于是CPU密集型运算,线程池大小超过CPU核心数没有什么意义)。Fork/Join在分治的基础上加入了多线程,可以把每个任务分解和合并交给不同的线程来完成,进一步的提高运算效率。示例这是一个计算1-n之间所有整数相加的demo,总体来说所谓的分治思想,类似于递归,将1-n原创 2021-03-03 22:24:27 · 359 阅读 · 1 评论 -
Java多线程——JUC之CountDownLatch、CyclicBarrier与Semaphore
CountDownLatch是JUC下提供的一个计数器,其通过计数递减的方式控制线程的执行顺序。package com.leolee.multithreadProgramming.juc.countDownLatch;import java.util.concurrent.CountDownLatch;/** * @ClassName CountDownLatchTest * @Description: TODO * @Author LeoLee * @Date 2021/3/2 *原创 2021-03-02 15:07:26 · 144 阅读 · 0 评论 -
CopyOnWriteArrayList解决多线程安全问题原理
CopyOnWriteArrayList部分源码/** * Replaces the element at the specified position in this list with the * specified element. * * @throws IndexOutOfBoundsException {@inheritDoc} */ public E set(int index, E element) { fina原创 2021-03-01 15:44:50 · 280 阅读 · 3 评论 -
JVM——垃圾回收相关基础概念(gc、四种对象引用)总结
System.gc()默认情况下,通过调用System.gc()和Runtime.getRuntime().gc(),会显式的触发Full GC,同时对新生代和老年代进行垃圾回收,尝试释放死亡的对象占用的内存,以及方法区的回收(方法区垃圾回收条件比较严格而已)。 System.gc()并不能保证对垃圾收集器的调用。即这个垃圾回收行为不一定能马上执行,仅仅是告诉JVM希望进行一次垃圾回收操作,具体实施与否不一定。一般情况下不回去手动调用该方法进行垃圾回收,垃圾回收是JVM自动进行的。public c原创 2021-01-14 13:49:41 · 441 阅读 · 0 评论 -
Java多线程——不可变类的设计
不可变定义某些对象是不可以改变的,在没有线程修改其中变量,即使对象是共享的,其也是线程安全的。可变类举例package com.leolee.multithreadProgramming.juc.immutable;import lombok.extern.slf4j.Slf4j;import java.text.ParseException;import java.text.SimpleDateFormat;/** * @ClassName Test * @Descript原创 2021-01-13 13:44:41 · 338 阅读 · 1 评论 -
Java多线程——Unsafe的CAS操作
Unsafe是一个sun包下的特殊类,包装了很多不便于开发者直接使用的功能方法。本片简单的说明一下Unsafe类中与CAS相关的操作,AtomicXXX等CAS无锁线程安全的工具类底层很多都用到了Unsafe的方法,所以理解和使用Unsafe类CAS相关的方法对AtomicXXX等工具类是非常重要的。Unsafe对象的获取由于Unsafe类无法直接创建(私有的构造方法),采用了单例模式,并且该单例模式的getInstance方法会校验调用该方法的类是否是系统类加载器,看来为了防止开发者直接使用Uns原创 2021-01-12 18:35:23 · 293 阅读 · 0 评论 -
Java 字符串操作的底层原理解析
开门见山常量与常量的拼接结果在常量池,原理就是编译器优化 常量池中不会存在相同内容的常量 只要拼接的元素中,有一个是变量,结果就是在堆中,变量拼接的原理是StringBuilder 如果拼接的结果调用了intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址常量拼接String s1 = "a" + "b" + "c";String s2 = "abc";//abc一定是放在字符串常量池中的,此地址赋给s2System.out.println(s1 == s原创 2021-01-07 22:23:47 · 496 阅读 · 0 评论 -
对象的实例化、内存布局以及访问定位
对象的实例化创建对象的方式new 包括单例、xxxBuilder、xxxFactory等变形方式 反射 Class对象的newInstance()方法,JDK9开始标识为废弃(只能使用无参构造方法,访问权限为public) Constructor的newInstance()方法(可以使用带参构造方法,访问权限没有限制) clone:不使用构造方法,需要类实现Cloneable接口的clone()方法 反序列化:从文件或者网络中获取一个对象的二进制流创建对象的步骤判断对象对原创 2021-01-05 01:34:56 · 200 阅读 · 0 评论 -
Java多线程——死锁的定位方法
如下代码运行之后会产生死锁:t1线程持有对象锁a在等待对象锁b的释放,t2线程持有对象锁b在等待对象锁a释放package com.leolee.multithreadProgramming.concurrent.syn;import lombok.extern.slf4j.Slf4j;/** * @ClassName DeadLock * @Description: 死锁问题 * @Author LeoLee * @Date 2020/12/7 * @Version V1.0 *原创 2020-12-07 13:36:37 · 461 阅读 · 0 评论 -
Java多线程——LockSupport的基本使用
package com.leolee.multithreadProgramming.concurrent.lockSupport;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.LockSupport;/** * @ClassName Test * @Description: LockSupport:JDK线程工具类 * @Author LeoLee * @Date 2020/12/7 * @Ver.原创 2020-12-07 11:44:04 · 175 阅读 · 0 评论 -
Java多线程——变量的线程安全中最容易被忽略的细节之子类的方法重写
成员变量和静态变量是否线程安全很明显如果它们没有被共享,则线程安全 如果它们被共享了,根据他们的状态是否能够改变,又分为如下两种情况 如果只有读操作,线程安全 如果有写操作,使用它们的代码处于临界区,线程不安全 局部变量引用线程安全情况示例: //=========================成员变量线程不安全分析============================== static class MemberVariableUnsafe {原创 2020-11-30 21:52:27 · 180 阅读 · 0 评论 -
Java并发编程:通过内存模型解析volatile关键字
原文写的太好了:https://www.cnblogs.com/dolphin0520/p/3920373.html转载 2020-10-29 11:23:31 · 139 阅读 · 0 评论 -
Java NIO:Buffer缓冲区源码详解以及“零拷贝”
注:NIO源码由机器生成,格式有点乱option & limit & capacity/* * 功能描述: <br> 分析 option limit capacity的变化 * 〈〉 * @Param: [] * @Return: void * @Author: LeoLee * @Date: 2020/9/18 11:19 */ public static void testIntBuffe原创 2020-09-19 20:06:55 · 291 阅读 · 0 评论 -
Java四种引用类型与垃圾回收
前言从初识java的时候,我们就知道java不同于C语言,是没有指针的概念的,有两种类型,基础类型和引用类型,java中一切皆对象......这里的对象其实就是所谓的引用类型,但是很少有人真的去关注引用类型,机缘巧合,今天看到了引用类型的四种模式的讨论资料,那作为一个不称职的底层程序狗,就来总结一下自己的认识。引用与对象上面已经说了,java不同于C语言,是通过“引用”来操作内存的,也...原创 2019-12-31 10:19:37 · 594 阅读 · 2 评论 -
Java中字符串匹配算法
什么是字符串匹配字符串匹配是主串返回模式串在主串中出现的位置,类似于mysql中FIND_IN_SET、LOCATE、POSITION、INSTR等函数的作用。比如主串:abbcefgh,模式串:bce,匹配结果为cde第一次出现的下角标2。Brute Force(暴力算法)该算法原理很简单,旨在从头到尾一次一次的比较模式串是否在主串中出现,算法思路如下第一轮:主串首字...原创 2020-01-13 17:25:20 · 978 阅读 · 0 评论 -
转载:十大经典排序算法最强总结
转载:https://www.cnblogs.com/guoyaohua/p/8600214.html感谢原文作者优秀的总结!0.1术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面 内排序:所有排序操作都在内存中完成 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传...转载 2020-01-13 15:36:51 · 94 阅读 · 0 评论