Vincent Jia 博客

to be a better man, to be a bad man.

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  29 随笔 :: 3 文章 :: 0 评论 :: 0 Trackbacks

2011年12月8日 #

2016年,收获了什么,失去了什么。 
博客没有写作。
国家大事件几多。
posted @ 2017-12-04 16:53 iLinux 阅读(195) | 评论 (0)编辑 收藏

The Collections Framework







The collections framework is a unified architecture for representing and manipulating collections, allowing them to be manipulated independently of the details of their representation. It reduces programming effort while increasing performance. It allows for interoperability among unrelated APIs, reduces effort in designing and learning new APIs, and fosters software reuse. The framework is based on fourteen collection interfaces. It includes implementations of these interfaces, and algorithms to manipulate them.
Overview
  • Overview - An overview of the Collections framework.
API Specification
  • API Reference - An annotated outline of the classes and interfaces comprising the collections framework, with links into the JavaDoc.
Tutorials and Programmer's Guides
  • Tutorial - A tutorial introduction to the collections framework with plenty of programming examples.
API EnhancementsMore Information
  • Design FAQ- Answers to frequently asked questions concerning the design of the collections framework.

From: http://docs.oracle.com/javase/6/docs/technotes/guides/collections/index.html
posted @ 2012-07-06 16:15 iLinux 阅读(251) | 评论 (0)编辑 收藏

API Enhancements

posted @ 2012-07-06 16:14 iLinux 阅读(261) | 评论 (0)编辑 收藏

LinkedHashSet是JDK 1.4中引入的新的集合类(LinkedHashMap也是同期引入)。 LinkedHashSet,顾名思义,就是在Hash的实现上添加了Linked的支持。对于LinkedHashSet,在每个节点上通过一个链表串联起来,这样,就可以保证确定的顺序。对于希望有常量复杂度的高效存取性能要求、同时又要求排序的情况下,可以直接使用LinkedHashSet。

它实现了Set接口。存入Set的每个元素必须是唯一的,因为Set不保存重复元素。但是Set接口不保证维护元素的次序(那里面的元素每次顺序如何确定?TODO)。Set与Collection有完全一样的接口Iterable,同时Set继承了Collection。

LinkedHashSet具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的顺序),于是在使用迭代器便利Set时,结果会按元素插入的次序显示。

需求如: 含多个(有重复)元素ArrayList,去除重复。

1, 可以使用如下略显冗余的代码:
 1 public static List removeDuplicateWithOrder(List list) {
 2         Set set = new HashSet();
 3         List newList = new ArrayList();
 4         for (Iterator iter = list.iterator(); iter.hasNext();) {
 5             Object element = iter.next();
 6             if (set.add(element))
 7                 newList.add(element);
 8         }
 9         return newList;
10     }
此方法有滥用set之嫌。

2, 我们也可以使用本文章中提及的LinkedHashSet:
return new ArrayList<T>(new LinkedHashSet<T>(list));
此方法,既利用set去除了重复,又使用linked保持住了原顺序。

3, 貌似apache commons lang中有专门去重复的集合工具。

这儿的链表操作是常量级的,这也是LinkedHashSet/LinkedHashMap比TreeSet/TreeMap性能更高的原因。当然,LinkedHashSet不是thread-safe的,在多线程环境下,需要进行同步包装:
Collections.synchronizedCollection(Collection);
or:
Collections.synchronizedSet(Set);
在使用LinkedHashSet的iterator()方法遍历元素时,如果其他线程有读取操作,也要进行同步,否则,就会抛出同其它fail-fast一样的由于删除或增加操作而引起的CurrentModificationException。


如上两种方法的效率比较,设为TODO,
1, 利用set.add(element)方法,本质是利用其contains()方法判断,而contains()的本质就是遍历。
JDK doc中写道:
More formally, adds the specified element e to this set if the set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false. In combination with the restriction on constructors, this ensures that sets never contain duplicate elements.
2, 测试数据,可以使用数据量:1W,5W,10W,100W。

posted @ 2012-07-06 11:54 iLinux 阅读(6194) | 评论 (0)编辑 收藏

在当前的系统中,大量使用了非泛型模式的Collection、List、Map、HashMap、HashTable。
其关系、区别在于。
posted @ 2012-06-29 17:50 iLinux 阅读(241) | 评论 (0)编辑 收藏

