自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rootlh的博客

普通开发者如果习惯于在架构师封装好的东西之上,只专注于做业务开发,那久而久之,在技术理解和成长上就会变得迟钝甚至麻木。

  • 博客(36)
  • 资源 (1)
  • 收藏
  • 关注

转载 从一个 NullPointerException 探究 Java 的自动装箱拆箱机制

转载自知乎专栏:https://zhuanlan.zhihu.com/p/28645185作者:mzlogin前天遇到了一个 NullPointerException,触发的代码类似下面这样:public class Test { public static long test(long value) { return value;

2017-08-21 14:25:13 453

转载 【转载】MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析

我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 [xml] view plain copyxml version="1.0" encoding="UTF-8" ?>    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    

2017-08-30 10:06:58 334

原创 Jvm内部锁机制总结

一、线程安全和对象头Mark每个对象都有一个对象头标记Mark(32位)Mark描述对象hash、锁信息、垃圾回收标记、年龄二、锁的分类偏向锁:(只在单线程有效)--------- 偏心锁,锁会偏向让当前已经持有锁的线程持有--------- Mark中:标记为偏向,写入线程ID--------- 只要没有竞争,获得偏向锁的线程将

2017-08-28 11:09:33 1244

原创 Java NIO通信的实现

非阻塞网络IO通信:当客户端的通道(都注册在Selector中)准备就绪后,Selector才向服务端发送请求。服务端才分配线程执行请求(没准备好前服务端不会先分配线程阻塞等待客户端)。阻塞式和非阻塞式IO区别:        传统的 IO 流都是阻塞式的。当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此

2017-08-27 14:43:53 494

原创 Java NIO中的通道Channel

一、通道的概念:独立的处理器(专门用于IO操作) 1 * 一、用于源节点和目标节点的连接,负责缓冲区中数据的传输,不负责存储,需配合缓冲区进行操作。2 * 3 * 二、通道类:4 * java.nio.channel包下5 * FileChannel(文件IO)6 * SocketChannel(TCP的IO套接字)7 * ServerSocketChann

2017-08-27 14:42:29 202

原创 Java NIO中的缓冲区

1*数据类型(除boolean)2* ByteBuffer3* CharBuffer4* ShortBuffer5* IntBuffer6* LongBuffer7* FloatBuffer8* DoubleBuffer9*10* 二、存数据put取数据get11*12* 三、4个核心属性:13* capacity容量(缓冲区最大容量)、14* limit界限(缓冲区可以操作数据的大小)、15*

2017-08-27 14:41:04 413

原创 什么是NIO

None-Blocking IO---非阻塞IO,主要用于套接字等网络编程 JDK1.4功能特性:面向缓冲区基于通道更加高效的读写用于高并发读写 NIO传输数据(双向传输、面向缓冲区)通道:负责传输缓冲区:负责存储

2017-08-27 14:37:35 251

原创 Servlet总结

一、导入tomcat的servlet的jar包服务器不是运行在IDE中,而是运行在tomcat中,tomcat运行时,调用java的方法,实现响应客户端请求的功能。路径:webapp/项目名/WEB-INF/web.xml文件配置servlet的地址映射webapp/项目名/WEB-INF/lib 放项目的jar包webapp/项目名/WEB-INF/c

2017-08-27 09:38:55 184

原创 SQL范式优化和反范式优化

1、范式优化    主要满足第三范式(数据冗余、插入异常、删除异常、传递依赖)    什么是第三范式?数据表中不存在字段的传递依赖,也就不会产生数据冗余、插入异常、删除异常。    优化:拆分表(1拆3),一张具有传递依赖的表(商品,商品分类,分类描述),拆分成 商品表(主表),商品分类+分类描述表(依赖关系表),商品+商品分类表(关联关系表)。

2017-08-21 09:19:00 1119

原创 SQL优化、索引优化

一、发现哪些SQL语句有性能问题开启MySQL慢查询日志对SQL语句进行监控1   show variables like 'slow_query_log'; -- 查看是否开启慢查询日志2    set global slow_query_log = on; -- 开启慢查询日志3    set global log_queries_not_using_indexes

2017-08-21 09:16:14 298

原创 Java中的工厂模式

工厂模式的思想:工厂类自主生产产品,而不用其它类去new一个产品简单工厂:需求:构造一个交通工具工厂,可以自定义汽车、飞机及其交通工具跑起来的方式run方法思路:    抽象工厂类(父)-----具体工厂类(子)-----》生产具体产品总工厂抽象类:TransportToolFactory.java1public

2017-08-19 15:31:57 1002

原创 二叉树

