自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 【版本控制】git错误merge操作导致分支产生脏代码问题溯源

记录开发过程中错误merge操作导致分支产生脏代码问题溯源有三个分支:master、dev、test执行操作如下01 git checkout master02 git commit -m 'feat 第一次提交'03 git checkout -b dev04 git commit -m 'feat dev devObj()'05 git checkout master06 git checkout -b test07 git commit -m 'feat test testObj()

2021-08-24 16:12:32 1082

原创 在foreach循环里进行元素的remove/add操作会产生的问题

阿里Java开发手册中有这么一条对foreach中进行remove/add操作的约束在反例中,如果判断条件为"1"不会报错,但是如果判断条件变成二则会抛出java.util.ConcurrentModificationException异常下面我们先来分析下为什么"2"会报错通过报错的堆栈信息可以看出是从at java.util.ArrayList$Itr.next(ArrayList.java:859)方法抛出的异常,但是我们并没有调用next方法啊?通过查看字节码可以看到foreach其实就是

2021-08-14 15:24:17 336

原创 JAVA数组中存储的是对象的引用而不是对象本身

在看同事代码的时候,看到一段突然有点看不明白了,伪代码大概如下List<Integer> list = new ArrayList<>();list.add(1);Integer integer = list.get(0);list.remove(0);System.out.println(integer);大致的操作就是先从get后remove,原integer的引用还有值么?然后看了下remove的源码,数组中的值确实被置为null了,这时就有点想不明白了那么in

2021-08-13 19:00:16 879

原创 【MYSQL】EXPLAIN命令