在美国得克萨斯州的一个风雪交加的夜晚,一位名叫克雷斯的年轻人因为汽车“抛锚”被困在郊外。正当他万分焦急的时候,有一位骑马的男子正巧经过这里。见此情景,这位男子二话没说便用马帮助克雷斯把汽车拉到了小镇上。 事后,当感激不尽的克雷斯拿出不菲的美钞对他表示酬谢时,这位男子说:“这不需要回报,但我要你给我一个承诺,当别人有困难的时候,你也要尽力帮助他人。”于是,在后来的日子里,克雷斯主动帮助了许许多多的人,并且每次都没有忘记转述那句同样的话给所有被他帮助的人。 许多年后的一天,克雷斯被突然暴发的洪水困在了一个孤岛上,一位勇敢的少年冒着被洪水吞噬的危险救了他。当他感谢少年的时候,少年竟然也说出了那句克雷斯曾说过无数次的话:“这不需要回报,但我要你给我一个承诺……” 克雷斯的胸中顿时涌起了一股暖暖的激流:“原来,我穿起的这根关于爱的链条,周转了无数的人,最后经过少年还给了我,我一生做的这些好事,全都是为我自己做的!”  当您有幸看到此消息时,请转发给自己的朋友亲人。我相信有更多的人需要我们的帮助, 正义会传染 邪恶也是如此, 为现在的别人做善事也是为了将来的自己。
传递温暖,拒绝冷漠。
  1、如果钱还宽裕,别养二奶,偷偷养几个贫困山区的学生,你心里一定会觉得舒坦;
  2、遇到夜里摆地摊的,能买就多买一些,别还价,东西都不贵。家境哪怕好一点,谁会大冷天夜里摆地摊;
    遇到学生出来勤工俭学的,特别是中学生、小姑娘,她卖什么你就买点。如果她不是家庭困难,出来打工也需要勇气的,鼓励鼓励她吧;   
  3、捡到钱包就找找失主。如果你实在缺钱就把现金留下,打电话告诉失主就说你在厕所里捡到的。把信用卡、身份证、驾驶执照还给人家,一般别人也不会在乎钱了。把人家的地址记在你的笔记本上,以后发达了去找人家道个歉,把钱还给人家;   
  4、遇到问路的,碰巧你又知道那个地址,就主动告诉一声。别不好意思,没有人笑话你;    
  5、如果丢的垃圾里有碎玻璃、大头针、刀片等,请用胶带把它们缠裹一下,并尽量多缠几层。这样就降低了保洁人员或者捡垃圾者被伤害的概率。他们大都是没有医保的弱势群体,体贴体贴他们吧,好人会有好报的。
  6、遇到迷路的小孩和老头老太,能送回家送回家,不能送回家的送上车、送到派出所也行。替老人或小孩打个电话再走,反正你也不缺那两个电话费;    
  7、雨雪的时候、天冷的傍晚,遇到卖菜的、卖水果的,剩的不多了又不能回家,能全买就全买,不能全买就买一份,反正吃什么也是吃,买下来让人早点回家;   
  8、上车遇到老弱病人、孕妇,让座的时候别动声色,也别大张旗鼓。站起来用身体挡住其他人,留出空位子给需要的人,然后装作下车走远点。人太多实在走不远,人家向你表示谢意的时候微笑一下;   
  9、不要对有精神信念的人用猥亵言词,要知道中国人缺就缺在没有信仰。这世界什么都在变,什么都不可全信,唯有信念不变、不动、永恒;   
  10、如果您的时间还宽裕,把这几句话转几个群,网上很多人看,转了心里舒坦。
  11、一般情况,看完这段文章而且主动到各个群里转发的人,都还是遗留着传统美德的中国好人
posted @ 2012-06-27 23:08 iLinux 阅读(232) | 评论 (0)编辑 收藏

在文章http://www.blogjava.net/aoxj/archive/2012/06/16/380926.html中,看到案例,++符号并不是原子操作,
posted @ 2012-06-27 23:08 iLinux 阅读(217) | 评论 (0)编辑 收藏

李小龙传奇 - 15 Kick-ass Bruce Lee quotes
http://www.slideshare.net/thepresentationdesigner/15-kickass-bruce-lee-quotes
posted @ 2012-06-25 17:33 iLinux 阅读(211) | 评论 (0)编辑 收藏

