Java
文章平均质量分 50
czjuttsw
Learning, staying up to date, and working on the latest and greatest in languages and APIs is what keeps me excited.
展开
-
受检异常和非受检异常
RuntimeException和它的子类以及Error和它的子类都是非受检异常。 因此,对于一个方法抛出RuntimeException和它的子类或者Error和它的子类。调用它无需进行异常处理,编译器能通过。 除此之外的其它异常类都需要进行异常处理,即添加try-catch(-finally)语句块进行捕捉和处理。原创 2013-01-20 20:09:58 · 4966 阅读 · 1 评论 -
Executor内部如何创建线程?
对于Thread,它既是工作单元(含有run方法),也是执行机制(start方法)。而executor framework将两者解耦,实现了工作单元和执行机制的分离。executor负责执行任务,runnable和callable代表业务逻辑单元(前者无返回值,后者有返回值)。使用executor framework,我们无须再手动创建Thread,因为executor framework有一个专原创 2013-02-18 09:29:16 · 2423 阅读 · 1 评论 -
Executor 生命周期
对于生命周期,我想我们已经听得够多了。比如Android的Activity生命周期(onCreate->onStart->onResume...),比如Servlet容器中的Servlet生命周期(init->service->destroy)。了解一个对象的生命周期,会加深你对该对象所属框架的认识。因此,要想掌握某个对象,了解它的生命周期是必要的。对于executor framework原创 2013-02-18 14:29:31 · 4159 阅读 · 0 评论 -
在Eclipse外使用JUnit测试
Eclipse IDE 集成了JUnit开源单元测试框架。如果不借助Eclipse的图形界面工具来生成并运行我们的JUnit测试,该怎么实现呢?1. 首先需要在类路径下添加JUnit-4.X jar 包。2. 编写需要测试的方法。public class Calculator { private Calculator(){} public static int a原创 2013-02-18 21:16:53 · 1081 阅读 · 0 评论 -
Java中的NaN和Infinity
声明并初始化一个变量i,使得以下语句块为无限循环: while(i != i) { }首先我们要知道==是否满足自反性,如果满足,那么该题无解。事实上==只满足对称性,不满足自反性,一个反例是NaNNaN是Not a Number的缩写,即不是一个数字。它不等于任何浮点数,包括自己。我们可以得到这样一个等式:NaN != NaN那么如何得到一个Na原创 2013-03-04 17:17:20 · 7365 阅读 · 0 评论 -
非阻塞的Socket
编写过socket的程序员都知道ServerSocket的accept()是阻塞的。所谓阻塞,在代码中的体现就是该语句不会返回,直到有新连接到来。但是阻塞模式会影响到服务器的可伸缩性,在JDK1.4中增加的nio包对io进行了扩充,提供了非阻塞的模式。下面模拟一个服务器和客户端交互的例子。服务器端采用非阻塞的socket:package org.snake.channels;impor原创 2013-02-20 21:25:59 · 1016 阅读 · 0 评论 -
Selector的使用
在JDK1.4版本增加的nio包以及其子包中有几个比较重要的基本概念,分别是缓冲器(Buffer),通道(Channel)还有选择器(Selector)。选择器允许一个线程处理多个通道,因而提高了系统的可 伸缩性以及灵活性。不同的通道(比如SocketChannel,ServerSocketChannel)可以注册到同一个选择器中,然后赋予感兴趣的事件(总共4个:读(read),写(write原创 2013-02-21 15:07:22 · 1088 阅读 · 0 评论 -
Java中唯一一个重载过的操作符+
考虑下面一段代码:while( i != i + 0) {}如何声明并初始化变量i,使得该段代码循环下去?(不能使用NaN)答案是将i声明为String类型的。i = "hi";这时+号不是一个加法,而是一个字符串连接符。i = i + 0; // i = "hi0"因为"hi" 肯定不等于 "hi0",所以会一直循环下去。原创 2013-03-05 22:04:44 · 2509 阅读 · 0 评论 -
使用new io 的socket
服务器端(非阻塞):package org.snake.socket;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketC原创 2013-02-22 21:36:21 · 1119 阅读 · 0 评论 -
枚举int模式
在枚举类型(enum)还没有引入的时候,也就是在JDK1.5以前,表示枚举类型的常用模式是声明一组具名的int常量。下面是一个具体的例子,该类表示一段文本(text),该文本具有一些样式,比如加粗,加删除线,加下划线等。public class Text { //位域枚举常量 public static final int STYLE_BOLD = 1 << 0; /原创 2013-03-06 22:46:20 · 2378 阅读 · 0 评论 -
Annotation的应用场合
annotation一般作为一种辅助途径,应用在软件框架或工具中,在这些工具类中根据不同的 annontation注解信息采取不同的处理过程或改变相应程序元素(类、方法及成员变量等)的行为。 例如:Junit、Struts、Spring等流行工具框架中均广泛使用了annontion。使代码的灵活性大提高。下面自定义一个简单的注解和工具类来演示。Auth原创 2013-02-19 15:05:12 · 1268 阅读 · 0 评论 -
使用Lock实现互斥(synchronized的一个替代)
传说有一本江湖罕见的武功秘籍,该书珍藏在主持大师手中。一天大师盛情邀请江湖好汉前来观摩该书,但是一次只能有一个人来看。该怎么办呢?用synchronized来实现吗?都用臭了,算了。用下李狗(Doug Lea)写的Lock吧。实现很简单,首先获得一个锁实例 Lock lock = new ReentrantLock();接着获得一把锁:lock.lock();观摩该书中。。原创 2013-02-17 15:20:22 · 2353 阅读 · 1 评论 -
Java 同步方法(块)步骤
一个线程执行临界区代码过程如下:1 获得同步锁2 清空工作内存3 从主存拷贝变量副本到工作内存4 对这些变量计算5 将变量从工作内存写回到主存6 释放锁可见,synchronized既保证了多线程的并发有序性,又保证了多线程的内存可见性。原创 2013-01-22 12:23:02 · 987 阅读 · 0 评论 -
一个简单的生产者/消费者例子
import java.util.ArrayList;import java.util.List;class Plate { private List apples = new ArrayList(); public synchronized void putApple(Object apple) { if(apples.size() > 0) { try { wa原创 2013-01-22 12:39:20 · 2075 阅读 · 0 评论 -
~按位取反
int a = 0;int b = ~a;System.out.println(b); // -1计算方法:因为整形是32位有符号补码整数表示的。因此将整形转换为二进制后为:a 十进制 0二进制 0000 0000 0000 0000 0000 0000 0000 0000~a的二进制 1111 1111 1111 1111 1111 1111 1原创 2013-02-06 20:26:18 · 1640 阅读 · 0 评论 -
BitSet的一个简单应用
下面的例子是计算出字符串数组中哪些是双字符串。 public static void main(String[] args) { String[] words = { "I","am","just","a","beginner" }; BitSet mBitSet = new BitSet(); for(int i=0 ; i < words.length ; i++)原创 2013-02-07 21:39:09 · 909 阅读 · 0 评论 -
推荐初中级开发者的书籍 – Java 7 并发手册[电子书]
下载地址:http://download.csdn.net/detail/czjuttsw/5061620《Java 7 并发手册》(《Java 7 Concurrency Cookbook》)这本书里包含了超过60个展示Java多线程编程的实例。这本书里讲解了关于线程的很多主题,从初级到高级,有线程管理,例如创建、中断和监视线程,有通过Java 5的Executor框架来原创 2013-02-13 17:34:33 · 2003 阅读 · 1 评论 -
推荐一款Java 7 并行 指南书 [电子书]
Java 7 Concurrency Cookbookhttp://download.csdn.net/detail/czjuttsw/5061620原创 2013-02-12 14:19:38 · 1320 阅读 · 0 评论 -
一个简单的适配器模式例子
Java的老一辈开发者应该比较熟悉Vector,Stack,Hashtable等集合类。它们的elements()返回一个实现了Enumeration接口的实现类。但是自从出现Iterator以后,就很少再使用Enumeration了。Iterator接口声明了三个方法: hasNext(),next(),remove()方法。而Enumeration只声明了hasMoreElemen原创 2013-02-15 13:12:29 · 3525 阅读 · 0 评论 -
Eclipse调试多线程代码
相信到现在为止,不管是什么编程语言,程序员都使用了IDE,IDE简化了程序员的开发过程。IDE能够管理项目,自动生成代码,自动生成文档,以及调试应用程序。默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线程暂停,而其它线程继续运行,有些情况下,这是我们不想要看到的。比如下面的例子:除第21个线程以外,其余都是Running状态。修改:原创 2013-02-16 13:51:48 · 19593 阅读 · 0 评论 -
考虑使用静态工厂方法代替构造器
在Java中有许多有用的“静态”类,之所以加上引号,是因为该类并未声明成static的(实际上对于外部类而言,只能接受public abstract 和 final这三个关键字)。但是对于程序员来说,该类是静态的,因为该类的内部显示定义了一个private的无参构造器(这样编译器不会自动添加默认的公有无参构造器),所以该类无法在外部进行实例化,事实上也没有必要使用new关键字进行实例化。因为这些类原创 2013-02-17 14:17:08 · 1527 阅读 · 1 评论 -
特创论
有时候,对于一个类来说,跟踪其创建出来的实例个数会非常有用,其典型实现是通过它的构造器递增一个私有静态字段来完成的。public class Creator { public static void main(String[] args) { for(int i = 0; i < 100; i++) Creature creature = new Creature();原创 2013-03-07 14:04:24 · 1789 阅读 · 0 评论 -
保护性拷贝(defensive copy)
何为保护性拷贝?看一个例子:public class Person { private String name; private Date birth; public Person(String name, Date birth) { this.name = name; this.birth = birth; } public Date getBirth() {原创 2013-02-24 17:47:55 · 6756 阅读 · 6 评论 -
复合赋值操作符和简单赋值操作符的区别。
Java Language Specification 规定,复合赋值操作符和简单赋值操作符存在以下等价关系:E1 op= E2 E1 = (T)((E1) op (E2)) 其中 T是E1的类型。 op可以为+,-,*,/,%,^,&,|,>,>>>由于复合赋值操作符会自动进行类型转换,因此下面的语句也就不奇怪了:short x = 0;int i = 123456;x原创 2013-03-08 22:52:39 · 2164 阅读 · 0 评论 -
java.util.Date对象和String之间的转换
Date对象和String之间的转换通常可以借助SimpleDateFormat对象来完成。Date对象转换成String可以使用SimpleDateFormat的format方法完成。String转换成Date对象可以借助SimpleDateFormat的parse方法实现。具体的例子如下:public class Test { static String timeP原创 2013-07-20 21:44:41 · 6890 阅读 · 0 评论 -
Eclipse自动添加版权信息
打开Preferences->Java->Code Style->Code Template->Code->New Java files双击New Java files,并进行修改:保存,新建Test.java文件:可以看到Eclipse为我们自动添加了我们需要的信息。原创 2013-07-20 21:36:34 · 4546 阅读 · 1 评论 -
MapReduce UnitTest
通常情况下,我们需要用小数据集来单元测试我们写好的map函数和reduce函数。而一般我们可以使用Mockito框架来模拟OutputCollector对象(Hadoop版本号小于0.20.0)和Context对象(大于等于0.20.0)。下面是一个简单的WordCount例子:(使用的是新API)在开始之前,需要导入以下包:1.Hadoop安装目录下和lib目录下的所有j原创 2013-07-31 22:23:06 · 1228 阅读 · 0 评论 -
android解析plist文件
plist,即property list,是苹果手机软件开发中经常用到的存储文件格式,其实质就是XML文件,但是它遵循一定的格式。比如包含一些指定的元素,如plist,array,string,key等。苹果提供了解析该类文件的机制,可惜在安卓开发工具中却没有提供。经常遇到的情况是,在开发苹果和安卓手机软件的时候,要统一资源文件,这个时候,我们可以采用GitHub中提供的开源android-pli原创 2013-08-01 11:26:34 · 8972 阅读 · 5 评论 -
Java对象和XML转换
有时候,我们需要把Java对象转换成XML文件。这时可以用JAXB来实现。(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了)假如某个公司有许多部门,每个部门有许多职员,我们可以这样来设计简单的bean对象。@XmlRootElement(name="department")public class Department { private String na原创 2013-08-07 21:03:04 · 2262 阅读 · 0 评论 -
JEECMS用法总结
1.循环打印栏目: [@cms_channel_list] [#list tag_list as c] ${c.name} [/#list] [/@cms_channel_list]说明:${}是freemarker的语法。${c.url}代表栏目链接,${c.path}代表栏目路径名,${c.name}代表栏目名称2.原创 2013-08-30 13:48:55 · 3573 阅读 · 0 评论 -
Java获取年月日和时分秒
import java.text.SimpleDateFormat;import java.util.Calendar;public class CalendarIntroTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); int year =原创 2013-10-20 14:09:18 · 6892 阅读 · 0 评论 -
Java从外部调用类的私有方法
考虑到我们有这样一个奇怪的类:package org.tsw;public class SecretTool { private SecretTool() { } private void myMotto() { System.out.println("I like potato"); } private int calculate(int left,in原创 2013-11-01 15:55:49 · 8561 阅读 · 1 评论 -
Android(Animation): 一直转个不停的齿轮
利用RotateAnimation实现齿轮的无限匀速转动:1. Activity的布局文件:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_w原创 2013-11-28 11:06:49 · 4707 阅读 · 0 评论 -
Android 滚动控件 之 省市区
Android没有自带的类似iPhone的滚动控件还好有人实现了Android版本的滚动控件wheelView.http://android-wheel.googlecode.com/svn/trunk由于项目需要实现一个内容为省市区的滚动控件,几番周折,最终效果如下:源代码在此:原创 2013-07-20 18:28:12 · 2005 阅读 · 0 评论 -
利用GZIPOutputStream压缩文件大小
Address.java:public class Address implements Serializable { private static final long serialVersionUID = 1L; private int code; private String city; private String street; Address() { }原创 2013-06-30 16:00:43 · 5729 阅读 · 0 评论 -
行注释和块注释的嵌套关系
public static void main(String[] args) { // // 单行注释嵌套 /* // 块注释里嵌套单行注释 */ // /* 单行注释里嵌套块注释 */ // 块注释里不能嵌套块注释 }原创 2013-03-09 11:51:54 · 3292 阅读 · 0 评论 -
从Web Service获取JSON格式数据
国家气象局天气预报为我们提供了数据交换格式为JSON的WEB API:http://m.weather.com.cn/data/101210101.html数字代码代表不同的城市和其它城镇,具体对应关系请查阅博客:http://blog.csdn.net/zgyulongfei/article/details/7956118我们可以利用URL和HttpURLConnection(在移动平台原创 2013-02-28 14:21:33 · 10705 阅读 · 0 评论 -
URL的愚弄
看下下面的代码:public class BrowserTest { public static void main(String[] args) { System.out.println("IEExplorer:"); http://www.google.com.hk System.out.println("MAXMIMIZE"); }}这样的代码可以看起来有点奇怪,原创 2013-02-28 09:41:57 · 1433 阅读 · 0 评论 -
每天都进步一点点
Unix文件分隔符是斜杠/Windows文件分隔符是反斜杠\String类的replaceAll的第一个参数是正则表达式。replace有两个重载方法replaceFirst第一个参数也是正则表达式原创 2013-03-15 14:40:12 · 962 阅读 · 0 评论 -
Java通过JNI调用C/C++函数
Java代码:public class JNIHelloWorld { public native void helloWorld(); static { System.loadLibrary("hellojni"); } public static void main(String[] args) { JNIHelloWorld hello = new JNIH原创 2013-04-15 22:55:50 · 1651 阅读 · 0 评论