
Java
文章平均质量分 64
原来的1024
走过路过不要错过
展开
-
半编译半解释的Java语言和C++、Python等语言的区别
1. 引言我们编写的代码需要按照某些组织制定的规范,对于程序员来说,能够轻松理解;但是对于计算机来说,它们根本无法理解我们编写的代码,只能识别二进制指令。2. 编译型语言(如C++)和解释型语言(如Python)编译型语言:源代码直接被编译为可执行文件(二进制指令),在后续直接运行可执行文件,效率较高;解释型语言:边执行源代码边转换为二进制指令,每一次都需要重新解释执行,效率较低。3. 可执行文件为什么不能跨平台首先,这里的平台其实是指操作系统...原创 2021-10-14 11:56:56 · 408 阅读 · 0 评论 -
浅谈AQS(AbstractQueuedSynchronizer,同步队列)
1.1 同步队列:队列中存放排队等待锁的线程,每个线程放入队列时会被包装为Node类,如下图。1.2 抢锁:调用lock方法,如果抢锁成功(CAS成功,或者是重入——state计数加1),那么initialTryLock方法返回true,如下图。如果失败,再重新acquire尝试一次。尝试之后还是失败,那么将当前线程放入AQS等待队列中,并通过LockSupport的park方法挂起当前线程。抢锁时,公平锁FairSync和非公平锁NonFairSync的区别就是公平锁FairSync.原创 2021-07-13 23:04:43 · 163 阅读 · 0 评论 -
@Configuration注解有什么用,@Configuration和@Component注解的区别
1. @Configuration注解有什么用@Configuration注解的作用就是使用@Bean注解创建对象原创 2021-06-10 14:50:05 · 6411 阅读 · 0 评论 -
Spring注解的使用步骤,@Component注解创建的对象名称,常用注解Component、Repository、Service以及Controller的区别
1. pom.xml文件加入spring依赖原创 2021-06-10 10:26:21 · 5917 阅读 · 0 评论 -
Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。
1. 控制反转(Inversion of Control, IOC)将对象的创建、赋值、管理交给容器(Spring),技术实现是依赖注入(Dependency Injection, DI)原创 2021-06-09 20:03:31 · 219 阅读 · 1 评论 -
Spring常见问题
1.Element 'beans' cannot have character [children], because the type's content type is element-only.z原创 2021-06-09 19:53:10 · 285 阅读 · 0 评论 -
mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的
提示1:本文需在掌握动态代理基础后浏览,如果动态代理需要回顾可以看我的另一篇博客提示2:本文以我之前写的工程为模板进行讲解,工程结构及代码可以看我的另一篇博客1. 说在前头2. sqlSessionFactoryBuilder的build()过程:解析mybatis配置文件得到拥有Configuration属性的DefaultSqlSessionFactory对象3. sqlSession.getMapper过程...原创 2021-06-08 21:23:44 · 434 阅读 · 1 评论 -
反射中getDeclaredConstructors和getConstructors两个方法的区别,然后setAccessible什么时候用,作用是什么?
1.getDeclaredConstructors和getConstructors的区别原创 2021-06-08 11:09:27 · 2498 阅读 · 1 评论 -
什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用①功能增强,在实现目标功能的基础上,又增加了额外功能。就像生活中的中介一样,他跟两边客户会有私下交流一样。原创 2021-06-07 00:42:53 · 608 阅读 · 1 评论 -
There is no getter for property named ‘col‘ in ‘class String‘,不是说一个参数不需要@Param注解吗?#{}和${}的区别
1. 当一个String类型的参数作为sql语句的where条件可以正常运行2. 当一个String类型的参数不作为sql语句的where条件,而表示一个表名或列名,报错:Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL serv...原创 2021-06-06 20:59:40 · 141 阅读 · 0 评论 -
Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。
1. Mybatis工作流程1.1 使用MySQL创建数据库并生成一个表,如下图。原创 2021-06-06 15:08:49 · 550 阅读 · 2 评论 -
ThreadLocal怎么实现线程隔离的?可见性问题?为什么要重新定义一个threadLocalHashCode?为什么有内存泄露?弱引用又是什么?
1. ThreadLocal实现线程隔离的使用场景线程1的if代码块要执行的话,那么flag.get()的值必须是false;同理线程2的if代码块要执行的话,flag.get()的值必须是true。也就是说线程1要得到线程2对flag变量操作的值,线程2要得到线程1操作的值。最终没有任何结果输出,说明两个线程没有得到对方修改的内容。有些小伙伴就说了,各自线程得不到对方操作的内容不是很正常吗?这就是可见性问题啊。确实,由于共享数据存在可见性问题,线程间的数据不能得到很好的同步,也会出现上述场景。原创 2021-06-05 17:43:23 · 1532 阅读 · 0 评论 -
java源码编译为字节码的流程
1. 词法和语法分析1.1 词法分析:将源代码的字符流转为Token集合,关键字、变量名、字面量和运算符都可成为Token,比如“int i = a”原创 2021-06-04 22:31:03 · 2451 阅读 · 1 评论 -
Java常用分析工具Jps、Jstat、Jinfo、Jstack以及Jconsole的简单介绍和使用
1. JVM Process Status(Jps)可以列出正在运行的虚拟机进程,并得到进程的本地虚拟机唯一ID(Local Virtual Machine )原创 2021-06-04 12:20:30 · 1244 阅读 · 4 评论 -
分析对象内部结构,并详解synchronized锁膨胀升级和降级的过程
1. 对象内部结构原创 2021-06-03 16:54:32 · 545 阅读 · 1 评论 -
Java虚拟机JVM常用的几种回收算法和垃圾回收器
垃圾回收分为nin1. 垃圾回收算法1.1 Serial算法单线程原创 2021-06-02 19:47:57 · 413 阅读 · 2 评论 -
浅谈Java虚拟机JVM的垃圾回收机制
1. 什么是垃圾要回收垃圾,那么垃圾是什么?简单的逻辑就是不会再被使用的内存对象呗。2那怎么判断一个对象会否再被使用呢?原创 2021-06-02 17:03:15 · 140 阅读 · 1 评论 -
Concurrent包下的常用并发类和普通类之间的区别
1. ConcurrentHashMap和HashMap以及Hashtable之间的区别2. ConcurrenLinkedQueue原创 2021-06-01 15:19:03 · 295 阅读 · 0 评论 -
简单分析及总结BlockingQueue接口下七个常用类
1. BlockingQueue下主要有五个类ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue以及SynchronousQueue。1.1 ArrayBlockingQueue内部结构还是一个Object数组,只不过相对ArrayList来说,使用了ReentrantLock而已,如下图。1.2 LinkedBlockingQueue内部是头尾、单向链表,而LinkedList是头尾、双向节点,结果原创 2021-06-01 13:37:41 · 234 阅读 · 0 评论 -
集合之TreeMap源码分析,简单介绍什么是红黑树,SortedMap和NavigableMap之间的关系和区别
TreeMap底层实现原创 2021-05-29 18:09:46 · 355 阅读 · 0 评论 -
详解集合之HashMap——HashMap内部结构,自动扩容机制,为什么需要重写hashcode和equals方法
1. HashMap对象的创建1.1 默认的构造方法原创 2021-05-28 22:34:17 · 215 阅读 · 0 评论 -
详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!
LinkedList底层实现——头尾、双向节点1. LinkedList对象的创建1.1 参数为空的构造方法的方法体为空。原创 2021-05-28 15:59:37 · 301 阅读 · 0 评论 -
Integer及String的equals及==注意示例,涉及自动拆箱、自动装箱以及equals源码分析
1. Integer的缓存区是 -128——127,只要不是创建的Integer对象,那么这个范围内都是相等的。原创 2021-05-28 01:13:14 · 302 阅读 · 0 评论 -
详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍
1. ArrayList的创建1.1 参数为空的构造方法——ArrayList内部的Object数组为{}1.2 初始容量作为参数的构造方法——会直接创建相应大小的Object数组1.3 Collection对象作为参数的构造方法——内部Object数组指向Collection对象转换的数组2. ArrayList添加元素时的动态扩容机制2.1初始容量为0或者使用参数为空的构造方法创建的ArrayList对象自动扩容2.1.1 源码分析...原创 2021-05-27 23:08:55 · 1376 阅读 · 2 评论 -
为什么要使用内部类?非静态内部类和静态内部类的区别是什么?
1. 为什么要使用内部类?1.1 内部类继承某些类,然后外部类再通过内部类调用相应的功能,间接地使用多个父类的功能,可以弥补单继承的不足。这边假设一个场景,一个类需要继承网络连接类(自己定义的NetClass类)和线程类(Thread类),网络连接类拥有一个网络连接的方法;同时线程类是为了可以方便地异步执行任务。那么通过内部类的方式,外部类就可以间接地使用这两个类,弥补了单继承的不足,代码和运行结果如下。1.2私有权限的内部类仅仅可以被当前外部类访问,内部类的具体实现被隐藏。但是内部..原创 2021-05-27 17:06:09 · 618 阅读 · 0 评论 -
Future和CompletableFuture的区别和对比,以及Future主要的四个缺点——不能回调会阻塞、批量任务处理彼此依赖会阻塞、不能多个任务级联执行、得不到最先完成的任务
1. Future在执行结束后没法回调,调用get方法会被阻塞;CompletableFuture调用get方法获取结果也会被阻塞。2.但是CompletableFuture可以回调,可不通过get方法获取结果。3. Future模式执行批量任务,需要遍历Future列表依次获取结果,如果某个任务执行时间很长,那么会阻塞列表其它任务。4. CompletableFuture模式通过回调可以得到执行结果,不会阻塞其它任务。...原创 2021-05-27 00:58:32 · 8558 阅读 · 4 评论 -
设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法
1. Future模式的实现逻辑1.1 在具体实现之前,我们先将Future模式的实现逻辑和流程理清楚,然后编写代码。1.2 以甜品店买奶茶为例。第一步:得先有服务员;第二步:我们提交一个奶茶订单,会得到一张票据,由于制作奶茶花费时间较长,此时我们可以去买串串或者逛逛商场;第三步:服务员制作奶茶。1.3 最后,我们回到甜品店,根据票据得到我们的奶茶。或者服务员没做好我们稍等一会。1.4 从上面的分析可得,最主要的几个因素是:服务员、奶茶订单、票据。2. Future模式的具体实现.原创 2021-05-26 18:37:24 · 307 阅读 · 1 评论 -
Executors框架——5种常用的线程池介绍及区别
1. CachedThreadPool线程池2. FixedThreadPool线程池3. SingleThreadExecutor线程池原创 2021-05-25 23:44:44 · 762 阅读 · 0 评论 -
ThreadPoolExecutor线程池,shutdown和shutdownNow关闭线程池方式对比,以及确保线程池能够彻底关闭的一种方式
1. ThreadPoolExecutor线程池1.1 创建线程池,构造方法的几个参数说明及创建如下。1.2 shutdown方式关闭线程池a. 空闲且能interrupt表示该线程处于阻塞等待状态,不包括工作中的阻塞状态,比如Thread.sleep()就不包括;b. 当前正在工作的,会在后期获取任务时根据线程池的状态调用processWorkerExit方法销毁线程。1.3 shutdownNow方式强制关闭线程池所有可被interrupt的线程既包括空闲处于阻塞..原创 2021-05-25 21:01:37 · 2608 阅读 · 0 评论 -
类加载的三个阶段——加载、链接以及初始化,类的主动使用和被动使用
1. 类加载1.1 加载:查找并加载字节码文件。1.2链接:分为三个阶段:①验证,对魔数(保证是字节码类型文件)以及编译时jdk版本等信息进行验证;②准备:为静态变量分配内存,并设定默认值;③解析:把类的符号引用转为直接引用。1.3初始化:为类的静态变量赋予正确的初始值。2. 类加载的条件——主动使用①new 对象;②操作静态成员;③反射;④加载子类;⑤程序入口类3. 类的被动使用不会类加载3.1 子类调用父类的静态成员3.2 创建数组3.3 访问...原创 2021-05-19 22:56:32 · 992 阅读 · 1 评论 -
当前线程等待某些线程运行结束再执行的几种方案。CountDownLatch机制简单解读以及简单实现
需求背景:如果没有采取什么措施,在开启分支线程后,当前线程继续往后执行,而不会阻塞等待分支线程,代码及运行结果如下。1. Thread类的join方法优点:如果当前线程需要指定某些线程结束后再执行,那么可调用对应线程的join方法。缺点:因为join是实例方法,所以得知道线程对象的名称,如果程序比较复杂时,线程很多,不好操作。2. Thread类的isAlive方法其实join方法底层也是调用isAlive方法,源码如下。3. Thread类的...原创 2021-05-19 17:09:14 · 399 阅读 · 0 评论 -
常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别
1. 观察者设计模式观察者把自己“绑定”至目标,当目标发生变化时,目标“通知”观察者,然后观察者进行相应操作。你有没有觉得这种设计模式更像发布-订阅设计模式?其实这种设计模式和发布-订阅模式最大的区别就是观察者模式是目标发生变化,目标直接“通知”观察者;而发布-订阅模式中发布者和订阅者之间并没有直接联系,中间通过“消息中心”连接。3. 代码实现3.1 目标类和观察者接口代码如下。3.2 观察者两个实现类:StringObserverImpl和IntegerObserverImp.原创 2021-05-19 00:22:22 · 215 阅读 · 0 评论 -
为什么不使用volatile,其它线程也能得到当前线程修改后的值,不使用volatile也不存在可见性问题?原来解决可见性问题不一定需要volatile,println也可以
1. 可见性可见性指多线程编程下,其中一个线程修改了变量的值,其它的线程能得到修改后的值。2. 为什么不使用volatile,其它线程也能得到变量修改后的值实验代码分析:① 初始变量a=0,b=false;②然后,一个线程判断b 的值是否为false,是false那么循环输出“b is false and a is ”信息,直到 b 的值变为true,输出“b is true and a is”信息结束线程;③然后延迟2ms,为了让后面的线程晚于前面线程执行;④最后,另一..原创 2021-05-17 21:56:56 · 3363 阅读 · 9 评论 -
两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
1. 未加volatile关键字,由于缓存不一致性导致线程间数据交互失败public class Test { private static int INIT_VAL = 0; private static final Integer MAX_VAL = 5; public static void main(String[] args) { new Thread(){ @Override public void原创 2021-05-17 00:16:14 · 257 阅读 · 0 评论 -
java——自己实现基础的线程池及带有任务数过多拒绝策略、线程池销毁、自动扩充线程数量及闲时自动回收线程等操作的改进版线程池
1. 实现第一版基础的线程池1.1 首先我们定义一个线程池类ThreadPool,然后线程池有一个容器存放我们创建的线程,另一个容器则是存放当前线程池需要处理的任务队列,线程容器用ArrayList实现,任务队列容器用LinkedList实现。1.2 线程池功能分析:创建线程池时,往线程容器中加入默认数量的线程,但是由于此时的任务队列为空,所以线程处于等待状态;当往线程池提交任务时,唤醒正在等待的线程来处理任务,处理完任务后如果任务队列为空,线程又进入等待状态,代码及运行结果如下。import原创 2021-05-16 12:33:59 · 298 阅读 · 2 评论 -
单线程下的生产者--消费者模式详解,wait和sleep的区别
1. 单线程下的生产者--消费者模式1.1 该模式下,一个线程生产数据,另一个线程处理数据。当数据还没被处理,那么生产数据的线程进入等待状态;如果数据还没生产,那么处理数据的线程进入等待状态,代码及运行结果如下。// 生产者class Producer extends Thread{ private final List<Object> lst; public Producer(List<Object> lst){ this.ls原创 2021-05-15 20:00:07 · 528 阅读 · 1 评论 -
详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生
1. 创建线程1.1 创建线程主要有三种方式,第一种就是创建一个类,该类继承Thread类并覆盖Thread类的run方法。1.2 启动线程1.3 主线程和分支线程部分运行结果1.4 创建线程的第二种方式,就是调用Thread构造方法时传入Runnable接口的实现类对象,...原创 2021-05-14 20:46:20 · 695 阅读 · 3 评论 -
IO流介绍、java常用的几个IO流类之间的区别,以及各自的用法、使用场景
1. IO流介绍IO流(Input Output Stream,输入输出流),表示数据在程序内存和磁盘之间的传输。按照数据流的流向不同分为输入、输出流,输入流表示程序从磁盘读入数据,输出流表示程序往磁盘写数据。按照数据读取、写的方式不同分为字节流和字符流,字节流(类名以Stream结尾)表示程序按字节读取数据,什么文件都可以读取;字符流表示程序按照字符方式读取,方便读取各种编码的文本文件,但是无法读取图片、音频及视频等文件。所有的流都实现了java.io.Closeable接口,都有close方法。所有原创 2021-05-12 01:29:38 · 1269 阅读 · 0 评论 -
复习java的java.io.File类,深入理解并熟练使用
1. java.io包的File类1.1 File类的对象不仅仅指磁盘上的文件,文件夹也是一个File对象。1.2 要使用和了解File类,那就从File对象开始。File类有4种public的构造方法,可通过指定磁盘路径或网址得到File对象。1.3 当创建的File对象并不在磁盘存在时,我们可以使用File对象的createNewFile方法在磁盘上创建文件。1.4 使用File对象的mkdir方法创建目录。1.5 使用File对象的mkdirs()方法可创建多级目录。原创 2021-05-07 19:34:26 · 173 阅读 · 0 评论 -
轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点
1. 什么是反射反射可以动态获取类信息并创建对象、执行方法、属性赋值等,通过反射,我们就可以通过字节码文件反推得到源代码。2.反射怎么用2.1 在使用反射前,我们需要介绍4个类,分别是java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method以及java.lang.reflect.Field。因为对于一个字节码文件来说,其实就是一个类(先不考虑接口、数组等对象),一个类则主要是4部分:类信息、属性、构造器和方.原创 2021-05-06 23:18:52 · 1172 阅读 · 0 评论