OoO
http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2011/08/110803_witn_korea.shtml
http://developer.51cto.com/col/461/
http://www.google.com/search?q=runtimeexception&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a#sclient=psy&hl=en&client=firefox-a&rls=org.mozilla:zh-CN%3Aofficial&source=hp&q=spring3+%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86&pbx=1&oq=spring3+%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86&aq=f&aqi=&aql=&gs_sm=e&gs_upl=316376l316376l4l316608l1l1l0l0l0l0l0l0ll0l0&fp=1&biw=1280&bih=769&bav=on.2,or.r_gc.r_pw.,cf.osb&cad=b
http://www.infoq.com/cn/news/2011/01/git-adventures-1
http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
http://www.linuxeden.com/forum/thread-191912-1-1.html
http://books.slashdot.org/story/04/11/12/2042249/How-Tomcat-Works
http://static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/orm.html#orm-hibernate
http://stackoverflow.com/questions/tagged/spring?sort=faq&pagesize=15
http://xiaolinjava.iteye.com/blog/684292
http://www.donews.com/original/201112/1011333.shtm
http://www.readwriteweb.com/archives/top_10_social_web_products_of_2011.php
http://www.readwriteweb.com/archives/the_10_biggest_web_news_stories_of_2011.php
http://blog.csdn.net/buoll/article/details/1851149
http://www.blogjava.net/masen/articles/118701.html
http://www.baidu.com/s?bs=org.springframework.jdbc.datasource.DriverManagerDataSource&f=8&rsv_bp=1&wd=tomcat+jndi&inputT=2640
http://home.51.com/xiaohei267/diary/item/10048051.html
http://blog.csdn.net/wzl002/article/details/5969635
http://www.baidu.com/s?bs=spring+controller+%D7%AA%B7%A2&f=8&rsv_bp=1&wd=spring+3.0+%B4%EE%BD%A8&inputT=7004
http://book.ifeng.com/lianzai/detail_2010_08/25/2309143_11.shtml
http://www.learnamericanenglishonline.com/
http://bulo.hjenglish.com/app/menu/558/
http://bulo.hjenglish.com/menu/zzk?langs=en
posted @ 2011-12-30 15:46 iLinux 阅读(283) | 评论 (0)编辑 收藏

沃夏克的《自新大陆交响曲》 卡拉扬指挥



posted @ 2011-12-30 03:45 iLinux 阅读(190) | 评论 (0)编辑 收藏

“开-闭”原则 (Open-Closed principle, OCP)

 

一个软件实体应当对扩展开放,对修改关闭。

Software entities should be open for extension, but closed for modification.

在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

 

“可变性的封装原则”从工程的角度讲解了如何实现“开-闭”原则。

   “可变性的封装原则”意味着两点:

1.一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。继承应当被看做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象方法。

2.一种可变性不应当与另一种可变性混合在一起。所有的类图的继承结构一般不会超过两层,不然就意味着将两种不同的可变性混合在一起。

 

“开-闭”原则与其他原则的关系:

 

里氏代换原则是,任何基类可以出现的地方,子类一定可以出现。

里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体体现,所以里氏代换原则是对实现抽象化的具体步骤的规范。违反里氏代换原则的,也违背“开-闭”原则,反之不一定成立。

 

依赖倒转原则是,要依赖于抽象,不要依赖于实现。

“开-闭”原则是目标,依赖倒转原则是手段。

 

合成/聚合复用原则是,要尽量使用合成/聚合,而不是继承关系达到复用的目的。

合成/聚合复用原则与里氏代换原则相辅相成,两者都是实现“开-闭”原则的具体步骤的规范。

 

迪米特法则是,一个软件实体应当与尽可能少的其他实体发生相互作用。

一个遵守迪米特原则设计出来的系统在功能需要扩展时,会相对更容易地做到对修改的关闭。

 

接口隔离原则是,应当为客户端提供尽可能小的单独的接口,而不是提供大的总接口。

接口隔离原则与广义的迪米特法则都是对一个软件实体与其他的软件实体的通信的限制。遵循接口隔离原则,会使一个软件系统在功能扩展的过程当中,不会将修改的压力传递到其他的对象。

 

一个重构方法的讨论

 

“将条件转移语句改写成为多态性”是一条广为流传的代码重构做法。

这一做法本身并不能保证“开-闭”原则,应当以“开-闭”原则判断是否需要改写成多态。条件转移并不是错误,如果需要,完全可以选择使用条件转移。

