08 2013 档案
摘要:通常,在我们实现多线程使用的计数器或随机数生成器时,会使用锁来保护共享变量。这样做的弊端是如果锁竞争的太厉害,会损害吞吐量,因为竞争的同步非常昂贵。volatile 变量虽然可以使用比同步更低的成本存储共享变量,但它只可以保证其他线程能够立即看到对 volatile 变量的写入,无法保证读 - 修改 - 写的原子性。因此,volatile 变量无法用来实现正确的计数器和随机数生成器。从 JDK 5 开始,java.util.concurrent.atomic包中引入了原子变量,包括 AtomicInteger、AtomicLong、AtomicBoolean 以及数组 AtomicInterg
阅读全文
摘要:java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。
阅读全文
摘要:类型兼容原则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容原则中所指的替代包含以下情况。(1)派生类的对象可以隐含转换为基类对象。(2)派生类的对象可以初始化基类的对象。(3)派生类的指针可以隐含转换为基类的指针。在替代后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
阅读全文
摘要:CopyOnWriteArrayList,因何而存在?ArrayList的一个线程安全的变体,其所有可变操作(add、set等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。CopyOnWriteArrayList,是因”并发”而生。CopyOnWriteArrayList,改了其中的某对象的某个值,【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。 // 删除/修改元素 for(String item : list){ list.remove(item); }解决办法一:使用迭代器,一边遍历,一边删除,不会报错。// 删除/修改元素Iterator ...
阅读全文
摘要:java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包。
阅读全文
摘要:==================项目应用==================提取纯文本:Pattern stripTagPattern = Pattern.compile("(?:[\\s\\S]*?)|(?:)|(?:)|(?:)|(?:]*?>)", Pattern.CASE_INSENSITIVE);提取网页链接:Pattern linkPattern = Pattern.compile("(?:href|src|url)\\s*=\\s*['\"]?([^'\">]+)?(['\"]?[
阅读全文
摘要:字节流与字符流先来看一下流的概念:在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。字节流与字符流在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)java中提供了专用于输入输出功能的包Java.io,
阅读全文
摘要:JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成。JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit)。JDK包含的基本组件包括: &
阅读全文
摘要:Apache HttpComponents Client 4.0已经发布多时,httpclient项目从commons子项目挪到了HttpComponents子项目下,httpclient3.1和 httpcilent4.0无法做到代码向后兼容,升级比较麻烦。我在做项目之余找时间研究了一下,写了一套3.1与4.0对比的代码,不求面面俱到,但 求简单易懂。如果代码用到真实项目中,还需要考虑诸如代理、Header、异常处理之类的问题。Http POST方法得到www.g.cn的源码:view plaincopy to clipboardprint?importjava.io.IOException
阅读全文
摘要:HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。一个最简单的调用如下:import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.clie
阅读全文
摘要:如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码。然而,Eclipse工 作空间(workspace)的缺省字符编码是操作系统缺省的编码,简体中文操作系统 (Windows XP、Windows 2000简体中文)的缺省编码是GB18030,在此工作空间中建立的工程编码是GB18030,工程中建立的java文件也是GB18030。如果要使 新建立工程、java文件直接使UTF-8则需要做以下工作:1、windows->Preferences...打开"首选项"对话框,左侧导航树,导航到 general-&g
阅读全文
摘要:Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写完成后,通过Javadoc就可以同时形成程序的开发文档了。用于注释Java中有三种注释方法:javadoc1. //被注释语句2. /*被注释语句*/3. /**被注释语句*/其中第三种专为JavaDoc设计,可以被JDK内置的JavaDoc工具支持和处理。关键词列表@author 作者名@version 版本标识@parameter 参数及其意义@since 最早使用该方法/类/接口的JDK版本@return 返回
阅读全文
摘要:importjava.util.regex.*;importjava.io.*;classL{publicstaticvoidmain(String[]args)throwsException{getMail();}publicstaticvoidgetMail()throwsException{BufferedReaderbufr=newBufferedReader(newFileReader("m.txt"));Stringline=null;Stringreg="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
阅读全文
摘要:程序中解释:异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调用使用另一个线程执行请求,而与此同时原始的线程继续处理。同步调用则在继续之前必须等待响应或返回值。如果不允许调用继续即无响应或返回值,就说调用被阻塞了,不能继续执行形象解释:打电话时就是同步,发短信时就是异步。同步.一条马路,只能开一辆车,等这个车开走了,才能开另一辆.异步.一条马路,随便开多少车.同步,主机A发送数据的时候,主机B必须等待接收,处于阻塞状态,这就好比别人给你打电话,你必须当场听话,否则则【错失良机】异步主机A发送数据的时候,主机B无须等待接收,主机B要获得数据就从缓存里取,就好比别人给你发邮件一样同步
阅读全文
摘要:引言毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的效果。单元测试正是验证代码行为是否满足预期的有效手段之一。但不可否认,做测试是件很枯燥无趣的事情,而一遍又一遍的测试则更是让人生畏的工作。幸运的是,单元测试工具 JUnit 使这一切变得简单艺术起来。JUnit 是 Java 社区中知名度最高的单元测试工具。它诞生于 1997 年,由 Erich Gamma 和 Kent Beck 共同开发完成。其中 Erich Gamma 是经典著作《设计模式:可复用面向对象软件的基础》一书的作者之一,并在 Eclipse 中有很大的贡献;Kent B
阅读全文
摘要:1.Java 序列化允许随着时间的推移而改变类型。http://www.ibm.com/developerworks/cn/java/j-5things1/大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个Hashtable中,然后将这个Hashtable序列化到磁盘,以便持久化。当用户更改设置时,便重新将Hashtable写到磁盘。这是一个优雅的、开放式的设置系统,但是,当团队决定从Hashtable迁移到 Java Collections 库中的HashMap时,这个系统便面临崩溃。Hashtable和HashMap在磁盘上的格式是不相同、不兼容的。除非对每个
阅读全文
摘要:1.ThreadLocal并不是一个Thread,而是Thread的局部变量.2.当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。3.ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。代码清单1SimpleThreadLocalpublicclassSimpleThreadLocal{privateMapva
阅读全文
摘要:1.private是访问权限限定,static表示不要实例化就可以使用。 (1)被static修饰的变量,叫静态变量或类变量,没有被static修饰的变量,叫实例变量。对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。(2)静态方法可以直接通过类名调用,任何的实例也都可以调用。静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实
阅读全文
摘要:1.http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/index.html?ca=drs-#major22.http://sourceforge.net/projects/htmlparser/files/latest/download?source=files3.Erich Gamma 是经典著作《设计模式:可复用面向对象软件的基础》一书的作者之一4.智能社(javascript教学)5.妙味课堂6.懒人图库7.源代码下载|站长下载
阅读全文
摘要:本教程,结合本人亲身实践,不仅适合于最新版本Heritrix 1.14.4,更适合其他任何版本。Heritrix具体下载地址如下:http://sourceforge.net/projects/archive-crawler/files/archive-crawler%20%28heritrix%201.x%29/ 本实例所用的为Heritrix1.14.4的源代码版本,即你只需下载一个文件即可:heritrix-1.14.4-src.zip。 之所以采用源代码版本,是因为本实例中,需要对Heritrix 进行一些扩展,以适应本实例的需求。网上教程多是下载两个文件heritrix-1.14..
阅读全文
摘要:1. 【ALT+/】 此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类、方法和属性的名字时,多体验一下【ALT+/】快捷键带来的好处吧。 2. 【Ctrl+O】 显示类中方法和属性的大纲,能快速定位类的方法和属性,在查找Bug时非常有用。 3. 【Ctrl+/】 快速添加注释,能为光标所在行或所选定行快速添加注释或取消注释,在调试的时候可能总会需要注释一些东西或取消注释,现在好了,不需要每行进行重复的注释。 4. 【Ctrl+D】 删除当前行,这也是笔者的最爱之一,不用为删除一行而按那么多次的删除键。 5. ...
阅读全文
摘要:位运算符 与(&)、非(~)、或(|)、异或(^)&:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110~:0变1,1变0^:两边的位不同时,结果为1,否则为0.如1100^1010=0110逻辑运算符与(&&)、非(!)、或(||)
阅读全文
摘要:Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。集合表示和元素查询下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位
阅读全文
摘要:在许多计算机编程语言(例如:C语言、C++语言、Java语言、JavaScript语言,Pascal语言等)中,“> 2的值。答:表达式8 >> 2的值为2,因为8(即二进制的00001000)向右移两位等于2(即二进制的00000010)。
阅读全文