EXPLAIN命令EXPLAIN命令是查看优化器如何决定执行查询的主要方法,但最终不一定就是按照这个来。EXPLAIN可以作用于 SELECT、DELETE、INSERT、UPDATE和REPLACE语句。可以使用FORMAT=JSON来输出详细的执行计划成本EXPLAIN FORMAT=JSON SELECT * FROM zc_order;大致是以下的格式{ "query_block": { "select_id": 1, "cost_info":

2021-06-06 21:37:17 295 2

原创 【MYSQL】索引详解

索引是一种排好序的数据结构,帮助MySQL提高查询效率查看索引SHOW INDEX FROM `table_name`;创建索引-- create index 必须声明索引名,而alter table未声明索引名则会以第一个索引字段命名-- create index 无法创建主键索引,并且一次只能创建一个索引CREATE INDEX `index_name` ON `table_name` (`column`);-- 创建主键索引ALTER TABLE `table_name` ADD P

2021-06-05 22:56:20 228

原创 【MYSQL】SQL执行关键字的加载顺序

SQL执行关键字的加载顺序FROM # 先查询表是否存在ONJOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT为什么是on在join前面呢?按我的理解,join on 数据库会进行三步处理:先将两表做笛卡尔积产生中间表通过on的全部条件过滤中间表的记录根据join的类型判断是否要添加外部行(只有在外连接LEFT/RIGHT/FULL中才会发生),把保留表的记录添加到中间表on与where的区别?on是用于生成中间表的过滤条

2021-06-05 14:18:24 136 2

原创 【MYSQL】MySQL存储引擎

MySQL存储引擎查询mysql支持的存储引擎show engines;查询默认的存储引擎show variables like '%storage_engine%';查看指定表的存储引擎等信息show table status like 'table_name' ;查询表定义SQL(DDL)show create table table_name;InnoDB和MyISAM的主要区别InnoDBMyISAM事务支持不支持锁支持行锁和表锁只

2021-06-05 14:13:35 48

原创 【并发编程】Executor 框架

Executor 接口Executor 框架的基础,它将任务的提交与任务的执行分离开来public interface Executor { // 执行方法,由实现类实现 void execute(Runnable command);}ExecutorService 接口ExecutorService 扩展了 Executor 接口,提供了一些终止方法和submit方法public interface ExecutorService extends Executor {

2021-06-04 22:09:30 85

原创 【并发编程】ThreadLocal 初识

ThreadLocal本地线程,意思就是当前ThreadLocal中填充的变量属于当前线程,对于其他线程是隔离的。在进行对象跨层传递时使用,可以避免多次传递不同线程间数据隔离管理数据库链接private static ThreadLocal<T> local = new ThreadLocal<>();// ThreadLocal存在一个内部类static class ThreadLocalMap { Entry(ThreadLocal<?> k

2021-06-04 17:00:52 68

原创 【并发编程】CountDownLatch、CyclicBarrier 等同步器

JUC下的一些同步器CountDownLatchCyclicBarrierSemaphorePhaserExchangerLockSupportCountDownLatch使一个线程等待其他线程都执行完后再执行。通过构造器初始化要等待的线程数,每个线程执行后调用 countDown() 方法使其计数器减一调用 await() 方法的线程会被挂起,直到计数器减为0自动执行public static void main(String[] args) throws ExecutionException,

2021-06-04 16:43:22 106

原创 【并发编程】Callable 接口

Callablepublic interface Callable<V> { // 泛型即为返回值类型 V call() throws Exception;}通过 FutureTask 与Thread建立连接// Thread 接收RunnableThread(Runnable target)// Runnable有个子接口RunnableFuture, RunnableFuture有个实现类FutureTask// FutureTask可以接收Callable和Run

2021-06-04 16:41:04 64

原创 【并发编程】CopyOnWriteArrayList、ConcurrentHashMap、BlockingDeque 并发容器

并发容器CopyOnWriteArrayListConcurrentHashMapBlockingDequeCopyOnWriteArrayList在多线程的情况下使用普通集合会发生 ConcurrentModificationException 异常List<Integer> list = new ArrayList<>();for (int i = 1; i <= 10; i++) { new Thread(() -> { list.a

2021-06-04 16:35:02 108 2

原创 【并发编程】Lock锁及其常见子类

Lock锁及其常见子类LockReentrantLockReentrantReadWriteLockLock// 获取锁void lock();// 释放锁void unlock();// 可以被中断的锁void lockInterruptibly() throws InterruptedException;// 尝试获取锁并返回当前锁的获取情况。boolean tryLock(); // 尝试获取一段时间的锁并返回当前锁的情况boolean tryLock(long time, Ti

2021-06-04 16:25:10 351

原创 【并发编程】volatile 关键字

volatile先了解一下什么是可见性可见性:当一个线程对共享变量进行了修改,那么其他线程立即可以看到修改后的最新值共享变量在线程间的可见性每个线程都有自己独立的工作内存,在操作共享变量时,其实是操作从主存中拷贝的一份副本。对于线程1的修改想要让线程2看到,必须要经历两个步骤:1.必须先将线程1工作内存中的共享变量刷新到主内存中2.把主存中最新的共享变量的值更新到线程2的工作内存中作用volatile通过内存屏障实现禁止指令重排,并且支持可见性。被volatile修饰的变量的值不会被本地线

2021-06-01 17:03:44 58

原创 【并发编程】synchronized 偏向锁、轻量级锁、重量级锁

关键字 Synchronied可重入锁、悲观锁、非公平锁、可见性、原子性几种使用场景// 1.同步代码块,锁(obj)可以是任意对象或者this synchronized (obj){}// 2.同步方法,锁是thispublic synchronized void ticket(){}// 3.静态同步方法,锁是该类的.class对象public synchronized static void ticket(){}不建议使用String作为锁对象,因为常量池的存在,会将

2021-06-01 16:51:50 133

原创 【并发编程】锁介绍以及原子类

锁介绍以及原子类各类锁原子类各类锁乐观锁:读多写少,总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。悲观锁:写多,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。java中的悲观锁就是synchronized,AQS则是先尝试CAS去获取锁,获取不到才转换为悲观锁公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列

2021-06-01 15:52:40 74

原创 【集合类】HashMap几个常见问题

hashMap的底层存储结构是?在1.7是由数组+链表组成,1.8是数组+链表+红黑数为什么要进行树化?链表取元素要从头遍历到对应的节点,时间复杂度是O(n),而红黑树基于二叉树时间复杂度是O(logN),从而提高搜索效率。但是红黑树节点的大小约是普通节点的两倍,只有包含足够节点时进行转化才比较合适,这是出于空间与时间平衡的考虑为什么树化阈值是8?如果hashCode分布离散足够好的话,一般很少会进行树化,在理想情况下,链表长度符合泊松分布,各长度的命中概率递减,而8是的概率就已经足够小了为什么

2021-05-31 16:43:39 186

原创 【并发编程】JUC之AQS源码分析

JUC之AQS源码分析AQS是什么全称:AbstractQueuedSynchronizer,抽象队列同步器是java.util.concurrent并发包下的一个抽象类JDK官方文档描述:提供一个框架,用于实现依赖先进先出等待队列的阻塞锁和相关同步器FIFO队列:这是一个虚拟的双向队列(双向链表),也可以看成CLH锁的变种阻塞锁和同步器:ReentrantLock、Semaphore、CountDownLatch为什么要讲它AQS在java中算是一个比较底层的类,开发中并不会去

2021-04-20 19:42:48 134

原创 JAVA 基础知识点复习(十九)反射

反射动态获取对象信息和调用对象方法的功能称之为反射,反射其实就是获取类的字节码文件获取Class对象的四种方式知道具体类的话Class<Test> testClass = Test.class;通过对象实例获取Class<? extends Test> aClass = test.getClass();通过 Class.forName()传入类的路径获取Class<?> aClass1 = Class.forName("cn.example.Test"

2020-12-06 21:05:05 69

原创 【JVM】JAVA中的四种引用

JAVA中的四种引用强软弱虚强引用:只要有一个应用指向这个对象,那么垃圾回收器绝不会回收它,当内存不足时报OOMObject obj = new Object();软引用:只有内存空间不足时才会去回收它,适用于缓存,不会OOM// jvm -Xmx20mSoftReference<byte[]> ref = new SoftReference<>(new byte[1024 * 1024 * 10]);System.out.println(ref.get());

2020-12-06 18:09:18 68

原创 JAVA 基础知识点复习(十八)包装类

这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录

2020-10-28 18:15:50 97

原创 JAVA 基础知识点复习(十七)线程同步关键字Synchronized

大纲线程安全线程同步wait和sleep的区别生产者消费者案例 synchronized虚假唤醒生产者消费者案例 Lock线程安全局部变量中的基本数据类型(8种)永远是线程安全的。局部变量中的对象类型只要不会被其他线程访问到,也是线程安全的。一个对象实例被多个线程同时访问时,他的成员变量就可能是线程不安全的。线程同步同步关键字 synchronizedsynchronized 可重入锁,既保证了可见性也保证了原子性加锁方法和非加锁定方法的执行互不影响不同的锁对象// 1.同步代码

2020-10-27 18:49:15 210

原创 JAVA 基础知识点复习(十六)线程类Thread

大纲多线程基本概念线程的优缺点java默认有几个线程?java无法直接创建线程创建线程对象的几种方式线程的几种状态线程对象的主要方法线程类的几个静态方法多线程基本概念进程:是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间。线程:线程是指进程中的一个执行流程,一个进程中可以运行多个线程,多个线程共享进程的内存。幂等性:一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。竞态:多线程情况下程序计算的正确性依赖于相对时间顺序或线程的交错。导致竞态条件发生的代码区称作临

2020-10-27 15:56:15 87

原创 【版本控制】Git常规操作命令

大纲GitGit拉取远程仓库配置(SSH)Git本地项目配置Git本地项目与远程项目关联git的四大工作区域git add / commitgit fetch / pullgit pushgit statusgit loggit diffgit resetgit branchgit mergegit stashgit taggit rebaseGitGit拉取远程仓库配置(SSH)查看git配置git config --list初始化用户名、邮箱,如果你没有初始化过,那么直接:git conf

2020-10-15 17:00:47 630

原创 【数据结构】红黑树简单实现 JAVA版

大纲通过java简单实现红黑树打印红黑树结构(网上找的一个方法)通过java简单实现红黑树package com.example.demo.rbt;import lombok.Data;public class RBTree<K extends Comparable<K>, V> { /** * 红色 */ public static final boolean RED = true; /** * 黑色

2020-07-02 10:54:36 189 1

原创 【数据结构】红黑树理解

大纲红黑树性质自平衡查询插入练习红黑树红黑树是一个含有红黑节点并能够自平衡的二叉查找树性质必须满足五个性质每个节点要么是黑色,要么是红色根节点是黑色每个叶子节点(NIL)是黑色的每个红色节点的两个子节点一定是黑色的任意一节点到其自身的每个叶子节点的路径都包含相同数量的黑色节点由性质五可推出:如果一个节点存在黑子节点,那么该节点一定有两个子节点下图是一个基础的红黑树结构红黑树并不一定是完美的平衡二叉查找树,如上图左子树就比右子树高,但是它符合性质五:任意一节点到每个叶子节点的路径

2020-07-02 10:48:53 271

原创 【MYSQL】记录 MYSQL UPDATE AND 产生的问题

记录 MYSQL UPDATE AND 产生的问题基于 Server version: 8.0.16 MySQL Community Server - GPL 版本表结构数据初始化-- ------------------------------ Table structure for t_user-- ----------------------------CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `u

2020-06-29 11:47:26 178

原创 【集合类】源码解析之HashMap类

大纲HashMap类声明主要字段构造函数tableSizeFor新增方法put方法hash方法putVal方法扩容方法resize方法查询方法get方法getNode方法删除方法remove方法removeNode方法替换方法replace方法HashMap数组+链表+红黑树,线程不安全,允许null键null值类声明public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cl

2020-06-28 16:30:41 76

原创 【集合类】源码解析之 Map接口

Map接口双列集合,键值对(确保键的唯一)构造函数public interface Map<K,V>内部接口 Entry抽象了内部存储的节点,对应一个键值对interface Entry<K,V> { // 返回此项的Key K getKey(); // 返回此项的value V getValue(); // 设置此项的value V setValue(V value); /** * 两个entry比较相等性

2020-06-28 16:18:01 84

原创 【集合类】源码解析之 HashSet类、LinkedHashSet类

大纲HashSetLinkedHashSetHashSet哈希表结构(其实用的是Map),线程不安全,不保证顺序,自动去重(必须覆盖hashCode和equals方法)类声明public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable当哈希算法算出两个值相同时,称之为哈希冲突。当发生哈希冲突时需要用equals对内容进行判断。

2020-06-24 10:04:46 87

原创 【集合类】源码解析之 Set接口、AbstractSet抽象类

大纲Set接口AbstractSet抽象类HashSetSet接口不包含重复元素的集合。 更正式地说,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素类声明public interface Set<E> extends Collection<E>和Collection接口的方法一致,通过 equal() 和 hashCode() 排重AbstractSet抽象类类声明public abstract class AbstractS

2020-06-24 09:57:15 181

原创 【集合类】源码解析之 Vector、Stack类

大纲VectorStackVector基于数组,线程同步,慢类声明public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableVector的方法和ArrayList基本相同,但是在方法上都加了 synchronized 关键字,作为线程同步的集合。已经不推荐使用,如果有相关的同步需求可以使用 Col

2020-06-24 09:53:13 87

原创 【集合类】源码解析之 AbstractSequentialList 抽象类、LinkedList类

大纲AbstractSequentialList 抽象类LinkedListList方法Deque方法工具方法序列化其余方法AbstractSequentialList 抽象类顺序列表,相对于RandomAccess标记接口而言,继承了RandomAccess接口表示其容器支持随机访问,这类容器优先使用索引进行操作,而对于不支持随机访问的容器通常使用迭代器进行操作public abstract class AbstractSequentialList<E> extends Abstract

2020-06-15 11:22:50 95

原创 【集合类】源码解析之 Queue接口、AbstractQueue抽象类、Deque接口

大纲Queue接口AbstractQueue抽象类Deque接口Queue接口队列,除了基本的Collection操作之外,队列还提供额外的插入,提取和检查操作。 这些方法中的每一种都有两种形式:如果操作失败,则抛出一个异常,另一种形式返回一个特殊值( null或false ,具体取决于操作)。通常(但不一定)是以FIFO(先进先出)方式排序元素例外情况包括优先级队列(根据提供的比较器对元素进行排序)和LIFO队列(或堆栈)(后进先出)类声明public interface Queue<E

2020-06-15 11:16:12 115

原创 【集合类】源码解析之 ArrayList类

大纲ArrayList重点字段构造函数扩容存储删除序列化和反序列化jdk1.8新增的方法实现其余方法ArrayList基于数组,线程不安全,随机存取,查询快增删慢,以1.5倍扩容,最大是Integer.MAX - 8public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{重点字段// 默

2020-06-10 16:31:17 99

原创 【集合类】源码解析之 List接口、AbstractList抽象类

大纲List接口AbstractList抽象类内部类 Itr内部类 ListItrSubListRandomAccessSubListList接口存取顺序一致,有索引,允许重复类声明public interface List<E> extends Collection<E> 特有方法:所有通过索引操作的方法都要注意其索引的范围,否则容易导致发生 IndexOutOfBoundsExceptionvoid add(int index, E element); // 向指

2020-06-10 09:48:35 156

原创 【集合类】源码解析之 Iterable接口、Collection接口、AbstractCollection抽象类

大纲集合Iterable接口Collection接口AbstractCollection抽象类集合常用集合类框架图Iterable接口Iterable 代表接口具备迭代能力,实现此接口允许对象成为“ for-each循环”语句的目标public interface Iterable<T> { // 真正的迭代器 Iterator<T> iterator(); // foreach方法 jdk1.8新增 default void forEa

2020-06-10 09:34:25 165

原创 JAVA 基础知识点复习(十五)泛型

大纲定义泛型的限定泛型擦除定义在编译时期就对元素的类型进行检查,一旦发现不匹配就编译失败。在编译时泛型就被擦除了,所以无法在运行时得知其类型参数的类型。通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展),这能够显著提高性能并得到更高质量的代码(高性能),因为可以重用数据处理算法,而无须复制类型特定的代码(可重用)。泛型可以定义在类,接口,方法上定义时尖括号里的每个元素都代指一种未知类型尖括号的位置非常讲究,必须在类名之后或者方法返回值之前泛型在定义处只具备Obj

2020-05-11 11:59:19 263

原创 JAVA 基础知识点复习(十四)异常

大纲异常定义解决异常自定义异常try...catch...finallyThrowable三个常用方法异常定义按照面向对象的思想对程序运行时其发生的不正常情况进行描述和对象的封装除非你能解决(或必须要处理)这个异常,否则不要捕获它,如果打算记录错误消息,那么别忘了把它再抛出去分类​ Throwable​ |​ Error Exception​ |​ RuntimeExcep

2020-05-09 17:18:07 766

原创 JAVA 基础知识点复习(十三)枚举类

大纲枚举类定义常见方法枚举类在switch中实际应用(一)外部直接通过value获取name(二)通过抽象方法扩展枚举类枚举类定义@Getterpublic enum WeekEnum { MONDAY(1, "星期一"), TUESDAY(2, "星期二"), WEDNESDAY(3, "星期三"), THURSDAY(4, "星期四"), FRIDAY(5, "星期五"), SATURDAY(6, "星期六"), SUNDAY(7, "星期

2020-05-09 17:00:01 806

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除