Danny's profile季节的水滴PhotosBlogListsMore ![]() | Help |
|
|
8/17/2009 jstack 堆栈跟踪jstack命令行工具连接到指定的进程或核心文件,并打印所有连接到虚拟机的线程的堆栈跟踪信息,包括Java 线程和VM 内部线程,有时也包括本地堆栈框架。该工具还执行死锁检测。
用法:jstack [option] pid
参数(Options):
Reference: http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html 9/23/2008 java中如何让一个方法返回多个对象 以前一直以为java中没有这个功能,所以对于返回多个对象的方法,我以前都是用一个String或者StringBuffer来处理;调用这个方法后还要再把这个String或者StringBuffer做拆分处理--麻烦啊! 看到java泛型才知道原来java里面有元组(tuple)这个东西,可以实现仅一次方法调用就能返回多个对象;其实没什么深奥的就是一个容器而已。具体请参考《Think in java》第四版中的第15章(15.2.1 一个元组类库)。具体和C#中的out有何异同,还没有具体研究,知道的朋友可以发贴子说明一下,让偶也学习学习,嘿嘿...... 6/12/2008 迪杰斯特拉(dijkstra)算法 Java实现这个算法常见于交通咨询系统中(比如:导航软件和电子地图)路径的查询。
求单源最短路径的经典算法,算法基于这样一种思想:
1 将顶点集V分成 S(开始只包含源点, S包含的点都是已经计算出最短路径的点) 和 V-S 集合(V-S 包含那些未确定最短路径的点) 2. 从V-S中选取这样一个顶点w: 满足经过S集合中任意顶点 v到w 的路径最短, 即 满足( 源到v的路径 + v到w的路径) 最小的那个w. 其中v 属于S, w属于S-V。将w 加入S, 并从V-S中移除w. 3. 如此反复,直到V-S变空集为止。 归纳基点: 1.比如开始 S中只有原点s, 那我们从V-S中选取离s最近的点w, 则s直接到w的路径一定最短。因为如果存在另一个点w2, 使得 s->w2->w 的路径比s 直接到w短,那么s->w2 一定 小于s->w, 那么 w就不是离s最近的点,与我们选取的w离s最近这个先前条件矛盾。所以在最开始,选出来的那个点 w 一定确定了最短路径,即s->w 的边长。 w已经确定,将w加入S. 2. 此时S中有 v1,v2....vk 顶点,V-S中剩下 w1,w2.....Wn-k 顶点。我们此时当然选择离S集合最近的点w. w必然满足 D[w]= Min(D[v]+D[v to w]) 其中 D[x] 表示从原点到x的最短路径长。 这个w 此时一定取得了最短路径D[w], 因为如果有其他的路径,假设是 S集合某路径->Wi->w, 那么就应当去选取Wi 做为该点而不是w. 因为 S集合某路径长D[v] + D[v to Wi] < D[v]+D[v to w] 与 w满足的公式矛盾。 因此w必然是最小的。将w加入S集合。 采用邻接表存储图 1 /* 2 * 邻接边 3 * */ 4 public class Edge { 5 public Vertex dest;//目标顶点 6 public double cost;//代价 7 8 public Edge(Vertex d,double c){ 9 dest=d; 10 cost=c; 11 } 12 } 13 顶点类: 1 public class Vertex implements Comparable<Vertex>{ 2 public String name;//顶点名 3 public List<Edge> adj;//邻接表 4 public double dist;// 从原点到该点的最短路径长 5 public Vertex prev;//最短路径前一个节点 6 public int scratch;//算法需要 7 public boolean visited; 8 public Vertex(String nm){ 9 name=nm; 10 adj=new ArrayList<Edge>(); 11 reset(); 12 } 13 public void reset(){ 14 visited=false; 15 dist=Graph.INFINITY; 16 prev=null; 17 scratch=0; 18 } 19 @Override 20 public int compareTo(Vertex o) { 21 double c=o.dist; 22 return dist<c?-1:dist>c?1:0; 23 } 24 } 25 1 /* 2 * 迪杰斯特拉算法. 3 * 4 * 使用优先级队列来存储V-S集合,这样队首的元素就是要选取加入S的元素。 5 * 6 * 每加入S一个元素,就用它去更新可更新的V-S中的元素。 7 * 8 * */ 9 public void dijkstraSlow(String startName){ 10 PriorityQueue<Vertex> pq=new PriorityQueue<Vertex>(); 11 Vertex start=vertexMap.get(startName); 12 if(start==null) 13 throw new IllegalArgumentException("Hey fk,start vertex is illegal!"); 14 clearAll(); 15 //pq.add(start); 16 start.dist=0; 17 //构造V-S集合,将顶点全部装入优先级队列(V-S集合). 18 //优先级队列的队首元素即离原点最近的,因为Vertex对象的比较器是 19 //根据Vertex对象到原点的距离来比较的。 20 //其实这里可以进一步优化的,由于开始选中加入S的必定是原点, 21 //且只有刚加入S的顶点的邻接顶点才有可能是新的加入S的顶点, 22 //所以开始只要把原点放入vertexMap即可,第一次将原点加入S, 23 //然后更新其邻接点到原点的距离.从中选出最小的来加入S。 24 //这里为了保持算法清晰,没有进行优化. 25 for(Vertex v:vertexMap.values()) 26 pq.add(v); 27 28 29 int seenNum=0; 30 while(!pq.isEmpty()&&seenNum<vertexMap.size()){ 31 32 Vertex v=pq.remove();//第一次取的是原点,其余情况自然是到原点最近的点. 33 34 if(v.scratch!=0)//如果v已经加入了S,则跳过 35 continue; 36 37 v.scratch=1;//设置标志位,标志已经加入了S集合. 38 39 seenNum++;//已经确定了多少顶点。 40 41 //利用新加入S的点来更新V-S集合: 42 43 //因为要更新V-S集合中点到原点的路径距离,并从中选取距离最小的点,因此从S集合的点的邻接 44 //点中选取,因为如果不与S的点邻接,就暂时无法更新其距离。而没有更新(即减小路径长)的点不可能被选中. 45 for(Edge e:v.adj){ 46 Vertex w=e.dest; 47 double v_to_w=e.cost; 48 49 if(w.dist>v.dist+v_to_w){ 50 w.dist=v.dist+v_to_w;//更新其D[w]值 51 w.prev=v; 52 //pq.add(w);//加入优先级队列以备选取. 53 54 //利用优先级队列来排序,取出离原点最近的。 55 //队首的元素满足D[w]=Min(D[v]+D[v to w]). 56 //删掉旧值,更新队列, 57 pq.remove(w); 58 pq.add(w); 59 } 60 } 61 } 62 } 6/4/2008 一道java题(for循环是如何工作的)public class Test {
static boolean foo(char c) {
System.out.print(c);
return true;
}
public static void main(String[] argv) {
int i = 0;
for (foo('A'); foo('B') && (i < 2); foo('C')) {
i++;
foo('D');
} } } 10/25/2007 什么是POJOPlain Old Java Object. This acronym is similar to POTS — Plain Old Telephone Service.
译文 POJO - 简单老Java对象 . 这个缩写看起来很像POTS - 简单老电话服务。
7/30/2007 Spring2.0和EJB3.0随谈Spring自从2003年发布以来,一直是Java开源框架的奇迹之一。从2000年开始,伴随着B/S架构逐渐引入企业应用软件开发的领域,Java就逐渐成为企业应用开发的主流技术,一直到2003年,Struts+EJB一直是Java技术架构的不二选择,然而这一切随着2003年Spring以without EJB的面目出现之后,一切都开始改变。 大概从2003年下半年开始,Spring+Hibernate就开始甚嚣尘上,似乎那时候的Spring和Hibernate尚且不足以动摇J2EE规范以EJB为核心的领袖地位。但是2004年5月份,吸收了Spring/Hibernate框架优点的EJB3 JCP委员会的成立,事实上宣判了Spring对EJB2的终结,EJB3则更像是Vendor们的一种自救行为。 2004年到2006这三年时间以来,Spring取得了相当辉煌的成就,不但将EJB2赶进历史,而且牢牢确立了Spring作为Java企业应用开发的主流地位。而今,甚至对技术比较保守的金融电信行业,也开始言必称Spring,Spring已经成为Java框架的事实标准。 在2004年5月份之后,Hibernate Team开始和Spring公然决裂,这个事情放在两年多以后的今天来看,原因是昭然若揭的,背靠JBoss的Hibernate Team已经成为EJB3规范的一部分,而JBoss希望力推的以EJB3为核心的Java架构来成为未来的企业应用主流标准,这种情况演变至今,变成了Springframework和JBoss Seam的两种不同技术架构的竞争关系。 2004年5月份,EJB3规范的起步,对Spring未来其实有很大的威胁,但是EJB3规范历经两年时间的难产,终于在2006年5月正式发布之时,已经为时过晚了,抬眼望去,已尽是spring的天下。 有意思的是,大致展望一下未来,Java的企业应用开发还能遵循Sun和JCP制订的Java EE规范的道路走下去吗?如果不是这样,那么未来道路是什么呢? 观察一下Java社区几股大的势力,会发现一些有意思的现象: IBM和BEA是Java社区的领导者,从2004年开始,IBM和BEA开始大肆宣传SOA,将他们的目光从应用服务器领域挪到了松藕合企业服务领域,开展SOA商业战略。与此同时,EJB3专家委员会的领导者也悄然变成了JBoss和Oracle,是IBM和BEA无力争取吗?当然不是。IBM和BEA已经看到了应用服务器市场和底层框架平台即将被开源占领,商业价值萎缩,因而审时度势进行战略转型。一方面押宝SOA战略,大肆炒热和培育SOA市场,另一方面也积极占领开源市场,IBM放出来WebSphere社区版本-Apache Geronimo,BEA干脆和Spring的咨询公司interface21合作,提供spring框架在WebLogic上的商业技术支持,如今EJB3对于他们来说已经形同鸡肋,就抛给别人嚼吧。 将EJB3当块宝的自然是应用服务器市场的跟随者JBoss和Oracle,一方面凭借ORM的先天优势,另一方面有出头机会也不能放过,EJB3委员会几乎成了JBoss和Oracle的天下。特别是JBoss,更加积极推出JBoss Seam框架,希望确立以JSF+EJB3的架构树立Java开发的标准,用以取代Struts/Spring/Hibernate的流行组合,因而开启了EJB3和Spring 正面交锋的战争。 Java Vendor中另外一股势力Sun公司这两年则一直自顾不暇,在应用服务器领域几乎退出市场,直到最近才搞出来一个Glassfish,在开发框架领域也一直毫无建树,推出的JSF至今还很不成熟,难担大任,也许Sun都去忙着开源Solaris和JVM源代码了。 几个大的Vendor或战略转型,或自顾不暇,或忙于收购(Oracle),Java开发领域的主战场被打扫一空,对决的双方换成了Spring和JBoss。对决的武器则是spring vs Seam。 Spring代表了不遵循通用标准,自己制订游戏规则,不依赖容器的一方;JBoss代表了遵循通用标准,但是锁定容器的一方。这场对决从2004年5月就开始上演,未来很长时间也会继续下去。不过Spring已经站在优势很大的地位上了。 大致对比一下两者:Spring vs EJB3,就会发现Spring从功能上面已经胜出很多了: 1、IoC容器spring胜出 Spring的IoC容器很强大,其bean管理功能超过了目前EJB3容器,配置方面Spring稍微复杂一些。不过对于全局性配置来说,XML要优于EJB3的annotation。 2、AOP能力Spring胜出 EJB3目前提供的AOP功能非常简单,本来已经无法和Spring相比,至于集成AspectJ的Spring2.0,就更加望尘莫及了。 3、事务管理方面EJB3稍微领先 Spring提供了很棒的本地事务模型,也可以集成JTA,但是不支持分布式事务,当然这种场景也非常罕见。 4、Web框架spring胜出 EJB3标准集成JSF,但是JSF并不成熟,和AJAX配合度也不好。Spring可以灵活集成各种Web框架和模板语言,自身也提供了相当强大的MVC框架,要是这还觉得不够,那么spring webflow,portlet support都拿出来。 5、远程访问支持,大致持平 EJB3继承了传统的EJB远程访问能力,Web Services支持也不错;不过Spring提供了更多更灵活的选择,Java RPC,HTTP Invoker,Hessian/Burlap,WebServices。 6、框架集成能力,spring胜出 这是spring的传统优势项目,只要看看spring modules项目,看看n多第三方spring支持,就会发现spring现在的群众基础多么好,集成工作流,spring modules已经提供了方便的模板类,集成规则引擎,Cache,CMS,脚本语言,异步任务,安全验证框架。。。。。。EJB3有点望尘莫及的味道 7、JMS,JMX,JCA等,EJB3领先一步 这些传统EJB优势项目往往应用的不太多,EJB3仍然是领先的。不过令人侧目的是,Spring最近几个版本在连续追赶EJB这些传统优势领域,到Spring2.0为止,其JMS,JMX,JCA支持已经相当不错了,可以说传统EJB能够做的,现在Spring也可以做得到。 这几年除了Spring框架自身不断完善和延伸到传统应用领域,围绕在Spring周围的第三方框架也是越来越丰富,EJB3在annotation方面有些独到的优势,在一些传统领域,还领先spring,但是总体来说,EJB3为核心的J2EE5.0规范很难和Spring现在的2.0相匹敌,更何况Java的主力Vendor早已醉翁之意不在这里了,单凭JBoss的Seam,难以战胜spring。 目前JBoss已经开始在国内进行商业上的推广,也希望以其EJB3技术来和Springframework相抗衡,JBoss目前用来说服客户使用EJB3的理由主要有两点: 1、EJB3是一个标准,由多个厂商提供实现 3/6/2007 两道简单的java题1.用1,2,2,3,4,5,这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234,412345等,要求:“4”不能排第3位,“1”与“5”不能相连。
2.数字a=11,b=4,不用第3个变量怎样把啊a和b的位置互换。 第一题没有搞出来,第二题有以下几种方法:
public class A{
public static void main(String[] args){ int a=11; int b=4; System.out.println("a:"+a+"\nb:"+b); a=a+b; b=a-b; a=a-b; System.out.println("互换后为:"); System.out.println("a:"+a+"\nb:"+b); } } public static void main(String[] args) throws IOException{
int a = 11; int b = 8; a = a^b; b=a^b; a=a^b; System.out.println(a); System.out.println(b); } class B{
public static void main(String args[]) { int a,b; a=10; b=8; System.out.println("交换之前的a与b是:"+a+","+b); b=a+(a=b)*0; //a与b的交换 System.out.println("交换之后的a与b是:"+a+","+b); } class C { public static void main(String[] args) { int a=11; int b=4; a=~a & 0x0f; b=~b & 0x0f; System.out.println("a="+a); System.out.println("b="+b); } } |
|
|