- 博客(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
2017-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人