自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阿振的博客

记录、分享

  • 博客(33)
  • 收藏
  • 关注

原创 合并K个有序链表

public class _023_MergeKLists { /** * 链表结点类 * * @author luzhen-work-pc * */ private static class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; } } ...

2018-04-02 09:44:50 343

原创 快排Partition的优化:三向切分

快排算法中,partition的思想是将数组分成三部分:1.小于切分元素的放到数组左边;2.切分元素;3.大于等于切分元素的放到右边。实现代码如下:/** * 快排中的切分操作 * @param arr 要切分的数组 * @param l 切分起始位置 * @param h 切分结束位置 */private static void partition(int[] arr, int

2018-02-02 15:26:20 655

原创 ConcurrentHashMap扩容操作链表重分配

ConcurrentHashMap中和HashMap一样,当容量不足时,需要进行扩容操作。由于ConcurrentHashMap需要支持并发下的扩容操作,因此要比HashMap复杂很多。下面是对扩容操作时,原table某处i位置上的链表从新分配到新table位置i和n+i部分的分析。Node ln, hn;if (fh >= 0) { // fh的第n位若为0,保持原位置fh & (

2018-02-02 10:51:54 1096

原创 ThreadPoolExecutor的clt:runState&workCount

ctl: ThreadPoolExecutor用一个AtomicInteger来存储线程池工作状态和工作线程数量。ctl二进制的高三位用来保存线程池工作状态,其余用来保存工作线程数量。private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 初始值:状态RUNNINT,工作线程数量:0privat

2018-02-01 16:52:20 1041

原创 ThreadPoolExecutor任务调度策略

execute: execute方法时暴露给开发者提交任务的方法,这个方法就是整个线程池的入口。当然还有submit类方法,实际上也是调用了execute方法。public void execute(Runnable command) { if (command == null) throw new NullPointerException(); i

2018-02-01 15:53:47 559

原创 ThreadPoolExecutor参数以及Executors工厂方法

int corePoolSize: 能够长时间保持在线程池中的线程数量,就是说如果线程池中线程数量不超过corePoolSize时,即使当前没有任务需要执行,这些线程依然保持运行,等待任务到来。int maximumPoolSize: 池中线程最大数量,如果当前任务超出了maximumPoolSize,就需要用阻塞队列暂时保存起来,等待池中线程有空闲了再执行

2018-02-01 14:47:38 352

原创 ExecutorService的几个方法

public interface Executor { void execute(Runnable command);}public interface ExecutorService extends Executor { void shutdown(); // 已经提交的任务继续执行,不接受新的任务提交 List shutdownNow(); // 尝试终止正在执

2018-02-01 14:40:38 2553

原创 几个concurrent构件

CountDownLatch:/** * CountDownLatch:每次执行countDown方法,count减1,直到count为0, * 所有在CountDownLatch上await的线程都将结束await继续运行 * * 一个或多个线程到达await等待,直到count为0,这些线程就可以继续运行 * * await:等待count==0 * countDown:co

2018-01-31 20:06:06 138

原创 Timer中schedule和scheduleAtFixedRate区别

schedule和scheduleAtFixedRate区别: 两种方法都是在延迟一段时间后,开始周期性执行任务,而又有一定细微的差别。可以看到,schedule在调用sched方法时,传入了负的period。public void schedule(TimerTask task, long delay, long period) { if (delay < 0)

2018-01-31 09:14:08 969

原创 原子类:AtomicInteger

在多线程中,像i++这样的操作时非原子性操作,包括读-修改-写三个步骤。这将导致多线程环境中的i++操作线程不安全。Java提供了多个原子类来实现变量的原子增减操作。这些类底层依赖于自旋的CAS(CompareAndSwap)操作。AtomicInteger: 其内部保存了一份volatile的int类型变量,保证了值的可见性。public final int get()

2018-01-30 20:53:39 199

原创 线程本地变量:ThreadLocal

ThreadLocal类提供了线程本地变量访问的公共接口,每个线程通过ThreadLocal访问存储在线程本地的变量。当某个线程调用ThreadLocal的get或set方法时,ThreadLocal根据调用线程来获取或设置该线程的本地变量。这个变量存储在一个ThreadLocalMap的哈希表中,key为ThreadLocal对象,代表特定的变量,value就是本地变量值。因为每个线程只能访问自

2018-01-30 20:38:35 344

原创 volatile关键字

Java中的volatile关键字能够保证每次对变量的读操作直接从主存中读取,而非从Cache中读取;每次写操作都立即将Cache中数据同步到主存。 在多线程环境中多个线程同时访问同一个非volatile变量,并且没有使用锁同步控制,那么运行在不同CPU上的多个线程都会从主存中读取一份变量的副本到Cache中,进而对Cache中的数据进行操作。不同线程中的操作对于彼此来说是不完全可见的

2018-01-30 15:13:33 137

原创 Thread类中的一些方法

1.yield: 让步,表示当前线程愿意让出CPU资源给其他线程。而这种让步,不是绝对的,有可能执行了yield方法后,当前线程并没有真正让出CPU资源。/*** A hint to the scheduler that the current thread is willing to yield* its current use of a processor. The sched

2018-01-30 09:21:41 889

原创 红黑树 RedBlackTree

参考算法导论第三版第十二章: 二叉搜索树。实现代码:百度网盘,提取密码:n6yd。 当普通的二叉搜索树高低较低时,对于树的操作效率较高,考虑这样一种情况:按照关键字从小到大(或从大到小)构建一颗搜索二叉树,这样的一颗树实际上就是一个线性链表,搜索性能很差,为O(n)。与理想的lg(n)有较大差距。当然这是一种最坏情况。而红黑树就是一颗加强版的二叉搜索树,它是一个近似平衡的(从根结点到叶结点的路

2018-01-27 18:55:45 240

原创 二叉搜索树 BinarySearchTree

参考算法导论第三版第十二章: 二叉搜索树。实现代码:百度网盘, 提取密码:duri。 对二叉树进行这样的限制条件:对任意结点x,其左子树中所有关键字均小于x.key,其右子树中所有关键字均大于(等于)x.key。这样的二叉树被称为二叉搜索树。如下图: 可以看出,相同的关键字集合,能够构建出不同结构的二叉搜索树,而任意结构都满足二叉搜索树的性质。由于二叉搜索树关键字组织特性,树的

2018-01-26 21:30:28 260

原创 Java集合之LinkedHashMap实现LRU缓存

LinkedHashMap在HashMap的基础上,又将所有节点通过双向链表组织在一起,默认按照节点插入顺序构建链表当设置accessOrder为true时,则每访问一个节点,要将此节点在链表中移动到尾部,根据此特性能够通过LinkedHashMap实现LRU缓存。 HashMap中有三个空方法,LinkedHashMap继承了HashMap,并利用这三个方法实现组织链表

2018-01-25 20:51:47 753

原创 Java集合之HashMap resize操作

Java中的HashMap采用链地址法(数组+链表)解决哈希冲突。并且随哈希表中节点(键值对)增加时,能够进行扩容和链表转红黑树操作。扩容是为了增加槽位,以容纳更多的节点,策略是每次扩容二倍。而链表转红黑树是发生在每个槽位上(满足一定条件时),在链表中顺序添加、查找和删除某个元素的效率很低(n),而红黑树中相应的操作效率要高(lgn)。HashMap中的几个静态字段:sta

2018-01-25 19:58:25 650

原创 Java集合之LinkedList

LinkedList底层实现就是(双向)链表,包括链表节点的插入、删除、修改等一系列操作。与数组实现的ArrayList相比,在链表中查找的效率要低很多,但是向表中插入、删除等操作效率就要高得多了。LinkedList在实现了List接口的同时,又实现了Queue、Deque接口,也就是说LinkedList还能够实现(双端)队列(FIFO)、栈(LIFO)的功能。底层

2018-01-25 10:34:37 256

原创 Java集合之ArrayList

ArrayList底层数据结构是数组,能够高效的在指定位置上进行查找、修改,但是对于插入操作效率不是很高。如果向列表末尾插入元素,当底层数组容量不足以容纳时,需要进行扩容操作。当在指定位置插入时,需要将指定位置以及之后的元素往后移动,腾出位置给新加入的元素。底层数据结构:private static final int DEFAULT_CAPAC

2018-01-24 21:23:15 155

原创 Java集合基础知识

常用的Java集合类包括List、Set、Queue、Map等。其中List、Set、Queue三个接口都继承了Collection接口,而Collection接口又继承了Iteratable接口。Java集合中只能保存对象,不能保存基本类型。泛型在集合中发挥了至关重要的作用,用来指定一个集合中元素的类型。Collection: Collection接口提供了集合类的一些公

2018-01-24 19:26:45 252

原创 JDK动态代理

Java允许我们在运行时创建某个接口或类的动态代理。什么是动态代理?首先了解一下静态代理(代理设计模式):代理设计模式能够让我们无需修改源代码,进而对源接口功能进行增强(开闭原则,对修改封闭,对扩展开放)。package com.lz.proxy;interface Behaviour { int action();}// 被代理类,实现了Behaviour接口clas

2018-01-23 20:26:39 165

原创 CGLib动态代理

参考链接:cglib: The missing manual CGLib(Code Generation Library)同JDK动态代理的目的一致,在运行时生成代理类字节码加载到JVM中,并生成代理对象。CGLib底层基于ASM(一个Java字节码操控框架),即能够为接口生成代理,又能为类生成代理。首先看一个例子: cglib cglib-nodep

2018-01-23 20:26:28 302

原创 10.Mybatis初级使用-Spring集成mybatis

Spring集成mybatis,也就是SqlSessionFactory、SqlSession不需要硬编码去创建,而是通过Spring的IOC能力,注入到程序中。最简单案例maven依赖  (直接添加spring-webmvc,它依赖的其他包会自动载入 log4j log4j 1.2.17 mysql mysql

2017-03-28 21:15:19 228

原创 09.Mybatis初级使用-动态sql

动态sqlMybatis的动态sql包含了这几种元素:if、choose、trim、foreach,其中if最为常用ifList getBooksByCondition(@Param("author") String author, @Param("press") String press, @Param("type") String type); select

2017-03-21 15:36:56 197

原创 08.Mybatis初级使用-resultMap(二)

Collectioncollection用法与association类似,只不过collection查询多条记录回填到javabean中新建数据表blog(id,role_id,title,content),假定role表中记录与rblog表中记录是一对多关系新建Blog.javapackage com.lz.mybatis.model;public class

2017-03-21 15:16:17 303

原创 07.Mybatis初级使用-resultMap(一)

resultMap的最基本作用就是是定义映射规则。基本构成 最基本用法 type表示要映射的javabean类型,id标识本resultMap,select元素通过id使用resultMapid元素定义主键,允许多个主键(联合主键)。可以看成特殊的resultresult元素定

2017-03-21 13:00:31 293

原创 06.Mybatis初级使用-Mapper映射器(三)

SQL元素sql元素用来定义sql语句通用部分,当两个select的查询字段很多并且相同时,sql就派上了用场。 id, role_name, note select from role where id = #{id} select from role where role_name like #{roleName}sql字符串

2017-03-21 08:33:04 364

原创 05.Mybatis初级使用-Mapper映射器(二)

Insertinsert元素用来向数据库插入记录,结果返回一个整数,表示成功插入的记录条数。RoleMapper接口int insert(Role role);roleMapper.xml insert into role (role_name, note) values (#{roleName}, #{note})测试程序Role role = new Role();r

2017-03-20 19:47:11 555

原创 04.Mybatis初级使用-Mapper映射器(一)

Mapper映射器是Mybatis中的核心工具,也是Mybatis的核心功能。通过映射器,我们可以自定义SQL语句,灵活的操作数据库,这也是Mybatis的特色所在。所以,熟练使用映射器是掌握Mybatis的核心。Mybatis映射器由mapper接口和mapper xml配置文件组成。Selectselect元素执行查询,根据parameterType指定参数类型,根据resultTyp

2017-03-20 18:28:14 2157

原创 03.Mybatis初级使用-配置文件

Mybatis配置文件层次结构:template.xml<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

2017-03-20 15:47:35 358

原创 02.Mybatis初级使用-Mybatis核心组件

首先推荐一本介绍Mybatis的书籍:《深入浅出MyBatis技术原理与实战》 杨开振/著。例子丰富。可以拿来学习或者当手册。Mybatis的核心组件有:SqlSessionFactoryBuilder:根据mybatis-config.xml配置文件生成SqlSessionFactorySqlSessionFactory:工厂接口,创建SqlSession。其实现类Def

2017-03-20 14:48:49 605

原创 01.Mybatis初级使用-初体验

首次使用Mybatis0.新建maven工程,引入依赖 mysql mysql-connector-java 5.1.38 org.mybatis mybatis 3.4.21.在resource下新建jdbc.properties、roleMapper.xml、mysql-config.xml文件jdbc.proerties

2017-03-20 10:58:02 249

原创 00.Mybatis初级使用-回顾JDBC

JBDC(Java Data Base Connectivity)是Java访问关系数据库的原始API,Mybatis框架也是基于JDBC之上对其封装的数据库操作工具(执行SQL)。原始API开发的程序代码质量低,不利于扩展、维护,并且资源利用率也很低(频繁连接和断开连接),需要硬编码来处理结果集(关系数据模型到Java数据模型)。实际工作中,极少直接使用JDBC开发。JDBC连接My

2017-03-20 09:11:22 227

空空如也

空空如也

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

TA关注的人

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