
Java SE
文章平均质量分 82
寻道的 Programmer
无根浮盈空欢喜,未悟真经套中人
展开
-
单例模式
概述单例模式(Singleton Pattern),创建对象模式之一,单例模式确保一个类只能创建一个实例。单例模式适用于一个系统要求一个类只有一个实例时,比如Swing窗体,只需要一个实例。如果一个类可以同时存在多个实例,那就不需要使用单例模式。单例模式很容易被滥用。下面看一下代理模式的几种实现方式。实现实现单例模式要两点,一是不能让外界创建对象,所以需要构造器私有化;二是需要提供得到原创 2012-12-28 18:06:01 · 4036 阅读 · 4 评论 -
代理模式
概述代理模式,即ProxyPattern,java常用设计模式之一,动态代理实现了著名的AOP思想。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。通俗的讲,可以拿到现实中来举例,可能说的并不准确,比如,苹果出了一款iphone手机,拿到中国交给代理商来卖,如联通、电信,就是所谓的定制机,联通电信又给iph原创 2012-12-01 00:41:34 · 4276 阅读 · 4 评论 -
装饰模式
概述23种设计模式之一,英文叫DecoratorPattern,中文也叫装饰模式、修饰模式。装饰模式是在不改变类文件和不使用继承的情况下,运行期动态扩展一个对象的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口(没有接口可以原创 2012-11-20 15:07:23 · 3274 阅读 · 2 评论 -
策略模式
概述策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。UML实现Strategy.java,策略类,定义算法的公共接口。public abstract class Strategy { // 算法方法 public abstract void algo原创 2012-11-13 16:17:00 · 6553 阅读 · 5 评论 -
Comparison method violates its general contract!
背景16号为了统一线上服务器运行环境,将两台服务器的Tomcat6+JDK6升级到Tomcat7+JDK7,本以为很简单的事情,升级后自己验证也没问题,没想到却悲剧了。升级后,过了半小时运营就找过来反馈问题,部分角色无法登陆系统,由于异常日志没有输出,没有找到问题,无奈回滚。今天我们就来说说JDK6升级到JDK7会遇到的坑。本文为了方便搜索,就直接以异常信息作为文章标题了。复现回滚后,...原创 2014-12-18 23:08:42 · 76514 阅读 · 13 评论 -
Java线程(三):线程协作-生产者/消费者问题
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不...原创 2012-04-06 22:46:09 · 44243 阅读 · 48 评论 -
Java线程(九):Condition-线程通信更高效的方式
接近一周没更新《Java线程》专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。 那么引入本篇的主角,Conditi...原创 2012-04-20 14:49:39 · 87718 阅读 · 51 评论 -
用Java读取Properties文件六种方法
1、使用java.util.Properties类的load()方法示例:InputStream in = lnew BufferedInputStream(new FileInputStream(name));Properties p = new Properties();p.load(in);2、使用java.u转载 2011-03-05 20:55:00 · 3125 阅读 · 4 评论 -
如何实现按距离排序、范围查找
简介现在几乎所有的O2O应用中都会存在“按范围搜素、离我最近、显示距离”等等基于位置的交互,那这样的功能是怎么实现的呢?本文提供的实现方式,适用于所有数据库。实现为了方便下面说明,先给出一个初始表结构,我使用的是MySQL:CREATE TABLE `customer` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键原创 2016-01-30 11:58:03 · 53220 阅读 · 8 评论 -
Guava Collect
进入新公司就会接触一些新的东东,Guava就是一个,Guava是Google的一个开源类库,丰富了JDK的API,而且使用起来很方便,本文介绍的是Guava collect包下的一些常用工具类。原创 2014-06-01 17:57:03 · 8473 阅读 · 0 评论 -
Guava Predicate
Predicate<泛型>(断言,断定),是Guava中的一个基础接口,其内部只有一个方法`boolean apply(T input)`,这个方法输入是一个泛型对象,输出是一个布尔值,非常简单,下面来看一下这个小东西能帮助我们做原创 2016-06-18 23:45:24 · 6971 阅读 · 0 评论 -
Java分页之假分页
假分页,顾名思义,不是真正的在数据库里进行过滤,而是从数据库查询之后,取得全部结果,在展现的时候做些手脚。import java.util.ArrayList;import java.util.List;public class Pager { /** * 当前页码 */ private int currentPage; /** * 总页数 */ privat原创 2012-02-08 20:46:22 · 18666 阅读 · 8 评论 -
JNI(一):初识JNI
上图简单的介绍了JNI的概念、应用场景、原理、使用步骤,下面通过JNI实现一个Hello world实例。 1. 在Java类中声明native方法,NativeTest.java。package com.ghsau;public class NativeTest { public native void sayHello();// native修饰的方法不能有方法体原创 2012-07-15 21:30:21 · 2833 阅读 · 0 评论 -
Java奇淫巧技之Lombok
背景 我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,我们来看一下下面这张图,右面是一个简单的JavaBean,只定义了两个属性原创 2016-09-08 14:35:28 · 86019 阅读 · 10 评论 -
Java Mail(二):JavaMail介绍及发送一封简单邮件
本文来自:高爽|Coder,原文地址:http://blog.youkuaiyun.com/ghsau/article/details/17839983,转载请注明。 JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket)原创 2014-01-04 15:57:21 · 100644 阅读 · 22 评论 -
Java线程(一):线程安全与不安全
作为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。记得大一刚学Java的时候,老师带着我们做了一个局域网聊天室,用到了AWT、Socket、多线程、I/O,编写的客户端和服务器,当时做出来很兴奋,回学校给同学们演示,感觉自己好NB,呵呵,扯远了。上次在百度开发者大会上看到一个提示语,自己写的代码,6个月不看也是别人的代码,自己学的知识也同样如此...原创 2012-04-02 12:13:29 · 118873 阅读 · 108 评论 -
Java线程(二):线程同步synchronized和volatile
要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现。拿上篇博文中的例子来说明,在多个线程之间共享了Count类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线程栈),工作内存存储了主内存Count对象的一个副本,当线程操作Count对象时,首先从主内存复制Co...原创 2012-04-04 10:49:28 · 128741 阅读 · 65 评论 -
HashMap深度解析(二)
本文来自:高爽|Coder,原文地址:http://blog.youkuaiyun.com/ghsau/article/details/16890151,转载请注明。 上一篇比较深入的分析了HashMap在put元素时的整体过程,Java Collections Framework中实际操作的都是数组或者链表,而我们通常不需要显示的维护集合的大小,而是集合类框架中内部维护,方便的同...原创 2013-11-26 10:46:13 · 62103 阅读 · 23 评论 -
HashMap深度解析(一)
HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常开发。在很多Java的笔试题中也会问到,最常见的,“HashMap和HashTable有什么区别?”,这也不是三言两语能说清楚的,这种笔试题就是考察你来笔试之前有没有复习功课,随便来个快餐式的复习就能给出答案。原创 2013-11-22 00:11:04 · 143710 阅读 · 46 评论 -
Java线程(七):Callable和Future
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返原创 2016-02-05 15:12:04 · 285172 阅读 · 64 评论 -
增量接口的设计及实现
引言在应用开发过程中,我们总会碰到这样的场景:某系统需要同步我们系统的数据去做一些业务逻辑,当数据量较小的时候,可以全量的提供,但当数据量很大时,全量提供就显得很笨重,不仅耗时而且做了很多无用功,这时我们需要一种提供增量数据的机制,只告诉对方变化的数据。提供增量数据大致可分为两种方式:MQ和接口提供,MQ的优点是及时,缺点是丢失、重复、回溯复杂等等问题(依赖于具体MQ实现),这里不过多赘述;接原创 2017-03-20 15:26:57 · 10827 阅读 · 1 评论 -
Java线程(十):CAS
前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。public final int incrementAndGet() { for (;;) { ...原创 2014-08-18 21:54:37 · 12423 阅读 · 8 评论 -
再聊线程池
最近恰好在组内分享线程池,又看了看四年前自己写的线程池文章,一是感叹时光荏苒,二是感叹当时的理解太浅薄了,三是感叹自己这么多年依然停留在浅薄的理解当中,没有探究其实现,羞愧难当。遂把分享的内容整理出来,希望能够让读者对线程池有一个全新的认识。原创 2016-12-09 23:29:15 · 9095 阅读 · 14 评论 -
Java线程专栏文章汇总
Java线程专栏文章目录,方便阅读。原创 2013-12-27 13:08:52 · 13726 阅读 · 8 评论 -
Java Mail(三):Session、Message详解
上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设置到Transport中,收件人可以设置到Message中,也可以设置到Transport中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。Session Session用于收原创 2014-01-06 12:29:25 · 37435 阅读 · 16 评论 -
工厂方法模式
概述 工厂方法模式,英文Factory method pattern,工厂方法模式是简单工厂模式的进化版, 看本文之间最好先看一下简单工厂模式。工厂方法模式是定义一个创建产品对象的工厂接口,工厂接口本身不去创建对象,而是交给其子类或者是其实现类去创建,将实际创建工作推迟到子类中进行,我们先看一下如何实现工厂方法模式,最后再说一下它有什么好处。实现 Operati原创 2013-01-13 00:34:31 · 10538 阅读 · 13 评论 -
Java线程(十一):Fork/Join-Java并行计算框架
并行计算在处处都有大数据的今天已经不是一个新鲜的词汇了,现在已经有单机多核甚至多机集群并行计算,注意,这里说的是并行,而不是并发。严格的将,并行是指系统内有多个任务同时执行,而并发是指系统内有多个任务同时存在,不同的任务按时间分片的方式切换执行,由于切换的时间很短,给人的感觉好像是在同时执行。 Java在JDK7之后加入了并行计算的框架Fork/Join,可以解决我们系统中大数据计算的性能问题。原创 2015-07-22 21:12:51 · 19359 阅读 · 16 评论 -
Java线程(八):锁对象Lock-同步问题更完美的处理方式
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:public class LockTest { public static voi...原创 2012-04-14 22:29:43 · 116500 阅读 · 39 评论 -
Java Mail(一):telnet实现发送收取邮件
最近要做一个解析邮件的东东,就顺便系统的搞一下Java Mail的API吧,以前搞过,现在都忘到十万八千里了,要说技术就得学以致用,要不全扔了。 说起邮箱,工作中挺常用的工具,上学的时候都没怎么用。国内的邮箱系统相当多了,163、sina、sohu、qq,这些是耳熟能详针对普通用户的邮箱,还有很多针对企业用户的。邮箱有两种协议,一种是发送邮件的协议smtp,另一种是收取邮件的协议p原创 2013-02-22 14:17:33 · 10186 阅读 · 3 评论 -
Java线程(篇外篇):线程本地变量ThreadLocal
首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如Hibernate中的OpenSessionInView,就是使用ThreadLocal保存Session对象,还有我们经常用ThreadLocal存放Connection,代码如:/** * 数据库连接管理类 * ...原创 2013-11-13 21:37:58 · 52091 阅读 · 10 评论 -
FTP上传文件,Apache篇
前段时间做了个任务,是公司liunx机器上有个公司静态网站的文件夹,因为不定期的修改,修改完之后要同步到FTP服务器上,之前一直是手动使用FTP工具来同步,我的任务是开发一个能够同步静态网站的action,集成到ETL工具中,然后每天会自动运行这个action,这样就避免手动同步了。 之前没有做过FTP上传,百度之,做FTP上传有两个类库,一个sun的FtpClient,不过su原创 2012-02-17 21:03:19 · 6956 阅读 · 2 评论 -
在jar包中如何获得当前项目的绝对路径
我们知道,在web项目中,通过在过滤器、监听器或者servlet中,得到ServletContext对象,调用getRealPath("/")方法,就可以得到当前项目的绝对路径,但是在jar包中,是无法使用这种方式的,我采取的方式是在过滤器、监听器或者servlet中得到路径之后,通过System.setProperty("pro","path"),然后在jar包中需要路径的类中通过System.原创 2012-02-08 20:31:50 · 4499 阅读 · 5 评论 -
Java获取照片EXIF信息
今天上传几张照片到人人相册,发现可以看到我相机的信息,当然很多图片软件都能看到,所以搜索了下Java如何操作,以后备用。原文地址:http://yijianfengvip.blog.163.com/blog/static/1752734322010103084230677首先介绍一下什么是EXIF,EXIF是 Exchangeable Image File的缩写,这是一转载 2013-01-06 12:52:40 · 32305 阅读 · 1 评论 -
Java线程(五):Timer和TimerTask
Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。 Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。 ...原创 2012-04-08 00:43:03 · 63428 阅读 · 16 评论 -
Java线程(篇外篇):阻塞队列BlockingQueue
好久没有写文章了,这段时间事情比较杂,工作也比较杂乱,上周日刚搬完家,从自建房搬到了楼房,提升了一层生活品质,哈哈!不过昨天晚上在公交车上钱包被偷了,前段时间还丢个自行车,不得不感叹,京城扒手真多,还无人处理。言归正传,这一段时间我的工作主要是改进公司的调度器,调度器调度线程池执行任务,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入任务,消费者从队列里...原创 2012-10-25 12:13:01 · 33658 阅读 · 16 评论 -
Java序列化(一)
Java序列化,一个日常开发中比较少用到的技术。正常情况下,JVM启动后,我们可以创建对象生存其内,JVM关闭后,我们创建过的对象都随之销毁,资源释放。但有些时候可能要求在JVM停止之后,某些对象需要保存起来,以便将来再重新读取它们。原创 2014-01-28 20:58:24 · 7004 阅读 · 5 评论 -
Collections.sort in JDK6:MergeSort
本文是对JDK6中Collections.sort方法的源码解析,也可以看作是对Comparison method violates its general contract!的后续分析。在JDK6中,该方法底层使用的是经过优化后的归并排序,废话不多说,直接看源码。public static void sort(List list, Comparator c) { Object[] a = l原创 2015-01-02 14:01:41 · 4794 阅读 · 1 评论 -
关于List比较好玩的操作
作为Java大家庭中的集合类框架,List应该是平时开发中最常用的,可能有这种需求,当集合中的某些元素符合一定条件时,想要删除这个元素。如:public class ListTest { public static void main(String[] args) { List<Integer> intList = new ArrayList&...原创 2013-07-16 22:08:02 · 6316 阅读 · 9 评论 -
Java线程(六):线程池
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。原创 2012-04-09 23:31:07 · 39242 阅读 · 45 评论 -
Why hashcode 31?
前几天被人问到了hashcode如何实现,说实话,真的是没有自己写过,通常情况下都会通过IDE自动生成,惭愧。今天研究了下hashcode的生成原理,首先看一下String类中的hashCode方法原创 2014-03-16 17:22:44 · 5359 阅读 · 6 评论