
java
文章平均质量分 90
iteye_12150
这个作者很懒,什么都没留下…
展开
-
Java generic 中通配符的几点理解
置换原则结合Java本身的一些面向对象的特性,我们很容易理解这么一个置换原则:一个指定类型的变量可以被赋值为该类型的任何子类;一个指定某种类型参数的方法可以通过传入该类型的子类来进行调用。总的来说,就是说我们使用的任何类型变量都可以用该类型的子类型来替换。 泛型中一种错误的继承关系在泛型的编程中,我们考虑到子类型关系的时候,容易把一种关系给弄混淆,并错误的采用置换原则。...2012-02-14 23:00:41 · 216 阅读 · 0 评论 -
ant杂事整理
ant简单介绍 我们在平常的java开发过程中间,经常会处理一些这样的小任务,比如编译代码,运行测试代码,代码打包等。最常见的一些问题就是,如果用手工命令行来处理的话,需要敲很长的命令行,要在命令行里面指定各种参数。这样就很麻烦。如果用IDE来做呢,确实显得方便一点,可是不同的人拿到代码,用IDE打开,然后要来处理这些任务的时候,经常也需要配置classpath之类的各种路径。还是不...原创 2012-07-21 11:49:21 · 142 阅读 · 0 评论 -
Java Comparable & Comparator
从排序说起 在一些数组或者列表排序的场景中,需要对一系列的元素按照某种要求排序。典型的情况就是按照自然顺序排序。我们常用到的就是比如Collection.sort()和Arrays.sort()这几个方法。Collections.sort()和Arrays.sort()两个方法的具体签名形式如下: public static <T extends Comparable<...2012-03-04 13:30:50 · 103 阅读 · 0 评论 -
ArrayList.remove()的一个小细节
不废话,先上代码: ArrayList<Integer> col = new ArrayList<Integer>();System.out.println("Initial size: " + col.size());for(int i = 0; i < 20; i++) col.add(i + 10); 显然,上面这段代码再简...2012-03-09 13:05:48 · 174 阅读 · 0 评论 -
java 生成若干位随机数的问题
在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示。因为要求最后是一个4位的整数,不带小数点。当时就想到了几个办法:一、 用Math.random()当时就这么想到,Math.random()方法不正好可以生成[0, 1)之间的数字么?如果用这个数字乘以10000不就是一个从[0, 1000)之间的数字了么? 于是当...2012-03-22 23:07:06 · 407 阅读 · 0 评论 -
从Iterator Pattern说起
疑惑之初:记得初次编程的时候,看到书上说过当要想实现对某个对象进行迭代器访问的方式时,需要实现一些特定的接口。比如说我们想用如下的一段代码: for(ListItem item : itemSet) item.xxx(); 那么我们就需要实现java.lang.Iterable<T>接口。这个接口包含的方法细节如下: public interfa...原创 2012-03-30 01:16:54 · 167 阅读 · 0 评论 -
求数组中Majority元素的方法
问题描述在一个规模为N的数组A中,所谓的Majority元素就是指出现次数大于N/2的元素(因而最多只有一个这种元素)。比如数组3, 3, 4, 2, 4, 4, 2, 4, 4 中间有Majority元素4。而数组3, 3, 4, 2, 4, 4, 2, 4则没有majority元素。需要一个算法,如果majority元素存在的话,就找出来,如果不存在,则给出报告。 下意识解法...原创 2012-08-05 13:33:04 · 558 阅读 · 2 评论 -
连续子序列最大和与乘积问题的分析
问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列。如果所有的整数都是负的,那么连续子序列的最大和是零。 对应的乘积问题则要求同样求出连续子序列中乘积最大的部分。 我们这里针对最大和与最大乘积的问题分别进行讨论。 最大和最简单暴力的解法 ...原创 2012-08-05 16:46:42 · 728 阅读 · 0 评论 -
Java创建线程的细节分析
前言 关于线程创建的问题,可以说是老生常谈了。在刚开始学习Thread的时候基本上都会接触到,用简单的一两句话就可以概括起来。一个是创建类实现Runnable接口,然后将该类的实例作为参数传入到Thread构造函数中。再调用Thread对象的start方法。还有一种是继承Thread类,覆写run方法。然后在该对象实例中调用start方法。那么,这两种方式在什么情况下适用呢?还有,既...原创 2013-06-01 14:36:01 · 125 阅读 · 0 评论 -
Thread interrupt方法解析
初步理解 我们在看一些多线程代码的时候,有的时候会碰到使用interrupt()方法的时候。从字面的意思来理解,应该就是中断当前正在执行的线程。那么,对于一个我们设计的普通线程来说,如果我们在主线程里调用它的interrupt()方法,会不会导致它被中断呢? 比如说我们先写一段如下的代码:import java.util.concurrent.TimeUnit;p...2013-06-02 17:43:02 · 209 阅读 · 0 评论 -
Java thread中对异常的处理策略
前言 想讨论这个话题有一段时间了。记得几年前的时候去面试,有人就问过我一个类似的问题。就是java thread中对于异常的处理情况。由于java thread本身牵涉到并发、锁等相关的问题已经够复杂了。再加上异常处理这些东西,使得它更加特殊。 概括起来,不外乎是三个主要的问题。1. 在java启动的线程里可以抛出异常吗? 2. 在启动的线程里可以捕捉异常吗? 3. 如果可以捕捉异常...原创 2013-06-03 00:08:20 · 743 阅读 · 0 评论 -
java volatile关键字的理解
一个多线程的示例引发的问题在讨论这个关键字之前先看一个多线程的示例代码: public class RaceCondition { private static boolean done; public static void main(final String[] args) throws InterruptedException{ ...原创 2012-09-10 16:18:57 · 123 阅读 · 0 评论 -
producer-consumer问题的分析和讨论
问题描述 在学习多线程编程的时候,我们经常会碰到的一个问题就是producer consumer问题。这个概念在学习操作系统的时候也会常碰到。本身这个问题的描述比较简单。假设我们有两个进程或者线程。他们俩就好比是工厂里一条流水线上的两个车间。其中线程A生产的部件要交给下一个线程B来做进一步的处理。这个时候,线程A就相当于一个生产者,而线程B就相当于一个消费者。在生产者生产了一个部件...原创 2013-06-09 00:18:23 · 513 阅读 · 0 评论 -
读写锁的应用
前言 在前面的一篇文章里,我曾经讨论了volatile修饰变量的使用。当时,经过各种分析和比较,发现在如果只有一个单线程写但是有多个线程读数据的情况下,volatile变量是一个适用的选项。在这部分,我们可以探讨另外一个选项。那就是ReentrantReadWriteLock。应用场景 记得以前在一些社区讨论的时候,就看到有人提出过这么一些让人觉得比较纠结的场景。比如说...原创 2013-06-12 19:39:45 · 1052 阅读 · 1 评论 -
CyclicBarrier的应用
简介 我们在多线程应用的一些设计中会碰到一些问题。比如说利用多个线程去分别计算某个问题的部分结果,然后再将结果存储在某个地方。等所有这些线程都结束之后,我们再将这些线程产生的结果合并起来并得到问题的解。这种方法基于这么一个前提,就是所有这些线程可以并行的执行,他们之间不会有互相的干扰。另外,线程产生的结果不会有冲突。比如说,我们可以给线程一个编号限制,某个线程产生的结果放到某个编号的...2013-06-16 01:03:11 · 138 阅读 · 0 评论 -
java线程池分析和应用
比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程。在实际应用中我们有的时候也会经常听到线程池这个概念。在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较。通常,我们如果手工创建线程,需要定义线程执行对象,它实现的接口。然后再创建一个线程对象,将我们定义好的对象执行部分装载到线程中。对于线程的创建、结束和结果的获取都需要我们来考虑。如果我们需要用到很多的线程时,...原创 2013-06-16 21:58:42 · 142 阅读 · 0 评论 -
Cancel, Reject tasks in ThreadPool
简介 在前面的文章中我们讨论过提交task到线程池中间执行。那里主要是考虑任务提交后一切都正常执行的情况。但是,如果在某些情况下如果我们想要取消或者拒绝task的提交和执行。则需要用到一些其他的特性。Cancel Task Cancel task在线程池里有比较方便的支持。我们提交task的时候,一般会期待线程池的执行返回Future<T>类型的结果。在执行...2013-06-23 11:43:18 · 228 阅读 · 0 评论 -
java collections集合类总结:概述
简介 在java的包java.util和java.util.concurrent里面定义了java的集合类框架。我们大部分日常使用到的数据结构都可以在这里找到一个对应的实现。在以往的学习过程中可能会接触过一些具体的结构。但是对于java集合类框架来说,他里面包含有哪些类别的结构呢?对于不同的结构,他们分别适用于哪些应用场景?集合类框架中这些类之间是否有着某种关系呢?在这里,我们尝试对...原创 2013-06-29 17:59:24 · 261 阅读 · 0 评论 -
几种企业应用集成方式的比较
前言 我们做过的大部分系统其实并不是自己从头开始设计和实现的,很多时候是基于现有的基础再做扩展或者和现有的系统集成。尤其是很多企业应用的系统,因为我们定义的很多子系统是为了解决某个特定的问题或者问题域,在后续随着业务的发展和变化对于系统也会有更多的集成要求。于是,集成主要有哪几种方式?他们各有什么特点呢?这些问题就一一的浮现出来。这里主要针对一些原来个人项目中接触过的问题,结合一些...原创 2013-07-03 11:38:23 · 2966 阅读 · 1 评论 -
java读取properties文件方法和对比
简介 我们在做一些Java应用开发的时候,会将很多环境特定的变量定义到一个配置文件中。比较常见的定义文件有xml, properties,甚至txt等格式的。在Java里有一个类似于标准配置格式的文件,就是.properties类型的文件。它主要用来存储一些名值对的内容,里面的内容都存成如propertyname=propertyvalue这种样式。读取properties文件的方法有...2013-07-04 13:19:34 · 390 阅读 · 0 评论 -
activemq的几种基本通信方式总结
简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择。这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨。activemq是JMS消息通信规范的一个实现。总的来说,消息规范里面定义最常见的几种消息通信模式主要有发布-订阅、点对点这两种。另外,通过结合这些模式的具体应用,我们在处理某些应用场景的时候也衍生...原创 2013-07-07 14:42:51 · 1217 阅读 · 0 评论 -
java I/O总结
简介 我们常和io打交道,这个类族里面牵涉到的类很多,经常让人觉得比较迷茫。在使用的时候也不容易找到合适的类来完成自己的任务。这里结合前面一篇讨论java io和设计模式相关的文章针对java io里几个主要io类型的类做了一个总结。通过对类的结构和关系的理顺,我们可以更好的使用现有io相关的类,在以后有必要的时候也可以去定制自己所需要的功能。总体说明 在详细讨论每个...原创 2013-07-15 11:30:36 · 117 阅读 · 0 评论 -
java HttpClient学习总结:基本http操作
简介 最近在做一些开放接口应用的时候发现原有的一些应用大量使用了HttpComponent里面的功能。从HttpComponent本身的介绍来说,它是一个实现Http协议很多操作功能的组件,在一些爬虫和网络应用开发中都得到大量的应用。因为牵涉到的开放服务接口使用的是http rest服务,感觉httpcomponent很适合其中的场景。这里结合项目中使用的一些场景来对其中的功能做一...原创 2013-07-15 22:07:30 · 547 阅读 · 0 评论 -
Java threadpool机制深入分析
简介 在前面的一篇文章里我对java threadpool的几种基本应用方法做了个总结。Java的线程池针对不同应用的场景,主要有固定长度类型、可变长度类型以及定时执行等几种。针对这几种类型的创建,java中有一个专门的Executors类提供了一系列的方法封装了具体的实现。这些功能和用途不一样的线程池主要依赖于ThreadPoolExecutor,ScheduledThreadPo...原创 2013-07-22 16:15:29 · 446 阅读 · 0 评论 -
Decorator Pattern和Java IO
Decorator之前在Java程序中,我们常会在IO的时候用到类似于如下的代码: InputStream in = new BufferedInputStream( new FileInputStream("test.txt")); 从代码本身的直观意义来说,这部分代码很好理解。1.使用FileInputStream打...原创 2012-05-05 23:00:03 · 204 阅读 · 0 评论 -
对java annotation的理解
前言 我们在一些程序中经常会看到annotation,虽然平时自己定义和使用的机会不是很多。这些annotation看起来有点奇怪,我们在一些类、方法、成员变量等声明的地方加上了这么一个标记,实际上我们运行的程序里这些被标记的部分并没有出现什么特殊的改变。这些annotation到底是用在哪些地方呢?它有什么用呢?这里我们将对这几个方面做一个讨论。初识annotation ...原创 2013-07-28 15:15:22 · 142 阅读 · 0 评论 -
java fork-join框架应用和分析
问题来源 记得很早以前自己学习算法的时候,听说过一种divide and conquer的策略,从某种角度来说,它和递归是有着很紧密的联系。比如说我们经常想到的一些排序的算法像快速排序、归并排序等,他们都是本质上将原有的问题集合拆分成两个子问题,然后再针对这些子问题进行进一步的处理,直到子问题已经得到解决。在这些子问题解决后上面的部分再将这些问题合并起来就得到了我们想要的答案。这个问...原创 2013-08-11 23:27:35 · 256 阅读 · 0 评论 -
Java TCP/UDP socket 编程流程总结
最近正好学习了一点用java socket编程的东西。感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下。Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。就像通过一个文件的file handler就可以都写数据到存储设备上一样。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是...原创 2012-06-09 20:58:03 · 753 阅读 · 0 评论 -
Composite pattern和树
一切从,那一段代码开始的 开始我们考虑这样一个问题,就是假定我们要写一个方法来遍历一个目录里所有的文件。因为目录里面可能还含有子目录,我们可能就需要用到循环,递归等这样的思路。一个典型的思路如下:1. 首先列出该文件夹里所有内容。2. 遍历里面所有的元素,如果该元素为纯文件,则显示文件名;否则,则递归调用该函数。按照以上的思路,可以写出如下的一段简单的代码: voi...原创 2012-06-10 01:07:52 · 125 阅读 · 0 评论 -
ServiceLoader和DriverManager使用总结
前言 这篇文章不是专门讲ServiceLoader的用法,这篇文章也不仅是讲DriverManager的用法。他们两个一个是java.util包里面的类,另外一个在jdbc里面应用的很多。从表面上看起来他们之间似乎没有多少的联系。实际上DriverManager对ServiceLoader的使用可以达到一种巧妙的效果。在这里我想探讨一下DriverManager使用到的一种设计思路以...原创 2013-08-18 16:12:35 · 359 阅读 · 0 评论 -
spring学习:AOP的概念和应用
简介 在spring的编程和应用中,有一个很重要的 概念就是面向切面编程(aspect oriented programming) 。它使得我们将一些和业务逻辑不相关但是和应用逻辑又有紧密联系的东西给分离出来了。这么说来稍微显得有点抽象。在文章中会详细解释这个概念以及它们的详细应用。 aop的概念引入 为什么在前面我提到分离出业务逻辑和应用逻辑呢?用一个具体的示例来...原创 2015-05-30 20:45:06 · 143 阅读 · 0 评论 -
一种maven改造快速支持servlet3.1web工程的方法
问题的引出 平时在工作中大量的开发都依赖于工具maven,而且这个工具总的来说功能还是非常强大的。由于在最近的一些web开发中要用到最新的servlet3.1以及最新的web container tomcat 8,于是想利用maven原生的archetype类型来构建项目。可惜尝试使用默认的类型之后发现它并不提供最新版本的支持。而如果要将原来的工程改造成支持servlet 3.1 w...原创 2015-06-22 16:26:15 · 334 阅读 · 0 评论 -
HashMap与HashTable的对比分析
前言 前一段时间分析java collection中间一些数据结构代码的时候,单独把HashMap的实现做了一个分析(见链接)。以前看到很多人讨论问题的时候,会把HashMap和HashTable放在一起对比和分析。最开始的时候觉得他们两者的差别很小,网上也有很多浅显的解答。后来结合一些细节分析的时候,发现他们也存在许多细节上的差异,有的也许是针对不同应用的考量,有的也许是由于历史原...原创 2013-08-31 23:53:48 · 131 阅读 · 0 评论 -
java concurrency: ConcurrentHashMap
引言 以前有几次碰到过一个有意思的多线程问题,当时的场景看起来比较简单。有两个线程,他们都需要写数据到统一的一个数据结构里,因为这两个线程是相互独立的,在他们执行的过程中我们将每个线程的一组名值对输出。当时觉得这不过是一个很简单的问题,我们可以用一个HashTable或者HashMap就可以了。我们可以保证两个线程访问数据的key是不同的,看起来应该不会存在多线程访问的冲突。实际运行...原创 2013-09-04 22:44:07 · 381 阅读 · 0 评论 -
composition over inheritance及实例分析
前言 相信学过一些OO的人都对几个基本的面向对象设计原则印象深刻,比如面向抽象、liskov、开闭原则等。这里重点讨论一下composition over inheritance的思想和jdk本身设计中的几个反例。希望通过这些分析能够有一个更深刻的理解而不至于浮于表面。概念及对比 关于composition以及inheritance的概念其实再简单不过了。我们在创建的某个...2013-09-08 23:22:10 · 816 阅读 · 0 评论 -
chain of responsibility模式一:理解
引子 假定我们设想某一个场景,在一个工厂里我们需要经过一系列的工序要生产加工产品。这些生产工序在工厂中我们一般称之为流水线。这些流水线有一个比较有意思的特性,就是每一个步骤是针对生产过程中某一个方面起作用,比如对产品的锻造、抛光,包装等。同时他们所进行的所有行为都是围绕着同一个产品,有严格的顺序要求。做完某一步之后就接着到下一步。模式的基本概念 前面的工厂流...原创 2012-10-07 01:29:29 · 161 阅读 · 0 评论 -
java exception辨析和使用
前言 学java一段时间的时候,感觉exception这个概念看起来很简单,在实际中使用的时候却常不知道该如何取舍。尤其是关于exception的各种分类,以及checked exception, unchecked exception等,哪些是应该处理,该如何处理,哪些则不必要处理呢?各种exception,傻傻分不清。这里结合自己的一些理解,一并做一个讨论。Exception...原创 2013-09-14 22:37:42 · 256 阅读 · 0 评论 -
从optional/named arguments所想到的
前言 有的时候我们学习某一种语言的时候,会禁不住和其他一些自己熟悉的语言针对某些特性做一番比较。不同的语言带来的特性在某些更深的层次有它的设计思想。在解决一些问题的时候也带来一种独特的思路。这里从python的optional arguments特性开始引申讨论在java中对象创建扩展中一系列的问题和解决思路。这些解决的方法里揉和了一些设计模式的套路。到最后,针对这些实现来重新思考设...原创 2013-09-16 23:53:12 · 192 阅读 · 0 评论 -
immutable解读
前言 我们很多人在接触到immutable这个概念的时候,应该是在学习到String这个部分。书上会反复提到,String是immutable的,所以对于它的使用要特别注意了等等。除了String的实现是immutable的,还有很多其他java类库里的class也实现了同样的特性。那么, immutable是基于一个什么样的设计思路呢?为什么要折腾出这么一个玩意来?它有什么好处呢?...原创 2013-09-22 23:22:47 · 303 阅读 · 0 评论 -
spring学习: spring mvc基础
前言: 接触spring mvc的时间并不算长。在用这个web框架之前曾经接触过django, flask, asp.net mvc, play等框架。它们都是基于mvc模式的web框架,在基于model, view, controller互相分离和松耦合的约定基础上,它们的实现细节和一些使用方式有不少差别。这里结合mvc模式来分析一下spring mvc里对请求处理的流程。并结合讨...原创 2015-08-23 20:50:06 · 140 阅读 · 0 评论