为什么使用树:    数组增删数据太慢    链表查找数据太慢    树结合了数组和链表的优点根结点:    树最上面的节点为根结点。到其它任何节点只能有一条路径。父结点:    结点的上面一个结点。子结点:    结点的下面一个结点。二叉树每个节点最多只能有两个子结点(左结点,右结点)。叶子结点:    没有子结点的结点。

2017-08-16 21:37:09 201

原创 快速排序

递归思想:1.将数组划分成两个子数组2.两个子数组递归调用快排函数继续向下划分两个子数组。。。。划分子数组的原则:选取一个基准值A(一般选数组的第一个或最后一个元素),比A小的放左边,比A大的放右边。1//1.划分数组方

2017-08-16 21:36:02 122

原创 希尔排序

基于插入排序,提高插入排序的效率思想:1.普通的插入排序是跨度为1的希尔排序2.确定排序跨度,比如跨度为3,则数据每隔3个进行插入排序3.缩小跨度,跨度减小为2,则数据每隔2个进行插入排序4.直到缩小跨度为1-----插入排序优点:每趟希尔排序,都能将比较小的数排在左边,比较大的数排在右边,避免插入排序时,出现很小的数在最右边导致移动元素过多

2017-08-16 21:34:49 148

原创 Java递归

实现斐波那契数列:1public int getNumber(int n){//n表示项数2    if(n == 1){//第一项为13        return 1;4   }else if(n == 2){//第二项为25        return 2;6   }else{//第n项为第n-1项加第n-2项7        return getNumber(n-1

2017-08-16 21:34:03 162

原创 Java实现双向链表/双端链表

普通链表:节点类保留下一节点的引用。链表类只保留头节点的引用,只能从头节点插入删除双端链表:节点类保留下一节点的引用。链表类保留头节点、尾节点的引用,可以从尾节点插入,但只能从头节点删除双向链表:节点类保留上一节点、下一节点的引用。链表类保留头节点、尾节点的引用,可以从尾节点插入删除==========================================

2017-08-16 21:33:27 286

原创 Java实现栈\队列\链表

栈:底层数组栈顶指针1public class MyStack{2    private int[] arr;3    private int top;4    //默认构造方法5    public MyStack(){6        arr = new int[10];7        top = -1;8   }9    //自定义构造器,自定义初始化栈大

2017-08-16 21:32:02 202

原创 简单排序算法

冒泡排序:两重循环---前往后 length-1 趟(每趟排一个数),后往i(最小的往前冒)每趟都把最小的换到最前面i (0,length-1):第几趟(每一趟都把最小的放在前面)j(length-1,i):第几个1public void bubbleSort(int[] array){2    for(int i=0;iarray.length-1

2017-08-16 21:31:26 167

原创 有序数组\二分查找

有序数组方法:insert传入参数:int value已有:数组int[] array、数组长度int size步骤:1.前往后变量---找到插入位置 2.后往前遍历---腾出空位 3.插入新值 4.数组长度+11public void orderArray(int value){2    int i;3    for(i=0;isize;i++

2017-08-16 21:30:33 284

原创 类加载器ClassLoader

class文件装载流程:--加载(使用ClassLoader)        取得类文件的二进制流        将二进制流转为方法区数据结构        在JVM堆中生成对应的Class对象-- 链接        验证(文件格式、是否有父类?继承final类?)        准备 (在方法区中分配内存,初始值,stat

2017-08-14 17:49:27 208

原创 GC参数

串行回收器:-- 古老、稳定、效率高、单线程回收-- 可能产生较长停顿-- 开启使用:-XX:+UseSerialGC-- 使用场所:新生代(复制算法)、老年代(标记-压缩)并行回收器:-- 多线程(不一定快,单核CPU不会变快,切换线程上下文需要时间)-- 标记-压缩算法-- 开启使用:    新生代并行收集器

2017-08-14 15:59:51 278

原创 GC算法和种类

GC垃圾回收的对象:堆空间和永久区GC算法分类:引用计数法-- 老算法(Java不使用)-- 用于python、COM-- 增加一个引用,引用数加一,引用消失,引用数减一,当引用变为0时GC回收-- 缺点:引用增加减少伴随着加减法,影响性能。循环引用的问题难处理。循环引用的例子:

2017-08-14 11:25:21 223

原创 JVM调优---常用JVM配置参数

一、Trace跟踪参数(跟踪GC、类、变量的内存变化情况)打开GC跟踪日志(每次执行GC的信息都能打印,获得执行时间,空间大小):-verbose:gc 或 -XX:+printGC 或 -XX:+printGCDetails类加载监控:(监控类加载的顺序)-XX:+TraceClassLoading二、堆的分频参数-Xm

2017-08-14 09:24:10 5245

原创 Java分析阻塞队列

实现接口:BlockingQueue常用实现类:ArrayBlockingQueue(int)固定长度LinkedBlockingQueue不固定长度方法:入队列:add(队列满时抛异常) offer(队列满时返回false) put(队列满时阻塞不放。直到队列有空位才放入)出队列:remove(队列空时取则抛异常) poll(队列空时取则返回nul

2017-08-13 17:07:48 251

原创 单例模式解析

什么是单例模式?在整个JVM运行周期中只有一个实例的对象。用法:(线程安全+double check)1public void class Singleton{2    //1.构造可见的单例对象3    p

2017-08-11 10:00:49 151

原创 Java线程间通信问题分析(生产者消费者模型)

线程间通信问题:不同线程间针对同一资源进行操作的问题生产者消费者模型:生产者(设置线程)和消费者(获取线程)对同一资源对象进行操作实现:一、学生类Student.javapublic class Student{ private String name; private int age; public

2017-08-10 15:33:46 244

原创 Java死锁问题分析

产生死锁原因:同步嵌套两重锁嵌套,两个线程相互等待导致死锁代码:MyLock.java//生成两个要获得锁的对象public class MyLock{ Object static objA = new Object(); Object static objB = new Object();}TestDeadLoc

2017-08-10 15:32:34 240

原创 Lock接口与读写锁(lock 和 synchronized 的比较)

出现:JDK1.5实现类:ReentrantReadWriteLock.ReadLock ReentrantReadWriteLock.WriteLock主要方法:lock() unlock()使用:TestLock.javapublic class TestLock implement Runnable{ ReentrantLoc

2017-08-10 15:31:48 934

原创 Strategy策略模式

JDK中使用该模式的API:Comaprable接口接口:Comparable抽象方法:CompareTo(T obj);//1--->大于obj  0----->等于obj  -1---->小于obj使用:任何一个对象想要排序或比较大小,需要先实例化Comparable接口。然后重写CompareTo方法,定义对象比较大小的规则(如

2017-08-09 16:53:43 197

原创 JDK中的动态代理

什么是动态代理?实现某个接口方法的类A,要在不改变这个类代码的前提下,在类执行方法的前后加入一些代码(日志、切面、事务),这时候就需要一个代理对象Proxy(也实现这个接口方法),在方法中执行这个类A的方法,顺便在方法前后加代码(日志、切面、事务)核心类:Proxy核心代码://要被代理的类Tank tank = new Tank();//实例化类X

2017-08-09 09:48:26 138

原创 Java的IO流(总结)

四大抽象基类:InputStream OutputStream Reader Writter四大访问文件类:File- File- File- File四大访问数组:ByteArray- ByteArray- CharArray- CharArray-四大缓冲流:Buffered- Buffered- Buffered- Buffered-字节流byte(Input

2017-08-08 10:06:02 177

原创 Java异常(总结)

Throwable类的两个子类:Error和ExceptionException是一个类:分为两大子类:RuntimeException(运行时异常)和IOException(非运行时异常)RuntimeException:程序运行时异常---空指针异常---OOM---数学异常 1/0----数组下标越界异常:初始化a[

2017-08-08 10:04:24 198

原创 LinkedHashMap源码分析

继承HashMap用法: Map lhm = new LinkedHashMap();底层实现:哈希表和双向链表保存元素。保存元素:Entry header;静态内部类:private static class Entry extends hashMap.Entry{              Entry befo

2017-08-08 10:03:33 176

原创 ArrayList源码分析

用法:List ls = new ArrayList();底层实现:数组Object[]1.构造器----生成一个初始大小为10的Object数组2.set( int index,E e)方法:Object[index] = e;3.add( E e)方法:确保数组空间足够:ensureCapacity(size+1);   数组末尾赋值:Object[

2017-08-08 10:02:49 168

原创 HashSet源码分析

用法:Set hs = HashSet();底层实现:底层使用HashMap实现,将set的中的元素传入map的key中,value为一个static final的object固定。1.类中new一个Map2.add方法----调用map中的add方法,传入set的元素作为key,object作为value(保证数据的唯一性)3.interator方法-

2017-08-08 10:02:14 162

原创 HashMap源码分析

用法: Map hm = new HashMap();存储结构:数组+链表不同hash值的key的Entry存在数组table中----数组存储每个相同hash值的key的Entry用链表存储put(K,V)方法:1.判断key是否为空----为空则调用putForNullKey(V value)2.从key的hashcode

2017-08-08 10:01:26 331

log4j-1.2.17

log4j源码包!!需要请自取!!Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器。

2017-09-13

空空如也

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

TA关注的人

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