- 博客(24)
- 收藏
- 关注
原创 java动态代理两种实现方式
一、JDK动态代理JDK的动态代理基于接口实现,所以被代理类一定要有实现接口public interface IJDKTestDemo { String getTopic(String prefix);}/** * 功能描述:被代理类 */public class JDKTestDemoImpl implements IJDKTestDemo { @Override public String getTopic(String prefix) { ret
2020-08-08 10:40:52
182
原创 【java并发】CountDownLatch源码解析
目录一、概述二、源码解析1、构造函数2、await()3、await(long timeout, TimeUnit unit)4、countDown()三、使用实例一、概述CountDownLatch是限制某个线程等待其他线程全部执行后再执行;相当于有一个计数器,每执行一个线程计数器-1,知道计数器为0;在等待的线程便可以继续执行。一般用于主线程需要使用多线程计算的结果二、源码解析Co...
2019-12-16 17:13:39
200
原创 【java并发】Semaphore源码解析
目录一、概述二、源码分析1、构造函数二、void acquire()非公平模式的实现公平模式的实现三、void release()一、概述Semaphore信号量,主要功能是限制能够运行的线程量,指定固定数量的许可,只有获取许可的线程可以运行,若没有许可获取则阻塞,直到获取许可。二、源码分析1、构造函数 /** * Creates a {@code Semaphore} ...
2019-12-12 20:07:52
171
原创 利用@AliasFor整合RestController和RequestMapping
一、说明使用spring开发web,一般在controller类上都会使用注解RestController、RequestMapping;可以利用AliasFor来将两个注解整合成一个注解。二、源码:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@RestController@Reque...
2019-11-27 16:51:01
559
原创 java8 Map新增方法的使用
文章目录概述1、compute()1、使用2、源码实现2、computeIfAbsent()1、使用2、源码3、computeIfPresent()4、merge()1、使用2、源码5、接下来简单介绍一下1.8之后Map添加的default方法概述java8 Map中新增了几个面向函数式编程的几个方法利用java8可以在接口中定义default方法实现1、compute()1、使用Ma...
2019-10-01 10:41:15
824
原创 spring 面向切面编程(aop)
一、AOP术语1、通知(advice)切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还定义了何时执行这个工作。Spring切面可以应用五种类型的通知:前置通知(before):在目标方法被调用之前调用的通知;后置通知(after):在目标方法成功执行之后调用,此时不会关心方法的返回是什么;返回通知(after-returning):在目标方法成...
2019-09-25 14:24:33
217
原创 spring boot自定义过滤器
自定义Filterspring boot中实现Filter有两种方式1、利用@WebFilter注解实现@WebFilter(urlPatterns = "*", filterName = "myFilter", initParams = { @WebInitParam(name = "name1", value = "wfs"), @WebInitParam(name = ...
2019-09-11 16:41:54
229
原创 springboot自定义枚举序列化
spring默认情况返回枚举是返回枚举的名称 @GetMapping("getUser") public User getUser() { User user = new User(); user.setName("wfs"); user.setSex(SexEnum.MALE); return user; }...
2019-07-19 14:57:30
3722
1
原创 spring配置全局日期转换器
1、使用注解@DateTimeFormat @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime localDateTime; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate localDate; @DateT...
2019-07-19 14:22:27
1023
原创 ReentrantReadWriteLock
文章目录一、同步器一、读锁1、tryAcquireShared(int)2、doAcquireShared(int)3、releaseShared(int)二、写锁一、同步器先来看看读写锁持有的同步器,实现了AQS;读锁和写锁持有同一个Syncabstract static class Sync extends AbstractQueuedSynchronizer stati...
2019-06-14 15:58:55
122
原创 ReentrantLock
一、概述是JDK实现的一种可重入锁,能够实现公平和非公平锁。二、实现接口public class ReentrantLock implements Lock, java.io.Serializable实现接口Lockpublic interface Lock { //获取锁,如果获取不到就会出于线程调度的目的禁用,并且直到获取锁 void lock(); ...
2019-06-14 15:58:00
149
原创 AbstractQueuedSynchronizer
一、AQS是构建同步组件的基础AQS以模板方式在内部定义了获取锁和释放同步状态的模板方法,并留下钩子函数供子类继承时进行扩展。二、同步等待队列AQS维护了一个同步等待队列,是一个双向链表;//队列的头,懒加载,除了初始化,修改只有setHead方法,如果头存在,waitStatus不可能是CANCELLEDprivate transient volatile Node head;//队...
2019-06-14 15:57:02
186
原创 HashMap源码分析
HashMappublic class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable成员变量//默认初始容量为16static final int DEFAULT_INITIAL_CAPACITY = 1 &l...
2018-03-26 16:50:37
173
原创 理解LinkedList源码
LinkedList是实现了List和Deque接口的双端链表。ArrayList是用数组实现的,那么在查的方面肯定优于基于链表的LinkedList,与之相对的是LinkedList在增删改上优于ArrayList。LiskedList的核心数据结构 transient Node<E> first; transient Node<E> last;...
2018-03-23 10:48:03
132
原创 理解ArrayList源码
ArrayList是使用频率较高的容器,实现较为简单。内部主要靠一个可自动扩容的对象数组来维持transient Object[] elementData;// 非私有简化嵌套类访问可以通过构造函数指定初始容量,也可以不指定(默认初始容量为10); //指定初始容量 public ArrayList(int initialCapacity) { if (in...
2018-03-22 16:35:11
136
原创 基数排序
基数排序必须依赖另外的排序方法,最适合的是桶式排序。 基本思路:就是将待排序的数据拆分成多个排序关键字 采用最低位优先法 依次按照数据的拆分出来的个位、十位、百位。。。的子关键字排序。实现代码public class MultiKeyRadixSort{ public static void main(String[] args) { int[] data =
2017-12-07 16:22:06
155
原创 桶式排序
这种排序方式需要满足两个特性:待排序列所有值处于一个可枚举的范围这个可枚举的范围不应该太大,否则开销太大排序的具体步骤如下: (1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数; (2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算: buckets[i] = buckets[i] +buckets[i-1] (其中1<=ipubli
2017-12-07 14:49:24
175
原创 归并排序
基本思想:将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。实现代码public class MergeSort{ public static void main(String[] args) { D
2017-12-07 14:04:58
147
原创 插入排序
直接插入排序依次将待排序的数据,按其关键值的大小插入到前面的有序序列实现代码public class InsertSort{ public static void main(String[] args) { DataWrap[] dataWraps = { new DataWrap(9, ""), new DataWrap(-16,...
2017-12-05 16:33:02
136
原创 交换排序
冒泡排序对数列进行重复的比较,每次比较相邻的两个元素,直至没有元素需要交换实现代码public class BubbleSort{ public static void main(String[] args) { DataWrap[] dataWraps = { new DataWrap(21, ""), new DataWrap(30, ""),
2017-12-05 14:06:42
159
原创 选择排序
1、直接选择排序需要进行n-1次比较 每次将i位置的元素依次与之后的所有元素进行比较,若其大于则进行位置调换实现代码:public class DataWrap implements Comparable<DataWrap>{ int data; String flag; public DataWrap(int data, String flag) {
2017-12-04 17:06:21
146
转载 Map与 Object转换
Map与 Object互相转换的三种方式不知道从哪里看到的,写成博客记录下,防止以后忘记使用org.apache.commons.beansutils进行转换 public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception { if (map =
2017-11-14 17:20:36
604
转载 Java源码分析之HashMap(JDK1.8)
转载出处:http://blog.youkuaiyun.com/eson_15/article/details/51154989 一、HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现。与HashTable主要区别为不支持同步和允许null作为key和value。由于HashMap不是线程安全的,如果想要线程安全,可以使用Concurr
2017-11-10 15:52:42
145
原创 Map遍历的几种方法
//只遍历key值,通过key取value 效率不高 for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } //使用迭代器遍历 Iterator<Map.Entry<String, String>> it = m
2017-11-10 14:03:34
195
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人