Java
文章平均质量分 70
奋起直追CDS
这个作者很懒,什么都没留下…
展开
-
后缀树
后缀树,就是把一串字符的所有后缀保存并且压缩的字典树。相对于字典树来说,后缀树并不是针对大量字符串的,而是针对一个或几个字符串来解决问题。比如字符串的回文子串,两个字符串的最长公共子串等等,后面应用会说。一、建立后缀树比如单词banana,它的所有后缀显示到下面的。1代表从第一个字符为起点,终点不用说都是字符串的末尾。 以上面的后缀,我们建立一颗后缀树。如下图,为了方便看到后缀...原创 2018-03-28 15:59:16 · 1811 阅读 · 0 评论 -
Java并发编程的艺术-读书笔记
Java直接内存NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的限制;而DirectBuffer直接分配在物理内存中,并不占用堆空间,其可申请的最大内存受操作系统限制。...原创 2018-02-22 23:22:03 · 171 阅读 · 0 评论 -
双重检查锁定与延迟初始化
转自:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟...转载 2018-02-22 23:19:53 · 166 阅读 · 0 评论 -
Java多线程总结(一)
一、守护进程我认为学习java的最佳资料就是两个东西,一个是其JDK文档,一个就是源码。我们先来看看JDK文档中对于Thread类的描述,下面摘取一些重要信息,然后逐个展开讲解。(JDK文档)线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个...原创 2018-02-22 01:06:53 · 714 阅读 · 0 评论 -
JVM对锁的优化
JVM对锁的优化1 线程状态及状态转换当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程:Contention List:竞争队列,所有请求锁的线程首先被放在这个竞争队列中;Entry List:Contention List中那些有资格成为候选资源的线程被移动到Entry List中;Wait Set:哪些调用wait方法被阻塞的线程被放置在...原创 2018-02-21 18:01:00 · 527 阅读 · 0 评论 -
SpringMVC入门
SpringMVC处理流程:(1)DispatcherServlet截获客户端请求。(2)DispatcherServlet解析URL,通过查找处理器映射器(HandlerMapping)找到对应的处理器对象(Handler),以及这个对象关联的拦截器(Interceptor),这些对象被封装在一个HandlerExecutionChain对象里面。(3)DispatcherServl...原创 2018-02-21 13:38:58 · 414 阅读 · 0 评论 -
MyBatis入门
1. 基本用法开发流程:(1)配置好MyBatis主要就是需要配置好数据源以及告诉MyBatis持久化类的映射文件mapper.xml哪里找。MyBatis默认的配置文件名称是mybatis-config.xml,在最开始的示例中我们将MyBatis的配置放在了applicationContext.xml中,这也是可以的。传统简单配置:<?xml version="1...原创 2018-02-21 13:41:41 · 325 阅读 · 0 评论 -
强引用/软引用/弱引用/虚引用
想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题。一、Reference的概念从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期...转载 2018-03-14 21:33:39 · 183 阅读 · 0 评论 -
SpringMVC配置文件详解
1 web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocat...原创 2018-02-19 01:37:00 · 447 阅读 · 0 评论 -
Java NIO总结
一、概述1. NIO与IO的区别Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道读取数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞。所以直至数据变的可以读取之前,该线程可以继续做其他的事情...原创 2018-03-07 18:44:45 · 293 阅读 · 0 评论 -
Java类初始化顺序
先不考虑父类。初始化的一个大原则是:(1)静态域成员(静态变量和静态代码块)最先;(2)非静态域成员(成员变量和初始化代码块)先于构造函数;(3)同是静态域成员或同是非静态域成员,则先后顺序和代码顺序一致public class InitialOrder { private static String staticField = "Static Field Initi...转载 2018-03-07 01:20:05 · 204 阅读 · 0 评论 -
Java GC算法
GC算法内存垃圾回收主要集中于 java 堆和方法区中。对象存活判断判断对象是否存活一般有两种方式:引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到...原创 2018-03-07 00:08:46 · 313 阅读 · 0 评论 -
Java代理模式
从UML图中,可以看出代理类ProxySubject和被代理类RealSubject都实现了抽象主题Subject(接口),其中RealSubject是ProxySubject的一个成员属性,ProxySubject调用visit()方法会调用RealSubject的visit()方法,同时会加上自己的一些逻辑,比如before()、after()、权限校验等。代理模式可以有两种实现的方式,一原创 2018-02-05 18:37:51 · 257 阅读 · 0 评论 -
Java泛型
一、概述泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。以ArrayList举例,在不指定泛型类型的时候,它可以存放任意数据类型:List arrayList = new ArrayList()原创 2018-02-05 18:36:39 · 152 阅读 · 0 评论 -
Java反射学习笔记
一、概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。1. Class对象所有类都是在对其第一次使用时,类加载器首先会检查这个类的Class对象是否已被加载过,如果尚未加载,默认的类加载器就会根据类名查找对应的.class原创 2018-02-05 18:35:59 · 217 阅读 · 0 评论 -
Servlet简介
1. Servlet简介Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1、编写一个Java类,实现servlet接口。 2、把开发好的Java类部署到web服务器中。 按照一种约定俗成的称呼习惯,通常我们也把实现转载 2018-02-03 01:11:59 · 212 阅读 · 0 评论 -
Java Executor框架
1. Runnable接口步骤:定义类实现Runnable接口:覆盖Runnable接口中的run方法,将线程要运行的代码存放在该run方法中。通过Thread 类建立线程对象:将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。调用Thread类的start方法开启线程。public class example { public s...原创 2018-02-23 02:04:04 · 222 阅读 · 0 评论 -
阻塞队列BlockingQueue
1 简介阻塞队列支持阻塞的插入和移除方法:(1)阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。(2)阻塞的移除:当队列为空的时候,获取元素的线程会被阻塞。BlockingQueue<E>方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null或false`,...原创 2018-02-23 01:43:42 · 485 阅读 · 0 评论 -
字典树-Trie树
一、概念字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种。利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。1.1 基本性质根节点不包含字符,除根节点外的每一个子节点都包含一个字符从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串每个节点的所有子节点包含的字符都不相同1.2 特性1)根节点不包...原创 2018-03-28 14:17:24 · 592 阅读 · 0 评论 -
快排和堆排序
一、堆排序5.1 堆的定义用数组保存效率高,第 i 个节点保存在下标为 i 的位置,也就是 arry[0]空着。第 i 个元素的左节点在 2 * i,右节点在 2 * i + 1。一个节点的父节点在 i / 2 位置。以一个size变量记录堆的大小。5.2 堆的基本操作5.2.1 提取最大元素return array[1]5.2.2...原创 2018-03-27 23:31:32 · 675 阅读 · 0 评论 -
简单排序算法
插入排序、希尔排序、选择排序、归并排序。插入排序等时间复杂度为O(N^2),任何通用的排序算法的时间复杂度都是O(N Log N)。一、插入排序import java.util.Arrays;public class App { public static void main(String[] args) { int[] testArray = {...原创 2018-03-27 19:40:54 · 521 阅读 · 0 评论 -
CGLib动态代理的底层原理
JDK实现动态代理需要实现类通过接口定义业务方法。CGLib采用了非常底层的字节码技术,其原理是通过目标类的字节码为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。底层使用字节码处理框架ASM,来转换字节码并生成新的类。更详细一点说,代理类将目标类作为自己的父类并为其中的每个非final委托方法创建两个方法: 一个是与目标方法签名相同的方法,它在方法...原创 2018-03-25 12:41:48 · 4920 阅读 · 0 评论 -
Spring事务的用法与原理
1. 事务ACIDAtomicity原子性:一个事务要么全部执行,要么不执行;Consistency一致性:事务的运行并不改变数据库中数据的一致性,例如检查约束、非空约束、主键约束、外键约束;Isolation隔离性:两个以上的事务不会出现交错执行的状态;Durability持久性:事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚;...原创 2018-03-25 00:06:08 · 7035 阅读 · 1 评论 -
Java与Spring注解的原理
注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻方便的使用这些数据,用来将任何的信息或者元数据与程序元素(类、方法、成员变量等)进行关联。Annotation其实是一种接口,通过Java的反射机制相关的API来访问Annotation信息。相关框架或工具中的类根据这些信息来决定如何使用该程序元素或改变它们的行为。...原创 2018-03-24 21:37:37 · 330 阅读 · 0 评论 -
Servlet 3.0/3.1 中的异步处理
在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。即便是像S...转载 2018-03-14 16:30:00 · 325 阅读 · 0 评论 -
遍历中修改HashMap的Key
一、不可变对象1.1 什么是不可变对象immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects。不可变的优势:(1)提高效率。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只...原创 2018-03-24 11:38:23 · 19656 阅读 · 0 评论 -
设计模式实例总结
1 创建型模式1.1 单例模式为了避免不一致的状态,避免政出多头。某些实例的创建需要很大的开销,一个就够了,为了节约资源所以做成单例模式。RuntimeRuntime 类代表着Java程序的运行时环境,每个Java程序都有一个Runtime实例,该类会被自动创建,我们可以通过Runtime.getRuntime() 方法来获取当前程序的Runtime实例。 ...原创 2018-03-05 23:55:33 · 276 阅读 · 0 评论 -
会话保持原理
1. 什么是会话保持?会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题。会话保持有时候又叫做粘滞会话(Sticky Sessions)。会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求会分配到一台服务器上。2. 什么是Session在WEB开发中,服务器可以为每个用户浏览器创建一个会话...原创 2018-03-18 00:54:45 · 6857 阅读 · 0 评论 -
Java 13个原子操作
1 总结在java.util.concurrent.atomic 包下原子更新方式** 原子更新基本类型原子更新数组原子更新引用原子更新属性(字段)原子更新基本类型 AtomicBoolean :原子更新布尔类型AtomicInteger: 原子更新整型AtomicLong: 原子更新长整型原子更新数组 AtomicIntegerArray :原子更新整型数组里的元素...原创 2018-02-25 16:18:57 · 1309 阅读 · 0 评论 -
ConcurrentLinkedQueue
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。而非阻塞的实现方式则可以使用循环CAS的方式来实现。本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Con...转载 2018-02-25 15:55:10 · 363 阅读 · 0 评论 -
并发级别
在看多核编程相关论文时,往往一个并发算法会说自己是wait-free的或者lock-free的,或者是 non-blocking 的,这些专有词汇其实表示的是并发的程度,或者说并发的级别。并发级别的理解是阅读各种并发算法设计论文以及并发数据结构实现的必备基础。Wait-freedom 无等待并发无锁只要求有一个线程可以在有限步内完成操作,而无等待则在无锁的基础上更进一步进行扩展。它要求...转载 2018-02-25 15:11:09 · 1022 阅读 · 0 评论 -
Java常用集合类总结
StringBufferStringBuilderHashMapHashTableArrayListLinkedListStringBufferStringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类,所以在实际使用时,如果经常需要对一个字符串进行修改,例如追加、插入、删除等操作,使用StringBuffer要更加适合一些。对于String...原创 2018-02-24 21:38:17 · 309 阅读 · 0 评论 -
ConcurrentHashMap总结
HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占。ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的Hashtable,...原创 2018-02-24 21:33:33 · 403 阅读 · 0 评论 -
Java队列同步器
队列同步器AbstractQueuedSynchronizer(AQS),似乎我们不经常用,但是它是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。对于锁来说,获取到同步状态就表示获取到了该锁。同步器的主要使用方式是继承,一般作为同步器组件的静态内部类,在同步器中仅定义了与状态相关的方法,且这个状态既可以独占地获...原创 2018-02-24 21:41:58 · 405 阅读 · 0 评论 -
Spring注解+AOP+JDBC
注解@Required注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。public class Student { private Integer age; private String name; @Req转载 2018-02-02 21:02:05 · 207 阅读 · 0 评论 -
Spring概述
数据访问/集成JDBC 模块提供了删除冗余的 JDBC 相关编码的 JDBC 抽象层。ORM 模块为流行的对象关系映射 API,包括 JPA,JDO,Hibernate 和 iBatis,提供了集成层。OXM 模块提供了抽象层,它支持对 JAXB,Castor,XMLBeans,JiBX 和 XStream 的对象/XML 映射实现。Java 消息服务 JMS 模块包含生产和消费的信息转载 2018-02-02 21:01:07 · 217 阅读 · 0 评论 -
HashMap
java的集合类主要由两个接口生成: (1) Collection:Set(无序集,只可以根据元素本身来访问,所以不能重复),List(有序集,元素可以重复),Queue(队列)(2) Map:key-value对。将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映原创 2016-03-09 21:24:17 · 529 阅读 · 0 评论 -
Integer.highestOneBit(int i)的作用
源码 /** * Returns an {@code int} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in the specified * {@code int} value. Returns zero if原创 2016-03-09 19:58:19 · 3420 阅读 · 0 评论 -
Java序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨。1 Java序列化Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。2 为什么需要序列化我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在原创 2016-03-08 20:23:16 · 532 阅读 · 0 评论 -
Java中的String为什么是不可变的?
转自:http://www.2cto.com/kf/201401/272974.html什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类转载 2016-03-08 23:34:47 · 449 阅读 · 0 评论