如果一个条件转移语句确实封装了某种商务逻辑的可变性,那么将此种可变性封装起来就符合“开-闭”原则设计思想了。如果一个条件转移语句没有涉及重要的商务逻辑,或者不会随着时间的变化而变化,也不意味着任何的可扩展性,那么它就没有涉及任何有意义的可变性。这时候将这个条件转移语句改写成多态性就是一种没有意义的浪费。

 

抽象类应当拥有尽可能多的共同代码

 在一个继承的等级结构中,共同的代码应当尽量向等级结构的上方移动。把重复的代码从子类里面移动到超类里面,可以提高代码的复用率。在代码发生改变时,设计师之需要修改一个地方。

 

抽象类应当拥有尽可能少的数据

与代码的移动方向相反,数据的移动方向是从抽象类到具体类,向等级结构的下方移动。一个对象的数据不论是否使用都会占用资源,所以应当放到等级结构的低端。

 

什么时候才应当使用继承复用

1.子类是超类的一个特殊种类,而不是超类的一个角色,Is-A才符合继承关系。

2.永远不会出现需要将子类换成另一个类的子类的情况。

3.子类具有扩展超类的责任,而不是具有置换掉(Override)和注销掉(Nullify)超类的责任。

4.只有在分类学角度上有意义时,才可以使用继承,不要从工具类继承。


转载自:“开-闭”原则 (Open-Closed principle, OCP)
posted @ 2011-12-08 16:51 iLinux 阅读(187) | 评论 (0)编辑 收藏

前段时间系统升级时遭遇了OOM,具体解决过程见 遭遇OutOfMemoryError
为了巩固对于java启动各项参数的认识,决定将所有参数列举出来,并一一解释,以便后查;

java启动参数共分为三类;
其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
本文主要描述标准参数部分,剩下的两个部分将会陆续推出;

标准参数列表如下:
-client 
 设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者PC应用开发和调试。

-server
 设置jvm使server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的jdk环境下将默认启用该模式,而忽略-client参数。

-agentlib:libname[=options] 
 用于装载本地lib包;
 其中libname为本地代理库文件名,默认搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上jvm搜索本地库名为libname.dll的文件,在linux上jvm搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,比如Solaries上就默认搜索LD_LIBRARY_PATH。
 比如:-agentlib:hprof
 用来获取jvm的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中;windows中搜索路径为JRE_HOME/bin/hprof.dll。

-agentpath:pathname[=options] 
 按全路径装载本地库,不再搜索PATH中的路径;其他功能和agentlib相同;更多的信息待续,在后续的JVMTI部分会详述。

-classpath classpath 
-cp classpath
 
 告知jvm搜索目录名、jar文档名、zip文档名,之间用分号;分隔;使用-classpath后jvm将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则jvm使用当前路径(.)作为类搜索路径。
 jvm搜索类的方式和顺序为:Bootstrap,Extension,User。
 Bootstrap中的路径是jvm自带的jar或zip文件,jvm首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到搜索路径。
 Extension是位于JRE_HOME/lib/ext目录下的jar文件,jvm在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty("java.ext.dirs")可得到搜索路径。
 User搜索顺序为当前路径.、CLASSPATH、-classpath,jvm最后搜索这些目录,用System.getProperty("java.class.path")可得到搜索路径。

-Dproperty=value
 设置系统属性名/值对,运行在此jvm之上的应用程序可用System.getProperty("property")得到value的值。
 如果value中有空格,则需要用双引号将该值括起来,如-Dname="space string"。
 该参数通常用于设置系统级全局变量值,如配置文件路径,以便该属性在程序中任何地方都可访问。

-enableassertions[:<package name>"..." | :<class name> ] 
-ea[:<package name>"..." | :<class name> ]
 
 上述参数就用来设置jvm是否启动断言机制(从JDK 1.4开始支持),缺省时jvm关闭断言机制。
 用-ea 可打开断言机制,不加<packagename>和classname时运行所有包和类中的断言,如果希望只运行某些包或类中的断言,可将包名或类名加到-ea之后。例如要启动包com.wombat.fruitbat中的断言,可用命令java -ea:com.wombat.fruitbat...<Main Class>。

-disableassertions[:<package name>"..." | :<class ; ] 
-da[:<package name>"..." | :<class name> ]

 用来设置jvm关闭断言处理,packagename和classname的使用方法和-ea相同,jvm默认就是关闭状态。
 该参数一般用于相同package内某些class不需要断言的场景,比如com.wombat.fruitbat需要断言,但是com.wombat.fruitbat.Brickbat该类不需要,则可以如下运行:
 java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat <Main Class>。
 
