- 博客(25)
- 收藏
- 关注
原创 Mysql之索引类型
(1)B-Tree索引:B-Tree意味着所有的值都是按顺序存储的,每一个叶子页到跟的距离相同。B-Tree索引能够加快数据访问的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。跟节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下
2017-08-12 09:23:52 228
原创 Mysql之存储引擎
(1)inndob存储引擎:inndob的数据存储在表空间中,将每个表的数据和索引存放在单独的文件中。其默认隔离级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。间隙锁使得Innodb不仅仅锁定查询涉及的行,还会对索引的间隙进行锁定,防止幻影行的插入;innodb基于聚簇索引建立。innodb内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在
2017-08-11 22:56:23 287
转载 Java集合之LinkedHashMap源码解析
初识LinkedHashMap上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见、非常有用的集合,并且在多线程情况下使用不当会有线程安全问题。大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。H
2017-08-04 23:47:13 254
转载 Java集合之LinkedList源码解析
LinkedList是基于链表实现的,所以先讲解一下什么是链表。链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的数据以外,还存储有其下一个存储单元的地址(下一个存储单元的地址是必要的,有些存储结构还存放有其前一个存储单元的地址),每次查找数据的时候,通过某个存储单元中的下一个存储单元的地址寻找其后面的那个存储单元。
2017-08-04 23:03:28 322 1
转载 Java集合ArrayList源码解析
对于集合,我认为关注的点主要有四点:1、是否允许空2、是否允许重复数据3、是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致4、是否线程安全 ArrayListArrayList是最常见以及每个Java开发者最熟悉的集合类了,顾名思义,ArrayList就是一个以数组形式实现的集合,以一张表格来看一下ArrayList里面有哪些基本的元素:
2017-08-04 22:12:33 252
转载 深入解析Spring架构与设计原理-AOP
关于AOP的个人理解 AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为了由高到低、从使用到实现的三个层次。关于这个体系结构,个人的理解是这样的,从上往下,最高层是语言和开发环境,在这个环境中可以看到几个重要的概念:base可以视为待增强对象,或者说目标对象;aspect指切面,通常包含对于base的增强应用;configuration可以看成是一种编织或者说配置,通过在AOP
2017-08-03 23:17:23 254
原创 ConcurrentHashMap实现原理
HashMap在并发执行put操作时会引起死循环,因为多线程会导致HashMap的Entry链表形成环形数据结构,Entry的next节点永远都不会为空,就会产生死循环获取Entry。HashTable容器使用synchronized来保证线程安全,当一个线程访问HashTable的同步方法,其他线程也访问同步方法时会进入阻塞或轮询状态,导致其效率低下。ConcurrentHashMap使
2017-08-03 22:13:23 216
原创 Synchronized关键字
在多线程并发编程中synchronized被称为重量级锁。synchronized实现同步的表现形式有以下3种:1)对于普通方法,锁是当前普通对象;2)对于静态同步方法,锁是当前类的Class对象;3)对于同步方法块,锁是synchronized括号里的配置对象。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。synchronized实现
2017-08-03 21:47:32 222
原创 Volatile关键字
volatile关键字是JVM提供的最轻量级的同步机制,一方面它提供了变量对所有线程的可见性,另一方面它禁止了指令重排序变量的可见性:就是当一个线程改变了变量的值,新值对于其他线程来说可以立即得到。而对于普通变量来说是不可以的,普通变量的值在线程间传递均需要通过主内存来完成。volatile修饰的变量之所以可以被立即得到,在于当一个线程对一个volatile变量进行写操作后,会有一个l
2017-08-02 21:52:25 181
转载 Java集合HashMap的源码解刨
初识HashMap之前的List,讲了ArrayList、LinkedList,最后讲到了CopyOnWriteArrayList,就前两者而言,反映的是两种思想:(1)ArrayList以数组形式实现,顺序插入、查找快,插入、删除较慢(2)LinkedList以链表形式实现,顺序插入、查找较慢,插入、删除方便那么是否有一种数据结构能够结合上面两种的优点呢?有,答案
2017-07-31 23:08:59 246
转载 Java集合Hashtable源码解析
1、Hashtable简介(1)Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。(2)Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。(3)Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneab
2017-07-31 23:04:40 256
转载 Java集合HashSet源码剖析
public class HashSet extends AbstractSet implements Set, Cloneable, java.io.SerializableHashSet实现Set接口,内部维护一个HashMap实例变量。不保证顺序,允许null元素。对于基本的操作,如add,remove,contains,size,只需要常量的时间
2017-07-31 23:01:38 270
原创 java中线程的5种状态
在java语言中,线程有5种状态。新建(New):创建后尚未启动的线程都处于这种状态。运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。等待:无限期等待(Waiting):处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显示的唤醒。限期等
2017-07-31 22:05:24 356
原创 java 双亲委派模型
双亲委派模型要求除了顶层的类加载器外,其余的类加载器都应当有自己的父类加载器。这里的类加载器之间的父子关系一般不会以继承的关系来实现,而都是以组合的关系来复用父加载器的代码。双亲委派模型的工作过程是:如果一个类加载器 收到了类加载器的请求,它首先不会自己去尝试加载这个类,而是把这个类委托给父类加载器去完成,每个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有
2017-07-31 21:28:51 401
原创 java中的static关键字
static可以用来修饰变量、方法、代码块、内部类,还可用于静态导包。被static修饰的变量、方法不需要依赖对象来进行访问,即使从未创建某个类的任何对象,只要类被加载,就可以通过类名.变量(方法名)来进行访问。一个static字段对每个类都只有一份存储空间,而非static字段对每个对象都有一个存储空间。static在修饰变量时只能用于修饰成员变量而不能用于修饰局部变量。static
2017-07-31 21:26:41 202
转载 cookie与session的区别
Cookie与Session都可以进行会话跟踪,但是实现的原理不太一样。一般情况下二者均可以满足需求,但有时候不可以使用Cookie,有时候不可以使用Session。下面通过比较说明二者的特点以及适用的场合。 1 . 从存取方式上比较 Cookie中只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8,GBK或者BASE64等方式的编码。Coo
2017-07-25 17:19:25 278
原创 Java多线程实现的四种方式
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。 其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。 1、继承Thread类创建线程Thread类本质上是实现了Runn
2017-07-25 17:17:32 361
原创 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁
2017-07-25 17:12:37 636
原创 maven的安装
唉,真是服了自己了。记性越来越差。一不小心删除了maven,重新安装以及配置弄了好久才弄好。索性在这里记录一下第一步,在maven.apache.org官网上下载maven的压缩包,解压。第二步,配置环境变量。新建修改path.即在原有的path加%M2_HOME%\bin最后,点击确定即可。打开cmd,输入mvn -v,输出如下,则安装成功
2017-07-19 17:32:46 229
原创 Java实现冒泡排序
冒泡排序法的思想是通过与相邻元素的比较和交换把小的元素交换到前面。其过程类似于水泡由下往上逐渐升起。如对5,2,8,7,4进行冒泡排序。首先从后向前冒泡,4和7比较,把4交换在前面,变成5,2,8,4,7.同理4和8交换,变成5,2,4,8,7, 2和4不用进行交换。5和2进行交换,变成2,5,4,8,7.此时第一次冒泡就完成了,把最小的2排在了最前面。对剩下的序列按照以上方法就可得到一个有序序
2017-07-18 17:19:02 255
原创 tcp与udp的区别
tcp是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。tcp能够正确处理在传输过程中的丢包、传输顺序乱掉等异常情况。此外,tcp还能有效利用宽带,缓解网站拥堵,然而,为了建立与断开连接,有时它需要7次的发包收包,导致网络流量的浪费。此外,为了提高网络的利用率,tcp协议定义了各种复杂的规范,因此不利用视频会议(音频、视频的数据量既定)等场合使用。udp有别于tcp,它是一种
2017-07-03 09:43:27 229
原创 事务的四种隔离级别
1.read uncommittted(读取未提交的内容)在read uncommitted隔离级别,所有事务都可以“看到”未提交的事务的执行结果。在这种级别上,可能会产生很多问题,除非用户明确自己在做什么,并且有很好的理由选择这样做。读取未提交数据,也称之为“脏读”。2.read committed(读取提交内容)大多数数据库系统的默认隔离级别是read committed(但不是m
2017-06-13 23:11:10 405
原创 hibernate中get()和load()的区别
1.get()是立即执行sql语句;load是只有访问了对象的非id属性时才执行sql语句;2.get()获取一个对象时,如果找不到,则返回null;load()获取对象时,如果找不到,则抛出ObjectNotFoundException异常;3.get()获取得到的类是一个真实类型的对象;load()获取到的对象是一个代理对象,代理对象的类是hibernate自己创建的类,该类是真实类的
2017-06-13 22:58:04 289
原创 jvm垃圾收集算法
标记-清除算法:算法分为两部分“标记”和“清除”,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它的不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。复制算法:将可用内存分为两部分,每次只使用其
2017-06-06 08:24:34 235
原创 Java中事件监听器的实现
JAVA中一个对象要成为源对象的事件监听器,必须满足以下两个条件:1.监听器必须是监听器接口的一个实例2.监听器必须注册给源对象 (如:sourse.addActionListener、sourse.addWindowListener).事件监听器的实现可分为三种类型:1.匿名类监听2.外部类监听3.自监听(使用当前窗口作为监听器,实现自监听)如对一
2016-11-11 21:13:29 1143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人