- 博客(49)
- 收藏
- 关注
原创 Mysql批量更新及插入(参数为Map)
前言 这个问题困扰了整整一天。 当遇到多条记录需要插入或者更新的时候,往往会使用批量操作来提高效率,提高性能。然而在使用过程中确是出现了各种问题,真的是有些坑只有趟过才知道!!! 好了,话不多说,进入正题。 注:数据库Mysql 持久层框架 Mybatis一、批量更新需求如下代码: Map u
2017-07-12 14:16:29 7353
原创 适配器模式
定义将一个类的接口转换为另一个接口,以满足特定场景的需要。举个栗子,比如三孔插头通过一个转换头转换为两孔插头;比如通过转接线将普通耳机接口转换为苹果方孔耳机接口等。适配器模式允许通常因为接口不兼容而不能在一起工作的类相互配合完成工作。适配器模式类图可以看到适配器模式包含以下角色:Target:目标接口,即用户所需的接口。Adaptee:适配者类,即被适配的角色,是一个已经存在的接...
2019-01-05 21:50:32 441 1
原创 七牛云图床外链失效之解决办法
简述前段时间发现博客中的图片外链全都失效了,原因是使用的七牛云的测试域名被收回,然而打开控制平台发现图片无法直接下载,参考网上的博客成功找回,于是便记录下来。具体找回步骤下载小工具首先需要下载七牛云提供的一个小工具 qrsctl,我下载的是 windows版本,链接中包含教程和具体的用法。下载完成后的文件名为:qrsctl-v3.2.20170501,最好放在一个新建的文件夹中操作。登...
2019-01-05 12:43:58 2301 2
原创 IO模型碎碎念
IO相关概念同步和异步同步:发出一个调用后,在没有得到结果之前,该调用就不会返回。当调用返回时,就能得到返回结果。(调用者主动等待结果)异步:发出一个调用后,这个调用就返回了,没有返回结果。(调用者被动等待结果,会得到通知)阻塞与非阻塞阻塞:某个请求发出后,如果不满足请求需要的条件,那么就会一只等待,直到满足条件。非阻塞:某个请求发出后,如果不满足请求需要的条件,则...
2018-07-23 01:30:05 342
原创 浅析Cglib动态代理
介绍我们知道JDK动态代理只能代理实现了接口的类,没有实现接口的类是无法通过JDK来代理的。 Cglib是针对类来实现代理的,它的原理是对指定的目标类生成一个子类,这个子类覆盖目标类的方法并在其中实现方法的增强。因为采用了继承和重写,因此不能对final的类、final方法进行代理。Cglib底层其实是借助了ASM这个非常强大的Java字节码生成框架,它可以在运行时对字节码进行修改或...
2018-07-22 10:40:16 627
原创 多线程经典实例(二)
上一篇文章多线程经典实例(一) 讲到了几个多线程相关的例子,接下来我们来看一个经典的案例:生产者消费者问题。介绍生产者消费者问题是多线程中的一个经典问题,问题大概就是有一块缓冲区作为仓库,当仓库未满时生产者可以将产品放入仓库,当仓库未空时消费者可以从仓库取走产品。解决这个问题的核心就是处理好多线程之间的同步与协作。生产者消费者的实现方式通常有以下几种方式来实现生产者与消费者...
2018-07-21 14:23:27 397
原创 多线程经典实例(一)
在多线程的学习当中,有许多经典的例子值得学习,比如售票窗口、线程交替执行、生产者消费者等。下面就来看两个有关线程交替执行的案例。两个线程轮流打印数字这里采用 wait/notify 等待通知和 Lock/Condition 两种方式实现。wait()/notify()实现简单介绍一下wait/notify机制的几个方法。 以下4个方法都必须在获取了锁的情况下才能调用: ...
2018-07-20 21:10:44 5497 1
原创 深入浅出 ThreadLocal 的实现原理
ThreadLocal的简介ThreadLocal称为线程局部变量。在每个线程中都有自己独立的ThreadLocal变量。 每个线程中可有多个threadLocal变量。ThreadLocal的用法public class ThreadLocalDemo { private static ThreadLocal<Integer> threadLocal1...
2018-07-14 17:38:30 339
原创 JDK动态代理的实现原理浅析
JDK动态代理简介什么是JDK动态代理? 先看看代理的概念——代理:为其他对象提供一种代理以控制对这个对象的访问。 代理在生活中很常见,比如买火车票可以不去火车站,而是通过代售点;想要逃课了,就让同学代签到等等。 说白了,就是可以通过代理来完成目标事件。(自我理解)不同于静态代理直接采用编码的方式实现,JDK动态代理是利用反射机制在运行时创建代理类,进而调用相应的方法。J...
2018-06-27 14:37:16 539
原创 排序算法之基数排序(Java)
基数排序基数排序是一种基于分配的排序(空间换时间),不同于常见的基于比较的排序(冒泡、快排、归并…等)。 基于比较的排序时间复杂度通常是O(n^2)或者O(nlogn),下限是O(nlogn); 基于分配的排序算法的时间复杂度可以达到O(n),但需要消耗额外空间;在某些时候,基数排序的效率高于其它基于比较的排序算法(快排、归并等)。原理原理是将整数按位数切割成不同的...
2018-06-24 13:43:32 725
原创 Mysql批量更新某个字段的部分值
替换函数REPLACE(str,from_str,to_str) 将字符串 str 中出现的 from_str 全部替换为 to_str。 (注意:大小写敏感!)需求:将某一个表示路径字段中的 ‘https’ 替换为 ‘https://’ 。实现:update Messageinfo set path = REPLACE(path,'https','http...
2018-06-22 11:04:29 5211
原创 mybatis-generator 无法自动生成表字段类型为 text 的属性
问题描述:在使用mybatis-generator 自动生成插件时,关于数据库表中字段类型为 text 的字段无法映射到自动生成的 JavaBean 中。比如消息表 t_message_info 中的 message_content 字段为 text类型:<table tableName="t_message_info"></table>解决方案:...
2018-05-12 22:17:33 4176
原创 Map 的4种遍历方式及比较
Map 的4种遍历方式及比较KeySet第一种方式: keySet 其实遍历了两次,第一次获取Iterator,第二次根据key获取value,因此性能较差。 public void testKetSet(Map<String, String> map) { Set<String> keys = map.keySet(); ...
2018-04-13 13:12:43 6017
原创 ActiveMQ结合Spring的使用
ActiveMQ结合Spring收发消息直接使用ActiveMQ的方式需要重复写很多代码,且不利于管理,Spring 提供了一种更加简便的方式————Spring JMS ,通过它可以更加方便地使用ActiveMQ。Maven 依赖结合Spring使用ActiveMQ的依赖如下: <!-- Spring JMS --> <de...
2018-04-13 12:56:09 318
原创 ActiveMQ的简单使用
ActiveMQ的简单使用ActiveMQ 是一种消息队列,是Apache提供的一个开源消息系统,完全采用Java实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。第一种方式(点对点)——Queue生产者import org.apache.activemq.ActiveMQConnectionFactor...
2018-04-13 11:46:22 321
原创 Mysql自动还原脚本(.sh文件)
Mysql自动还原脚本(.sh文件)还原数据库的基本指令source d:/abc.sql当连接数据库之后,可以直接使用 以上命令来还原指定数据库。自动还原脚本那么能不能使用脚本的方式自动还原呢? 当每次都是还原同一个数据库,或者还原同一个数据库中的指定表时,便可以采用脚本的方式执行。当数据库备份文件存储在云端时,可采用以下脚本:#!/bin/bash
2018-01-22 19:09:40 2027
原创 Java实现Mysql的定时备份与还原
一、数据库的定时备份备份命令Mysql的备份指令:1. 指定数据库:mysqldump -h localhost -uroot -proot tuser>d:\user_2017-12-25_15-42-10.sql tuser:数据库名 user_2017-12-25_15-42-10.sql:文件名2. 指定数据库中的多个表:mysqldump -h localhost -uroot -pr
2018-01-02 17:07:46 2622 1
原创 单链表的反转
链表的反转例如链表: 1->2->3->4->5 反转之后: 5->4->3->2->1思路:从头到尾遍历原链表,每遍历一个节点,将其摘下放在新链表的最前端,作为头节点。 代码实现:public static void ReverseNode(node head){ node p = head; node pre = null; node
2017-12-06 11:33:24 287
原创 求一个单链表的中间节点
求一个单链表的中点思路:用两个指针,慢指针每次走一步,快指针每次走两步,当快指针结束时,慢指针所在的位置就是中点。代码实现主要方法:public static node lookMid(node head){ //求中间节点,快慢指针 node low = head; node fast = head; while(fast != nul
2017-12-05 21:48:20 989
原创 JVM之对象创建过程
一、Java对象的创建过程在Java程序中,通常都是通过 new 关键字来创建对象,那么在虚拟机中对象是如何创建的? (普通Java对象,不包含数组和Class对象)虚拟机创建对象主要经历5个步骤:类加载检查、为对象分配内存、内存空间初始化、对象设置、执行对象方法。1 类加载检查当虚拟机遇到 new 指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表
2017-12-02 19:47:13 460
原创 JVM之类加载机制
一、类加载机制虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是虚拟机的类加载机制。类加载的时机那么类到底什么时候会加载呢?(初始化) 当对一个类进行主动引用的时候。主动引用主动引用有5种情况:new实例化对象、读取或设置一个类的静态字段时、调用一个类的静态方法时 使用java.lang.reflect包的方
2017-12-01 21:48:48 330
原创 中缀表达式转后缀表达式(逆波兰)
一、中缀表达式转后缀表达式中缀表达式就是普通的表达式。如:9+(3-1)*3+10/2 后缀表达式是一种不需要括号的表示法,又叫逆波兰表达式。上面的式子用后缀法表示:9 3 1 - 3 * + 10 2 / +那么如何转化成后缀表达式?思路:从左往右遍历: 1. 如果是数字则直接输出 2. 如果是符号则入栈,但要通过以下判断若该符号c是右括号或者c的优先级≤栈顶符号,则栈中元素依次出栈输出,
2017-11-30 19:47:18 907
原创 二叉树的深度和宽度
一、二叉树的深度思路:递归实现。每个节点都可以看作根节点根节点(任意一个节点)的深度等于它的左子树或右子树深度最大值+1从根结点开始遍历,若遍历到叶子节点,深度为0 //二叉树的深度 public static int Depth(node root){ if(root == null){ return 0; }
2017-11-14 20:53:55 661
原创 二叉树的遍历
一、遍历方式前面文章记录了二叉树的创建,那么二叉树该如何遍历呢? 二叉树的遍历方式有四种,分别是前序、中序、后序遍历和层序遍历。前、中、后分别表示根节点在前遍历或在中间遍历或在最后遍历,层序遍历就是按每一层的节点遍历。上图中简易二叉树的遍历结果如下:前序:ABC 中序:BAC 后序:BCA 层序:ABC二、遍历实现以 二叉树的创建 中的二叉树为例进行遍历。前序、中序、后序二叉树的前序、中序、
2017-11-14 19:08:45 518
原创 二叉树的构建(Java)
二叉树的建立思路:先对二叉树进行扩展,将每个节点的空指针设置为“#”,这样就可以按前序遍历的方式创建一个二叉树。 创建一个上图所示的二叉树。 输入的值为:A B D # # E # # C # # 实现://创建二叉树public class Bshu { static int i=0; public static void main(String[] args) {
2017-11-14 19:02:10 1017
原创 Java并发之Executor框架
一、Executor框架的介绍Java中的线程既是工作单元又是执行机制。JDK1.5开始,把工作单元与执行机制分离开来。工作单元为Runnable(Thread实现该接口)和Callable,执行机制就是Executor框架。 使用Executor框架时不用显式的创建线程Thread。Executor框架由三部分组成: 任务:Runnable或Callable 任务的执行:ExecutorS
2017-11-05 11:40:16 391
原创 Java线程池的实现分析
一、线程池的介绍线程池是一种并发框架。优势: 1. 降低资源消耗。(重复利用线程,减少开销) 2. 提高响应速度。(任务到达可直接执行,不需要等待创建线程) 3. 提高线程的可管理性。(统一分配、监控、调优)ThreadPoolExecutor是线程池的核心实现类。可以通过ThreadPoolExecutor来创建一个线程池。二、线程池的实现分析线程池的实现是ThreadPoolExecuto
2017-11-03 21:22:12 324
原创 JVM之垃圾收集器
一、垃圾收集器概述垃圾收集器是内存垃圾回收算法的具体实现。 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此出现了7种收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1。 它们以组合的形式配合工作来完成不同分代的垃圾收集工作。常用组合: 1. Serial/Serial Old 2. ParNe
2017-11-02 20:47:01 436
原创 HashMap 在JDK1.8中的实现(与JDK1.7对比)
一、HashMap的实现分析介绍通过前面JDK1.7的分析,我们知道,当负载因子和Hash算法设计的很好时,可以降低hash碰撞的概率,但在数据量过大时也避免不了会出现链表变长的情况,一旦出现链表过长,查找元素变慢,则会严重影响HashMap的性能。 于是,在JDK1.8中,对数据结构做了进一步的优化,引入了红黑树。而当链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点
2017-10-30 22:05:03 527
原创 HashMap 在JDK1.7中的实现原理分析
一、HashMap的介绍HashMap是存储键值对(key,value)的一种数据结构。 每一个元素都是一个key-value。 HashMap最多只允许一个key为null,允许多个key的value值为null。 HashMap是非线程安全的,只适用于单线程环境。 HashMap实现了Serializable、Cloneable接口,因此它支持序列化和克隆。二、HashMap的实现原理从
2017-10-30 21:55:55 602
原创 Java并发工具类之Semaphore
一、Semaphore的概念Semaphore又叫信号量,用来控制同时访问特定资源的线程数量。它通过协调各个线程,以保证合理地使用公共资源。Semaphore和CountDownLatch一样,也是维护了一个计数器,其本质是一个共享锁。Semaphore有公平性和非公平性之分。Semaphore的工作过程: 当一个线程想要访问某个共享资源时,它必须要先获取Semaphore;当Semaphor
2017-10-26 22:23:02 485
原创 Java并发工具类之CountDownLatch
一、概念CountDownLatch也叫闭锁,是并发包的工具类之一,允许一个或多个线程等待其他线程完成操作后再执行。回忆之前,我们知道Join方法,用于让当前线程等待join的线程执行结束。while(isAlive()){ wait(0);}其原理就是不停地检查join线程是否存活,如果存活则一直等待。 CountDownLatch也可以实现join的功能,且功能更多。 CountD
2017-10-26 13:08:56 338
原创 Java并发工具类之CyclicBarrier
一、CyclicBarrier的概念CyclicBarrier的意思是可循环使用的屏障。它可以让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有阻塞的线程才会继续执行。它就好像一道关卡,只有所有的部队(线程)都到了才能放行。二、CyclicBarrier的实现分析部分源码:public class CyclicBarrier { private final Reen
2017-10-26 13:03:54 370
原创 Condition的实现分析
一、Condition的概念介绍回忆synchronized关键字,它配合Object的wait()、notify()系列方法可以实现等待/通知模式。对于Lock,通过Condition也可以实现等待/通知模式。Condition是一个接口。 Condition接口的实现类是Lock(AQS)中的ConditionObject。 Lock接口中有个 newCondition()方法,通过这个方法
2017-10-25 15:18:32 413
原创 ReentrantReadWriteLock可重入读写锁
一、ReentrantReadWriteLock的概念介绍前面提到的锁(独占锁、ReentrantLock)等都是排他锁,这些锁在同一时刻只允许一个线程访问。 而读写锁在同一时刻可以允许多个读线程访问,但在写线程访问时,所有读线程和其他写线程都阻塞。ReadWriteLock并不是继承自Lock接口,而是一个单独的接口。public interface ReadWriteLock { Lo
2017-10-24 15:26:57 369
原创 ReentrantLock重入锁
一、ReentrantLock概念重入锁概念什么是重入锁? 顾名思义,就是支持重复进入的锁。 定义:支持一个线程对资源的重复加锁。(注意是一个线程)回忆前面有关AQS实现的文章,关于独占锁,当一个线程获取锁后,如果该线程再次调用lock()方法,那么该线程会被自己阻塞。 原因是在实现tryAcquire()时没有考虑占有锁的线程再次获取锁的场景。因此这个锁是不支持重入的锁。 回顾synch
2017-10-23 11:40:56 621
原创 JVM之垃圾收集算法
一、对象的死亡判定JVM垃圾回收针对哪些区域?回收的是什么? 答: 1. 主要针对Java堆。 2. 回收“死亡”的对象,即没有引用的对象。那么如何判断对象是否“死亡”呢? 两种方法,引用计数法和可达性分析算法。引用计数法原理:给每个对象添加一个引用计数器。每当有一个地方引用它,引用计数器+1;每当一个引用失效,引用计数器-1;当引用计数器为0时,表示该对象无引用,即可回收。缺点:无
2017-10-21 22:48:36 306
原创 AQS共享锁的实现原理
一、AQS共享锁的实现原理前面的文章Lock的实现中分析了AQS独占锁的实现原理,那么接下来就分析下AQS是如何实现共享锁的。共享锁的介绍共享锁:同一时刻有多个线程能够获取到同步状态。那么它是如何做到让多个线程获取到同步状态呢? 来看一下获取共享锁的过程: 1. 线程调用AQS的acquireShared()申请获取锁(可有多个线程获取到,根据重写的tryAcquireShared()方法决定
2017-10-20 00:44:45 3087
原创 Lock实现之AbstractQueuedSynchronizer——AQS
一、AQS的介绍队列同步器AbstractQueuedSynchronizer(AQS)是构建锁或者其他同步组件的基础框架,是实现Lock的基础。它使用了一个volatile修饰的int变量来表示同步状态,并维护了一个FIFO队列来完成资源获取线程的排队。public abstract class AbstractQueuedSynchronizer extends AbstractOwnableS
2017-10-18 19:23:46 567 1
原创 Lock接口的介绍及使用
一、Lock的介绍我们知道,在Java中锁的实现可以由synchronized关键字来完成,但在Java5之后,出现了一种新的方式来实现——Lock接口。那么为什么提出这种新的方式呢? 在多线程的情况下,当一段代码被synchronized修饰之后,同一时刻只能被一个线程访问,其他线程都必须等到该线程释放锁之后才能有机会获取锁访问这段代码,占用锁的线程只有在两种情况下才能释放锁: 线程执行完了
2017-10-17 22:40:23 1789
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人