- 博客(177)
- 收藏
- 关注
原创 ThreadLocal
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的...
2019-12-16 20:08:51
171
原创 Volatile(二)
原理分析Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。处理器实现原子操作...
2019-12-16 15:26:04
104
原创 Synchronized(一)
synchronized原理synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。public class SyncTest { public static void main(String[] args) { synchronized (SyncTest.cla...
2019-12-15 22:50:06
150
原创 四、Set
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素LinkedHashSet: LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的TreeSet(有序,唯一): 红黑树(自平衡...
2019-12-15 19:58:11
138
原创 三、Map(JDK1.7HashMap扩容问题)
public V put(K key, V value) { //初始化 if (table == EMPTY_TABLE) { inflateTable(threshold); } //存放key=null的元素 if (key == null){ return putForNullKey(value); } //获取hash值 int hash = hash(key);...
2019-12-15 18:48:00
972
原创 二、HashMap源码分析(JDK1.8)
HashMap底层数据结构JDK1.8之前:数组+链表JDK1.8:数组+链表+红黑树HashMap部分源码分析1、hash()static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}该方法的...
2019-12-15 09:02:36
156
原创 一、List
List实现类的数据结构Arraylist: Object数组Vector: Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)Arraylist 与 LinkedList 的区别是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;底层数据结构: Arraylist 底层使用的是...
2019-12-14 20:21:02
213
原创 二十三、二叉树的前、中、后序遍历(递归和非递归)
public class PreInPosTraversal { public static class Node { public int number; public String name; public Node left; public Node right; public Node(int num...
2019-12-01 21:44:24
125
原创 一、JVM内存区域、内存中的对象、内存溢出异常
一、运行时数据区域1.1 程序计数器1.2 Java虚拟机栈1.3 本地方法栈1.4 Java堆1.5 方法区1.6 运行时常量池1.6 直接内存二、虚拟机中的Java对象2.1 对象的创建过程2.2 对象的内存布局2.3 对象的访问定位...
2019-11-21 17:10:12
126
原创 二十二、数组[最大差值]
一、最大差值public static int maxGap(int[] arr){ if (arr == null || arr.length < 2){ return 0; } int length = arr.length; // 初始化max为最小值 int max = Integer.MIN_VALUE; // 初...
2019-11-18 15:06:04
253
原创 二十一、链表[两个单链表的交点(有无环) / 回文结构]
一、单链表的相交问题 public static class Node { public int value; public Node next; public Node(int data) { this.value = data; } } public static Node getIntersectNode(Node head1, Node head2) { ...
2019-11-18 11:33:00
112
原创 二十、求完全二叉树的节点个数
思路分析:先遍历头结点左边界,看左边界到了那一层(假如h层),然后遍历头节点的右子树,看右子树的左边界是否到了h层如果到了h层,则头结点的左子树是满的其节点个数为2^3-1,加上头节点就是2^3个,然后用同样的方法搞头节点的右子树(是个完全二叉树)如果右子树的左边界没有到最后一层,那么右子树是满的,只是层数比左子树少一,加上头结点个数为2^2-1+1=2^2个,此时用同样的方法搞左子树p...
2019-11-17 16:08:01
235
原创 十八、二叉树序列化与反序列化
public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; }} /** * 先序序列化 * 序列成字符串用 _ 分割节点,# 代表null * @param ...
2019-11-17 11:21:20
118
原创 十七、二叉树的后继与前驱节点
后继节点//节点public static class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; }}public static Node getSuccessor...
2019-11-17 10:56:30
174
原创 十六、堆排序
一、堆排序完全二叉树:完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐,堆就是完全二叉树数组——完全二叉树(通过下标来维护彼此的关系)大根堆:当前树(子树)中(包含子树)的最大值都是头部小根堆:当前树(子树)中(包含子树)的最小值都是头部数组——>大根堆public class HeapSort { public stati...
2019-11-16 20:34:04
196
原创 十五、荷兰国旗问题与改进的快速排序
荷兰国旗public class Ex2 { public static void main(String[] args) { int[] arr = {6, 1, 8, 2, 9, 7, 3, 4}; partition(arr, 5); System.out.println(Arrays.toString(arr)); } ...
2019-11-16 19:30:06
150
原创 Collections工具类和Arrays工具类常见方法
Collections常用方法排序操作void reverse(List list)//反转void shuffle(List list)//随机排序void sort(List list)//按自然排序的升序排序void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑void swap(List list, int i , ...
2019-11-16 10:33:07
172
原创 值传递
基本类型public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2);}publi...
2019-11-15 22:28:14
109
原创 Spring中Bean的实例化过程(二)
AbstractAutowireCapableBeanFactory # createBean(),整体方法如下:/** * Central method of this class: creates a bean instance, * populates the bean instance, applies post-processors, etc. * @see #doCreateB...
2019-11-01 21:54:49
196
原创 Spring中Bean的实例化过程
先看一个简单的Bean的实例化过程,使用默认的构造函数@Servicepublic class UserService { public void query(){ System.out.println("query"); }}从AbstractApplicationContext#refresh中的finishBeanFactoryInitialization(beanFact...
2019-11-01 17:06:19
525
原创 Spring5.0.x源码分析(四)
@Configuration//@Configuration@ComponentScan("com.google")@Import(MyBean.class)public class AppConfig {}//=======================================================================================...
2019-10-26 21:42:49
192
原创 Spring5.0.x源码分析(三)
在第二节中讲到ConfigurationClassParser#doProcessConfigurationClass()方法中在处理一些注解,这节就来分析一下// Process any @Import annotations关于Import注解的使用方式,可以参考:Spring @Import 三种用法...
2019-10-23 21:37:15
145
原创 Spring5.0.x源码分析(二)
3、refresh()继续看org.springframework.context.support.AbstractApplicationContext#refresh方法3.4 postProcessBeanFactory(beanFactory)是个空方法3.5 invokeBeanFactoryPostProcessors(beanFactory)Invoke factory pr...
2019-10-22 08:53:33
511
原创 Spring中的FactoryBean
相关测试类public class User { public User() { System.out.println("User构造方法执行了"); } public void info(){ System.out.println("user"); }}@Componentpublic class TestFactory...
2019-10-20 21:00:17
138
原创 二、JDK1.8动态代理源码简析
参考文章一、参考文章二Proxy.newProxyInstance() public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, ...
2019-10-20 17:06:03
166
原创 十九、SpringAOP切面的单例与多例
@Repository@Scope("prototype")public class UserDao implements IUserDao { public void save(){ System.out.println("保存成功,无返回值"); }}@Configuration@ComponentScan("com.liaoxiang")//...
2019-10-19 21:33:57
3025
1
原创 SpringAOP其他小知识点
Introductions@Repositorypublic class UserDao implements IUserDao { public void save(){ System.out.println("保存成功,无返回值"); } @MyAnnotation public String findName(){ S...
2019-10-19 19:14:24
111
原创 十八、SpringAOP切入点详解
官网:Declaring a pointcut参考:SpringAOP切入点详解声明一个切入点包含两部分:切入点表达式和切入点签名@Pointcut("execution(* transfer(..))")// the pointcut expressionprivate void anyOldTransfer() {}// the pointcut signature1、execut...
2019-10-19 17:16:30
437
原创 十七、Spring中的单例对象如何使用多例对象
相关测试类:@Repository@Scope("prototype")public class UserDaoImpl implements UserDao { public void find() { System.out.println("dao: "+this.hashCode()); }}@ComponentScan("com.liaoxian...
2019-10-18 15:23:02
304
1
原创 十六、Spring自动装备
pom<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http...
2019-10-18 11:12:02
163
原创 Spring5.0.x源码分析(一)
在编译好的源码工程中创建测试model几个测试类,就写在一起了@ComponentScan("com.liaoxiang")@Configurationpublic class AppConfig {}@Componentpublic class User { public void info(){ System.out.println("Hello Spring");...
2019-10-17 20:58:56
492
原创 一、Nginx入门
下载解压到全英文路径:启动:双击nginx.exe访问:localhost配置文件说明:#server作用:内部创建服务器,监听80端口server { #监听的端口 listen 80; #配置域名 server_name localhost; #charset koi8-r; #...
2019-10-08 20:03:44
114
原创 三、RabbitMq延迟队列的使用
在rabbitmq的官网下载延迟队列的插件,注意与rabbitmq的版本相对应地址:https://www.rabbitmq.com/community-plugins.htm下载好插件之后安装到rabbitMQ中,具体方法很简单百度一下下面是demo:pom文件:<?xml version="1.0" encoding="UTF-8"?><project xmlns...
2019-10-08 11:28:17
138
原创 服务提供者框架
服务提供者框架多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解耦出来。服务提供者的改变对它们的客户端是透明的,这样提供了更好的可扩展性。例如,JDBC,JMS等就是用了服务提供者框架简单案例服务接口:这是服务提供者要去实现的接口服务提供者接口:生成服务接口实例的工厂对象(就是用来生成服务接口的)(可选)提供者注册API:服务者提供服务者自身的实现服务访问AP...
2019-09-25 16:54:15
99
转载 一、用静态工厂方法代替构造器
文章目录静态工厂方法1.静态工厂方法的优点1.1 静态工厂方法是有名称的1.2 静态工厂方法可以不必在每次调用他们的时候都创建一个新对象1.3 静态工厂方法可以返回原返回类型的任何子类型1.4 静态工厂方法返回的对象的类可以随着每次调用而发生改变,这取决于所传参数值1.5 静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在2.静态工厂方法的缺点2.1 如果类不含公有的或者受保...
2019-09-25 16:23:52
151
原创 六、类的加载机制和双亲委派模型
虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类的生命周期:从类被加载到虚拟机的内存中,到卸载出内存为止。加载(装载)、验证、准备、初始化和卸载这五个阶段顺序是固定的,类的加载过程必须按照这种顺序开始。解析阶段不一定,它在某些情况下可以在初始化之后再开始,这是为了运行时动态绑定特性(JIT例...
2019-09-14 15:58:26
168
原创 String、StringBuffer、StringBuilder的区别
这三个类之间的区别主要在两个方面,即运行速度和线程安全这两个方面:1.运行速度:StringBuilder>StringBuffer>StringString最慢的原因:String为字符串常量,而StringBuilder和StringBuffer为字符串变量,即String对象一旦创建之后对象是不可更改的,但后者的对象是变量,是可以更改的。String str = “abc...
2019-09-14 10:58:23
100
原创 关于Object类的hashCode方法
1、Java的Object.hashCode()的返回值到底是不是对象内存地址?2、Java Object.hashCode()返回的是对象内存地址?
2019-09-13 09:28:31
290
原创 Future模式
public interface Data { String getRequest();}public class FutureData implements Data{ private RealData realData ; //标识是否已经获取到结果 private boolean isReady = false; public synchronized void setRea...
2019-09-10 18:36:13
123
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