Java
文章平均质量分 71
和大黄
这个作者很懒,什么都没留下…
展开
-
深入Java集合学习系列一:ArrayList的实现原理
1. ArrayList概述: ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自转载 2014-09-01 20:57:52 · 1186 阅读 · 0 评论 -
Arrays.copyof(···)与System.arraycopy(···)区别
首先观察先System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)的声明:[java] view plaincopypublic static native void arraycopy(Object src, int srcPos,转载 2014-09-01 22:56:35 · 1733 阅读 · 0 评论 -
解决哈希冲突的几种方法
虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外,当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记录,不仅发生冲突,而且还会发生溢出。因此,处理冲突和溢出是 哈希技术中的两个重要问题。1、开放定址法 用开放定址法解决冲突的做法是:当冲突发生时,使用某种转载 2014-09-02 22:13:30 · 3022 阅读 · 0 评论 -
Dubbo实例
1. 概述Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。主要核心部件Remoting: 网络通信框架,实现了sync-over-async 和 request-response 消息机制.RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能Registry: 服务目录框架用于服原创 2015-02-01 18:55:27 · 3134 阅读 · 3 评论 -
jps
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path. $> jps 23991转载 2015-08-28 10:14:12 · 895 阅读 · 0 评论 -
spring事务
一、spring事务管理方式spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前转载 2015-10-21 19:32:07 · 6532 阅读 · 0 评论 -
深入Java集合学习系列二:HashMap的实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,H转载 2014-09-01 22:48:21 · 1094 阅读 · 0 评论 -
Java设计模式之访问者模式
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增转载 2014-08-31 22:31:48 · 1130 阅读 · 0 评论 -
Java设计模式之适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式,先看类图:核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码:转载 2014-08-31 21:29:05 · 937 阅读 · 0 评论 -
Java设计模式之工厂模式
一、工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 工厂模式在《Java与模式》中分为三类:1)简单工厂模式(Simple Factory):不利于产生系列产品;2)工厂方法模式(Factory Method):又称为多形性工厂;3)抽象工厂模式(Abstract Factory):又称为工具箱转载 2014-08-30 23:06:52 · 976 阅读 · 0 评论 -
sleep 和wait 的区别
1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让转载 2014-08-26 20:48:07 · 1011 阅读 · 0 评论 -
Java实现定时调度的三种方法
1、TimerTimer myTimer = new Timer(); myTimer.schedule(new Worker(), 1000);//1秒后执行 // 2012-02-28 09:58:00执行 myTimer.schedule(new Worker(), new SimpleDateFormat("yyyy-MM-d转载 2014-08-24 17:48:59 · 35210 阅读 · 1 评论 -
Java设计模式之装饰模式
装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。转载 2014-08-23 20:50:59 · 1303 阅读 · 0 评论 -
JAVA类库中的设计模式
创建型设计模式抽象工厂模式特点:创建方法返回一个可以用来创建抽象类或接口的工厂类。javax.xml.parsers.DocumentBuilderFactory#newInstance()javax.xml.transform.TransformerFactory#newInstance()javax.xml.xpath.XPathFactory#newIns转载 2014-08-24 12:34:15 · 1804 阅读 · 0 评论 -
阻塞队列BlockingQueue
<br /> <br /> 本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.<br /> 本例再次实现11.4线程----条件Condition中介绍的篮子程序,不过这个篮子中最多能放的苹果数不是1,可以随转载 2011-01-05 16:10:00 · 1235 阅读 · 0 评论 -
应用Spring的注解方式实现AOP
一、使用1、导入需要的包首先,为了使用Spring的AOP注解功能,必须在pom.xml中导入如下几个包。 3.2.9.RELEASE 1.1 1.7.2 org.springframework spring-context原创 2015-11-03 11:28:51 · 8736 阅读 · 0 评论 -
java异常处理中的return和throw
public class T { public T() { } boolean testEx() throws Exception { boolean ret = true; try {转载 2011-08-01 09:22:59 · 17162 阅读 · 2 评论 -
guava LoadingCache学习
guava LoadingCache学习简介使用Guava Cache可以保证只让一个线程去加载数据(比如从数据库中),而其他线程则等待这个线程的返回结果。这样就能避免大量用户请求穿透缓存。但是也有一个很致命的缺陷:如果缓存过期,恰好有多个线程读取同一个key的值,那么guava只允许一个线程去加载数据,其余线程阻塞。这虽然可以防止大量请求穿透缓存,但是效率低下。使用refreshAfter...原创 2019-05-31 18:33:25 · 3252 阅读 · 0 评论 -
JUC中线程池的使用
ThreadPoolExecutorThreadPoolExecutor的完整构造方法的签名是:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory,原创 2014-08-23 23:42:01 · 3923 阅读 · 1 评论 -
Java8 Optional总结
1、构造方式Optional 的三种构造方式: Optional.of(obj), Optional.ofNullable(obj) 和 Optional.empty()1.1、Optional.of(obj)它要求传入的 obj 不能是 null 值的, 否则 NullPointerException.使用场景:1. 当我们非常非常的明确将要传给 Optional.of原创 2017-12-14 17:52:07 · 8985 阅读 · 0 评论 -
Java命令学习
来源:Hollis链接:http://www.hollischuang.com/archives/110一、jpsjps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用转载 2016-07-08 17:02:53 · 2531 阅读 · 0 评论 -
@Import注解
@Import注解就是之前xml配置中的import标签,可以用于依赖第三方包中bean的配置和加载在4.2之前只支持导入配置类在4.2,@Import注解支持导入普通的java类,并将其声明成一个beanpublic class DemoService { public void doSomething(){ System.out.println("ok"转载 2017-07-11 19:34:47 · 26699 阅读 · 1 评论 -
log4j2异步Logger
1 异步Logger的意义之前的日志框架基本都实现了AsyncAppender,被证明对性能的提升作用非常明显。在log4j2日志框架中,增加了对Logger的异步实现。那么这一步的解耦,意义何在呢?如图,按我目前的理解:异步Logger是让业务逻辑把日志信息放入Disruptor队列后可以直接返回(无需等待“挂载的各个Appender”都取走数据)优点:更高吞吐、原创 2017-05-26 19:52:20 · 6839 阅读 · 0 评论 -
Java:int a=0;a=a++;问:a=?
注意一点就可以了:右侧运算符操作,会将操作数据压入栈中转载 2017-05-08 10:24:16 · 3642 阅读 · 0 评论 -
guava之Multimap
package com.test;import java.util.Collection;import com.google.common.collect.ArrayListMultimap;import com.google.common.collect.ImmutableSet;import com.google.common.collect.Multimap;public c原创 2017-03-10 22:13:19 · 1677 阅读 · 0 评论 -
Lock和Synchronized区别
1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定时锁等候和中断锁等候。线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定。如果使用synchronized,如果A不释放,B将一直等下去,不能被中断。如果使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情转载 2016-08-11 14:09:38 · 1299 阅读 · 0 评论 -
Spring的两种事务定义方式
一、第一种配置方法:基于XML的事务管理这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:原创 2016-06-23 20:12:18 · 8186 阅读 · 0 评论 -
Elasticsearch学习总结
方法http://www.infoq.com/cn/articles/database-timestamp-021.3 与关系型数据库的名词对照Relational DB => Databases => Tables => Rows => Columns Elasticsearch => Indices => Types => Documents => Fields转载 2016-07-15 16:21:55 · 4418 阅读 · 0 评论 -
Java GC基本算法
1、JVM内存组成结构JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:1)堆所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示:转载 2014-07-26 23:04:12 · 19133 阅读 · 5 评论 -
HttpClient使用总结
一、使用方法使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。1. 创建HttpClient对象。2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams par转载 2015-10-20 11:39:23 · 9992 阅读 · 0 评论 -
JVM参数配置总结
一、堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xm转载 2016-04-25 15:08:05 · 1943 阅读 · 0 评论 -
BeanPostProcessors使用总结
1、BeanPostProcessors接口如果这个接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调。容器调用接口定义的方法时会将该受管Bean的实例和名字通过参数传入方法,进过处理后通过方法的返回值返回给容器。要使用BeanPostProcessor回调,就必须先在容器中注册实现该接口的类,那么如何注册呢?Be原创 2015-11-03 20:29:00 · 8030 阅读 · 1 评论 -
Spring中Bean初始化的三种方法
常用的设定方式有以下三种:通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。 pu原创 2015-12-16 13:45:33 · 45253 阅读 · 0 评论 -
java设计模式之模板方法模式
解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承Abstract转载 2014-08-10 22:55:24 · 827 阅读 · 0 评论 -
java设计模式之迭代器模式
MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,我们来看看实现代码:两个接口:[java] view plaincopypublic interface Collection { public Iterator iterator();转载 2014-08-10 22:27:39 · 773 阅读 · 0 评论 -
nio原理与实例
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个原创 2011-01-05 15:39:00 · 3265 阅读 · 1 评论 -
Reactor模式和NIO(转)
本文可看成是对Doug Lea Scalable IO in Java一文的翻译。当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:1. Read request2. Decode request3. Process service4. Encode reply5. Send reply经典的网络服务的设计如下图,在每个线程中完成对数据的处理:但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流转载 2011-01-05 15:58:00 · 1419 阅读 · 1 评论 -
非阻塞通信
<br /><br />本篇文章观点和例子来自 《Java网络编程精解》, 作者为孙卫琴, 出版社为电子工业出版社。<br /> 对于用ServerSocket 及 Socket 编写的服务器程序和客户程序, 他们在运行过程中常常会阻塞. 例如, 当一个线程执行 ServerSocket 的accept() 方法时, 假如没有客户连接, 该线程就会一直等到有客户连接才从 accept() 方法返回. 再例如, 当线程执行 Socket 的 read() 方法时, 如果输入流中没有数据, 该线程就会转载 2011-01-05 20:04:00 · 1287 阅读 · 0 评论 -
HashMap源码分析
1、hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。 上图中,X轴方向为HashMap的数组容器,Y轴方向,为每个相应位置的单向链表。每一个元素都是一个包含如图所示四个属性,k转载 2011-02-24 20:53:00 · 8554 阅读 · 1 评论 -
简单LRU算法实现缓存
<br /> <br />最简单的LRU算法实现,就是利用jdk的LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可,如下所示:如果你去看LinkedHashMap的源码可知,LRU算法是通过双向链表来实现,当某个位置被命中,通过调整链表的指向将该位置调整到头位置,新加入 的内容直接放在链表头,如此一来,最近被命中的内容就向链表头移动,需要替换时,链表最后的位置就是最近最少使用的位置。import java.util.ArrayList; impor转载 2011-02-24 21:15:00 · 1906 阅读 · 0 评论