-enablesystemassertions 
-esa
 
 激活系统类的断言。
 
-disablesystemassertions 
-dsa
 
 关闭系统类的断言。

-jar 
 指定以jar包的形式执行一个应用程序。
 要这样执行一个应用程序,必须让jar包的manifest文件中声明初始加载的Main-class,当然那Main-class必须有public static void main(String[] args)方法。

-javaagent:jarpath[=options] 
 指定jvm启动时装入java语言设备代理。
 Jarpath文件中的mainfest文件必须有Agent-Class属性。代理类也必须实现公共的静态public static void premain(String agentArgs, Instrumentation inst)方法(和main方法类似)。当jvm初始化时,将按代理类的说明顺序调用premain方法;具体参见java.lang.instrument软件包的描述。

-verbose 
-verbose:class
 
 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
-verbose:gc 
 输出每次GC的相关情况。
-verbose:jni 
 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
 
-version 
 输出java的版本信息,比如jdk版本、vendor、model。
-version:release 
 指定class或者jar运行时需要的jdk版本信息;若指定版本未找到,则以能找到的系统默认jdk版本执行;一般情况下,对于jar文件,可以在manifest文件中指定需要的版本信息,而不是在命令行。
 release中可以指定单个版本,也可以指定一个列表,中间用空格隔开,且支持复杂组合,比如:
 -version:"1.5.0_04 1.5*&1.5.1_02+"
 指定class或者jar需要jdk版本为1.5.0_04或者是1.5系列中比1.5.1_02更高的所有版本。

-showversion 
 输出java版本信息(与-version相同)之后,继续输出java的标准参数列表及其描述。
 
-? 
-help
 
 输出java标准参数列表及其描述。

-X 
 输出非标准的参数列表及其描述。

以上的这些参数我们经常会在很多情况下用到多个的组合,比如我们在用JProfiler进行跟踪监控时,需要在被监控java启动参数中加上如下配置:
-agentlib:jprofilerti=port=8849  -Xbootclasspath/a:/usr/local/jprofiler5/bin/agent.jar
其中就用到两个-agentlib和-X参数,bootclasspath参数的详细信息将会在非标准参数中详细说明。

转自:http://blog.csdn.net/sfdev/article/details/2062042

这篇文章补充说明了-X、-XX参数的说明:Java命令行运行参数说明大全(偷来的)

posted @ 2011-12-08 15:49 iLinux 阅读(5130) | 评论 (0)编辑 收藏

     摘要: 作者:北南南北赞助: eTony,pandonny,懒猫, Arch来自:LinuxSir.Org摘要: 超级用户是系统最高权限的拥有者,是系统管理唯一的胜任者;由于权限的超级并且达到无所不能的地步,如果管理不擅,必会对系统安全造成威胁。 除了尽可能的避免用直接用超级用户root登录系统外,我们还要学会在普通用户下临时切换到超级用户root下完成必要的系统管理工作;从用户管理和...  阅读全文
posted @ 2011-12-08 15:36 iLinux 阅读(1450) | 评论 (0)编辑 收藏

hibernate中,比如B类继承了A类,它们是可以对应同一张表的。
可以参考如下文章Hibernate继承映射一:每个类分层结构一张表

posted @ 2011-12-08 12:50 iLinux 阅读(127) | 评论 (0)编辑 收藏

1 web容器启动,初始化ActionServlet,加载struts-config.xml,根据请求路径和信息找到ActionBean与FormBean

2 确定将要调用的ActionBean与FormBean,将请求中包含的值填充到FormBean中(Action中要准备好ActionMapping的参数)

3 struts将请求分发到相应的的ActionBean处理,ActionMapping参数ActionForm参数request,resposne都做为参数传给处理请求的ActionBean的execute方法

4 Action调用业务逻辑方法,得到返回值ActionForward对象

5 控制控重回ActionServlet,根据Action返回的ActionForward对象,转发到相应的页面

6 处理结果返回浏览器

posted @ 2011-12-08 12:29 iLinux 阅读(98) | 评论 (0)编辑 收藏

UML类图中的关联、聚合、组合

posted @ 2011-12-08 12:25 iLinux 阅读(97) | 评论 (0)编辑 收藏

nio:  http://jiayanjujyj.iteye.com/blog/1044364



posted @ 2011-12-08 00:14 iLinux 阅读(810) | 评论 (0)编辑 收藏