??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲13又紧又嫩又水多,亚洲一卡2卡4卡5卡6卡在线99,jlzzjlzz亚洲jzjzjz http://www.tkk7.com/fjpan2002/category/3566.htmlzh-cn Wed, 28 Feb 2007 07:48:04 GMT Wed, 28 Feb 2007 07:48:04 GMT 60 Java异常处理之陋习展播(ZTQ?/title> http://www.tkk7.com/fjpan2002/articles/57079.html勇敢的心 勇敢的心 Fri, 07 Jul 2006 01:53:00 GMT http://www.tkk7.com/fjpan2002/articles/57079.html http://www.tkk7.com/fjpan2002/comments/57079.html http://www.tkk7.com/fjpan2002/articles/57079.html#Feedback 0 http://www.tkk7.com/fjpan2002/comments/commentRss/57079.html http://www.tkk7.com/fjpan2002/services/trackbacks/57079.html
java 异常
你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机Ӟ在下面这D代码中Q你能够q速找出异常处理的六个问题吗?
[code:1:48e2a3bb92] 1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ?
4 Statement stat = conn.createStatement();
5 ResultSet rs = stat.executeQuery(
6 "select uid, name from user");
7 while (rs.next())
8 {
9 out.println("IDQ? + rs.getString("uid") // ?
10 "Q姓名:" + rs.getString("name"));
11 }
12 conn.close(); // ?
13 out.close();
14 }
15 catch(Exception ex) // ?
16 {
17 ex.printStackTrace(); //_?
18 } [/code:1:48e2a3bb92]
作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文。?
本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”(anti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题。?
反例之一Q丢弃异?
代码Q?5?18行。?
q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论——不查缓冲区是否已满。如果你看到了这U丢弃(而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)。?
q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不上“处理异常”。不错,调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了。?
丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文档Q可以看C面这D说明:“特别地Q虽然出现ThreadDeath是一U‘正常的情Ş’,但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不再理睬。”这D话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它甚至已经影响CJava本n的设计。?
那么Q应该怎样Ҏ呢?主要有四个选择Q?
1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l“处理好了异常”。?
2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择。?
3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q。?
4、不要捕获异常。?
l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬。?
反例之二Q不指定具体的异常?
代码Q?5行。?
许多时候h们会被这样一U“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?
要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常。由于绝大多数异帔R直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常。?
再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter。显Ӟ在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?
另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z——直x后由JVM处理。?
l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常。?
反例之三Q占用资源不释放
代码Q??14行。?
异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally。?
finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally。?
当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常——这是执行清理Q务的最后机会,量不要再有难以处理的错误。?
l论三:保证所有资源都被正释放。充分运用finally关键词。?
反例之四Q不说明异常的详l信息?
代码Q??18行。?
仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因。?
printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?
因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息。?
l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?
反例之五Q过于庞大的try块?
代码Q??14行。?
l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易。?
一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception。?
l论五:量减小try块的体积。?
反例之六Q输出数据不完整
代码Q??11行。?
不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行——就q些Q再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失。?
较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出。?
l论六:全面考虑可能出现的异总及这些异常对执行程的媄响。?
改写后的代码
Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点啰嗦Q但是它有了比较完备的异常处理机制。?
[code:1:48e2a3bb92] OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(
"select uid, name from user");
while (rs.next())
{
out.println("IDQ? + rs.getString("uid") +
"Q姓? " + rs.getString("name"));
}
}
catch(SQLException sqlex)
{
out.println("警告Q数据不完整");
throw new ApplicationException(
"d数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
throw new ApplicationException(
"写入数据时出现IO错误", ioex);
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2)
{
System.err(this.getClass().getName() +
".mymethod - 不能关闭数据库连? " +
sqlex2.toString());
}
}
if (out != null) {
try {
out.close();
}
catch(IOException ioex2)
{
System.err(this.getClass().getName() +
".mymethod - 不能关闭输出文g" +
ioex2.toString());
}
}
} [/code:1:48e2a3bb92]
本文的结Z是放之四L准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释。? 另一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习惯。即使最有经验的E序员偶也会误入歧途,原因很简单,因ؓ它们确实实带来了“方侎쀝。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q不x齿,但请CQ勿以恶而ؓ之,勿以善小而不为?
]]>java面试? http://www.tkk7.com/fjpan2002/articles/25849.html勇敢的心 勇敢的心 Thu, 29 Dec 2005 02:53:00 GMT http://www.tkk7.com/fjpan2002/articles/25849.html http://www.tkk7.com/fjpan2002/comments/25849.html http://www.tkk7.com/fjpan2002/articles/25849.html#Feedback 0 http://www.tkk7.com/fjpan2002/comments/commentRss/25849.html http://www.tkk7.com/fjpan2002/services/trackbacks/25849.html 1、什么是数据库的事务Q事务的原子性?有几U方法可以实C务的原子性? 2、DOM是什么?SAX Parser和DOM Parser有何区别Q?BR>3、同一机器中不同java虚拟机的E序有几U通讯方式Q不同机器的呢? 4、如何v一个线E?如何l束一个线E?如何安全地结束一个线E? 以下为写具体代码题: 5、用java实现一个动态增长的堆栈?BR>6、写一个读写锁Q可以同时多Q一个h写,q用q个d锁实现生产者-消费者同步?BR>7、写一个单例实玎ͼq考虑当它实现可序列化接口的实现?BR>8、写L一U排序方法,q说明如何将q个排序法应用到Java Collection中?BR>9、写一个程序判断一字节byte中有多少bit被置?? 思考题Q?BR>10、有一个单向链表,不知道它的头Q有个指针P指向该链表中的节点NQ如何将节点N删除Q?BR> [基础问答] 1.下面哪些cd以被l承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 2.抽象cd接口的区?BR>(1)接口可以被多重implements,抽象cd能被单一extends (2)接口只有定义,抽象cd以有定义和实?BR>(3)接口的字D定义默认ؓ:public static final, 抽象cdD默认是"friendly"(本包可见) 3.Hashtable的原?q说出HashMap与Hashtable的区?BR>HashTable的原?通过节点的关键码定节点的存储位|?即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),此D释ؓ该节点的存储地址. HashMap 与Hashtable很相?但HashMap 是非同步(unsynchronizded)和可以以null为关键码? 4.forward和redirect的区?BR>forward: an internal transfer in servlet redirect: 重定??ơrequest,W?ơrequest丢q一ơ的attributs/parameters{?BR> 5.什么是Web容器? 实现J2EE规范中web协议的应?该协议定义了webE序的运行时环境,包括:q发?安全?生命周期理{等. 6.解释下面关于J2EE的名?BR>(1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是Q提供一个目录系l,让其它各地的应用E序在其上面留下自己的烦引,从而满_速查扑֒定位分布式应用程序的功能. (2)JMSQJava Message Service,JAVA消息服务.主要实现各个应用E序之间的通讯.包括点对点和q播. (3)JTAQJava Transaction API,JAVA事务服务.提供各种分布式事务服?应用E序只需调用其提供的接口卛_. (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部v和自定义实现自己的个性安全控制策? (5)RMI:Remote Method Interface,q程Ҏ调用 7.EJB是基于哪些技术实现的Qƈ?nbsp;出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区? EJB包括Session Bean、Entity Bean、Message Driven BeanQ基于JNDI、RMI、JAT{技术实? SessionBean在J2EE应用E序中被用来完成一些服务器端的业务操作Q例如访问数据库、调用其他EJBlg.EntityBean被用来代表应用系l中用到的数?对于客户机,SessionBean是一U非持久性对象,它实现某些在服务器上q行的业务逻辑;EntityBean是一U持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用E序实现的实? Session Bean q可以再l分?nbsp;Stateful Session Bean ?nbsp;Stateless Session Bean .q两U的 Session Bean都可以将pȝ逻辑攑֜ method之中执行Q不同的?nbsp;Stateful Session Bean 可以记录呼叫者的状态,因此通常来说Q一个用者会有一个相对应?nbsp;Stateful Session Bean 的实?Stateless Session Bean 虽然也是逻辑lgQ但是他却不负责记录使用者状态,也就是说当用者呼?nbsp;Stateless Session Bean 的时候,EJB Container q不会找ȝ定的 Stateless Session Bean 的实体来执行q个 method.换言之,很可能数个用者在执行某个 Stateless Session Bean ?nbsp;methods Ӟ会是同一?nbsp;Bean ?nbsp;Instance 在执?从内存方面来看, Stateful Session Bean ?nbsp;Stateless Session Bean 比较Q?nbsp;Stateful Session Bean 会消?nbsp;J2EE Server 较多的内存,然?nbsp;Stateful Session Bean 的优势却在于他可以维持用者的状? 8.XML的解析方?BR>Sax,DOM,JDOM 9.什么是Web Service? Web Service是Z使原来各孤立的站点之间的信息能够怺通信、共享而提出的一U接口?BR>Web Service所使用的是Internet上统一、开攄标准Q如HTTP、XML、SOAPQ简单对象访问协议)、WSDL{,所以Web Service可以在Q何支持这些标准的环境QWindows,LinuxQ中使用?BR>注:SOAP协议QSimple Object Access Protocal,单对象访问协议),它是一个用于分散和分布式环境下|络信息交换的基于XML的通讯协议。在此协议下QY件组件或应用E序能够通过标准的HTTP协议q行通讯。它的设计目标就是简单性和扩展性,q有助于大量异构E序和^C间的互操作性,从而存在的应用程序能够被q泛的用戯问?BR> 优势Q?BR>(1).跨^収ͼ (2).SOAP协议是基于XML和HTTPq些业界的标准的Q得C所有的重要公司的支持?BR>(3).׃使用了SOAPQ数据是以ASCII文本的方式而非二进制传输,调试很方便;q且׃q样Q它的数据容易通过防火墙,不需要防火墙ZE序而单独开一个“漏z”?BR>(4).此外QWebService实现的技术难度要比CORBA和DCOM得多?BR>(5).要实现B2B集成QEDI比较完善与比较复杂;而用WebService则可以低成本的实玎ͼ公怹可以用上?BR>(6).在C/S的程序中QWebService可以实现|页无整体刷新的与服务器打交道ƈ取数?BR>~点Q?BR>(1).WebService使用了XMLҎ据封装,会造成大量的数据要在网l中传输?BR>(2).WebService规范没有规定M与实现相关的l节Q包括对象模型、编E语aQ这一点,它不如CORBA?BR> 10.多线E有几种实现Ҏ,都是什?同步有几U实现方?都是什? {:多线E有两种实现ҎQ分别是l承ThreadcM实现Runnable接口 同步的实现方面有两种Q分别是synchronized,wait与notify 11.JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true"/> 它L会检查所含文件中的变化,适合用于包含动态页面,q且可以带参?BR>静态INCLUDE用include伪码实现,定不会检查所含文件的变化Q适用于包含静态页?BR><%@ include file="included.htm" %> [Java~程与程序运行结果] 1.Java~程,打印昨天的当前时?BR>public class YesterdayCurrent{ public void main(String[] args){ Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); System.out.println(cal.getTime()); } } 2.文gd,实现一个计数器 public int getNum(){ int i = -1; try{ String stri=""; BufferedReader in = new BufferedReader(new FileReader(f)); while((stri=in.readLine())!=null){ i = Integer.parseInt(stri.trim()); } in.close(); }catch(Exception e){ e.printStackTrace(); } return i; } public void setNum(){ int i = getNum(); i++; try{ PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false))); out.write(String.valueOf(i)); //可能是编码的原因Q如果直接写入int的话Q将出现java~码和windows~码的乱,因此此处写入的是String out.close() ; }catch(Exception e){ e.printStackTrace(); } } 3. 指出下面E序的运行结? class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Hello{ public static void main(String[] ars){ A ab = new B(); //执行到此?l果: 1a2b ab = new B(); //执行到此?l果: 1a2bab } } ?cȝstatic 代码D?可以看作是类首次加蝲(被虚拟机加蝲)执行的代?而对于类的加?首先要执行其基类的构?再执行其本n的构?BR>4.写一个Singleton模式的例?BR>public class Singleton{ private static Singleton single = new Singleton(); private Singleton(){} public Singleton getInstance(){ return single; } } [数据库] 1.删除表的重复记录 如果记录完全相同才算重复记录,那么: (sql server2000下测试通过) select distinct * into #tmpp from tid delete from tid insert into tid select * from #tmpp drop table #tmpp 如果有id主键(数字,自增1的那U?,那么:(sql server2000下测试通过) delete from tableA where id not in (select id = min(id) from tableA group by name) 2.delete from tablea Q?nbsp;truncate table tablea的区?BR>truncate 语句执行速度?占资源少,q且只记录页删除的日志; delete Ҏ条记录的删除均需要记录日?BR> ]]> java排序?/title> http://www.tkk7.com/fjpan2002/articles/22627.html勇敢的心 勇敢的心 Mon, 05 Dec 2005 12:24:00 GMT http://www.tkk7.com/fjpan2002/articles/22627.html http://www.tkk7.com/fjpan2002/comments/22627.html http://www.tkk7.com/fjpan2002/articles/22627.html#Feedback 0 http://www.tkk7.com/fjpan2002/comments/commentRss/22627.html http://www.tkk7.com/fjpan2002/services/trackbacks/22627.html /*q个E序是我在一个帖子上看到的,觉得写的十分的不错,拿出来与大家׃n?/ package com.cucu.test; public class Sort { public void swap(int a[], int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } public int partition(int a[], int low, int high) { int pivot, p_pos, i; p_pos = low; pivot = a[p_pos]; for (i = low + 1; i <= high; i++) { if (a[i] > pivot) { p_pos++; swap(a, p_pos, i); } } swap(a, low, p_pos); return p_pos; } public void quicksort(int a[], int low, int high) { int pivot; if (low < high) { pivot = partition(a, low, high); quicksort(a, low, pivot - 1); quicksort(a, pivot + 1, high); } } public static void main(String args[]) { int vec[] = new int[] { 37, 47, 23, -5, 19, 56 }; int temp; //选择排序?Selection Sort) long begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 0; i < vec.length; i++) { for (int j = i; j < vec.length; j++) { if (vec[j] > vec[i]) { temp = vec[i]; vec[i] = vec[j]; vec[j] = temp; } } } } long end = System.currentTimeMillis(); System.out.println("选择法用时ؓQ? + (end - begin)); //打印排序好的l果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } // 冒排序?Bubble Sort) begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 0; i < vec.length; i++) { for (int j = i; j < vec.length - 1; j++) { if (vec[j + 1] > vec[j]) { temp = vec[j + 1]; vec[j + 1] = vec[j]; vec[j] = temp; } } } } end = System.currentTimeMillis(); System.out.println("冒法用时ؓQ? + (end - begin)); //打印排序好的l果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } //插入排序?Insertion Sort) begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 1; i < vec.length; i++) { int j = i; while (vec[j - 1] < vec[i]) { vec[j] = vec[j - 1]; j--; if (j <= 0) { break; } } vec[j] = vec[i]; } } end = System.currentTimeMillis(); System.out.println("插入法用时ؓQ? + (end - begin)); //打印排序好的l果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } //快速排序法(Quick Sort) Sort s = new Sort(); begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { s.quicksort(vec, 0, 5); } end = System.currentTimeMillis(); System.out.println("快速法用时为:" + (end - begin)); //打印排序好的l果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } } } ************************************************************************************
package org.jr.util;
/**
* Copyright: Copyright (c) 2002-2004
* Company: JavaResearch(http://www.javaresearch.org)
* 最后更新日?2003q???/FONT>
* @author Cherami
*/
import org.jr.*;
/**
* 排序工具c,提供常见的需要排序但是又没有实现Comparable接口的类?/FONT>
* 此类也提供一些创建的排序法的范例?/FONT>
* @since 0.5
*/
public class CompareUtil {
/**
* U有构造方法,防止cȝ实例化,因ؓ工具cM需要实例化?/FONT>
*/
private CompareUtil () {
}
/**
* 比较两个数字?/FONT>
* q个Ҏ取Number的doubleD行比较,因此只有在两个数严格相等的情况下才返?Q?/FONT>
* 又可能因为Java中Double型和Float的精度不同而导致两个相{的Cq回0?/FONT>
* @param o1 W一个数?/FONT>
* @param o2 W二个数?/FONT>
* @return W一个数字大于第二个q回1Q等于返?Q否则返回-1
* @since 0.5
*/
public static int compare(Number o1, Number o2) {
double n1 = o1.doubleValue();
double n2 = o2.doubleValue();
if (n1 < n2) {
return -1;
}
else if (n1 > n2) {
return 1;
}
else {
return 0;
}
}
/**
* 比较两个布尔型倹{?/FONT>
* 如果两个的g同,true被认为等?Q而false{于0?/FONT>
* @param o1 W一个?/FONT>
* @param o2 W二个?/FONT>
* @return W一个值大于第二个q回1Q等于返?Q否则返?1
* @since 0.5
*/
public static int compare(Boolean o1, Boolean o2) {
boolean b1 = o1.booleanValue();
boolean b2 = o2.booleanValue();
if (b1 == b2) {
return 0;
}
else if (b1) {
return 1;
}
else {
return -1;
}
}
/**
* 冒排序法排序?/FONT>
* @param objects 排序对象
* @param isAscent 排序序
* @return 排序后应该有的烦引数l?/FONT>
* @since 0.5
*/
public static int [] n2sort(Comparable [] objects, boolean isAscent) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 0; i < length ; i++) {
for (int j = i + 1; j < length ; j++) {
if (isAscent == true ) {
if (objects[indexes[i]].compareTo(objects[indexes[j]]) > 0) {
swap(indexes, i, j);
}
}
else {
if (objects[indexes[i]].compareTo(objects[indexes[j]]) < 0) {
swap(indexes, i, j);
}
}
}
}
return indexes;
}
/**
* 冒排序法排序?/FONT>
* @param objects 排序对象
* @param key 排序关键?/FONT>
* @param isAscent 排序序
* @return 排序后应该有的烦引数l?/FONT>
* @since 0.5
*/
public static int [] n2sort(PropertyComparable [] objects, int key,
boolean isAscent) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 0; i < length ; i++) {
for (int j = i + 1; j < length ; j++) {
if (isAscent == true ) {
if (objects[indexes[i]].compareTo(objects[indexes[j]], key) > 0) {
swap(indexes, i, j);
}
}
else {
if (objects[indexes[i]].compareTo(objects[indexes[j]], key) < 0) {
swap(indexes, i, j);
}
}
}
}
return indexes;
}
/**
* 冒排序法排序?/FONT>
* @param objects 排序对象
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] n2sort(Comparable [] objects) {
return n2sort(objects,true );
}
/**
* 冒排序法排序?/FONT>
* @param objects 排序对象
* @param key 排序关键?/FONT>
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] n2sort(PropertyComparable [] objects, int key) {
return n2sort(objects,key);
}
/**
* 插入排序法排序?/FONT>
* @param objects 排序对象
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] insertionSort(Comparable [] objects) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 1; i < length ; i++) {
int j = i;
Comparable B = objects[indexes[i]];
while ((j > 0) && (objects[indexes[j-1]].compareTo(B) > 0)) {
indexes[j] = indexes[j-1];
j--;
}
indexes[j] = i;
}
return indexes;
}
/**
* 插入排序法排序?/FONT>
* @param objects 排序对象
* @param key 排序关键?/FONT>
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] insertionSort(PropertyComparable [] objects, int key) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 1; i < length ; i++) {
int j = i;
Comparable B = objects[indexes[i]];
while ((j > 0) && (objects[indexes[j-1]].compareTo(B,key) > 0)) {
indexes[j] = indexes[j-1];
j--;
}
indexes[j] = i;
}
return indexes;
}
/**
* 选择排序法排序?/FONT>
* @param objects 排序对象
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] selectionSort(Comparable [] objects) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 0; i < length ; i++) {
int min = i;
int j;
//在未排序列表里面查找最元?/FONT>
for (j = i + 1; j < length ; j++) {
if (objects[indexes[j]].compareTo(objects[indexes[min]]) <0 ) {
min = j;
}
}
//最的元素交换到未排序元素的最开?/FONT>
swap(indexes,i,min);
}
return indexes;
}
/**
* 选择排序法排序?/FONT>
* @param objects 排序对象
* @param key 排序关键?/FONT>
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] selectionSort(PropertyComparable [] objects, int key) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
for (int i = 0; i < length ; i++) {
int min = i;
int j;
//在未排序列表里面查找最元?/FONT>
for (j = i + 1; j < length ; j++) {
if (objects[indexes[j]].compareTo(objects[indexes[min]],key) <0 ) {
min = j;
}
}
//最的元素交换到未排序元素的最开?/FONT>
swap(indexes,i,min);
}
return indexes;
}
/**
* 双向冒排序法排序?/FONT>
* @param objects 排序对象
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] bidirectionalBubbleSort(Comparable [] objects) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
int j;
int limit = objects.length ;
int start = -1;
while (start < limit) {
start++;
limit--;
for (j = start; j < limit; j++) {
if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
swap(indexes,j,j+1);
}
}
for (j = limit; --j >= start;) {
if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
swap(indexes,j,j+1);
}
}
}
return indexes;
}
/**
* 双向冒排序法排序?/FONT>
* @param objects 排序对象
* @param key 排序关键?/FONT>
* @return 按照升序排序后应该有的烦引数l?/FONT>
* @since 0.6
*/
public static int [] bidirectionalBubbleSort(PropertyComparable [] objects, int key) {
int length = objects.length ;
int [] indexes = ArrayUtil .getInitedIntArray(length );
int j;
int limit = objects.length ;
int start = -1;
while (start < limit) {
start++;
limit--;
for (j = start; j < limit; j++) {
if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
swap(indexes,j,j+1);
}
}
for (j = limit; --j >= start;) {
if (objects[indexes[j]].compareTo(objects[indexes[j+1]],key) > 0) {
swap(indexes,j,j+1);
}
}
}
return indexes;
}
/**
* 交换两个元素的倹{?/FONT>
* @param indexes 原烦引数l?/FONT>
* @param i W一?/FONT>
* @param j W二?/FONT>
*/
private static void swap(int [] indexes, int i, int j) {
int tmp = indexes[i];
indexes[i] = indexes[j];
indexes[j] = tmp;
}
}
------------------------------------------
冒排序Q?
1、比较相ȝ两个元素Q如果后面的比前面小Q就对调二者。反复比较,到最后两个元素。结果,最大值就跑到了最末位|?
2、反复第一步,直到所有较大值都跑到靠后的位|?/P>
---------------------------------------------
选择排序
1、一开始整个数列是未排列的
2、从未排列的CQ挑选出最的敎ͼ和未排列的数中的W一个元素互调,q将该最的数归cd已排序的序列中;
3、重复第2步,直到所有的数都归类到已排序数列中?/P>
---------------------------------------------
插入排序法:
1、一开始只有第一个数在已排序数列中,其他的数归类到未排序数列中;
2、将未排序的W一个数Q插入到已排序数列中Q得插入后的已排序数列仍然l持由小到大的顺序;
3、重复步?Q直到所有的数都在已排序数列中?/P>
-----------------------------------------------
]]> java面试攉Q持l更斎ͼ-1 原脓~辑太慢?/title> http://www.tkk7.com/fjpan2002/articles/21680.html勇敢的心 勇敢的心 Mon, 28 Nov 2005 07:24:00 GMT http://www.tkk7.com/fjpan2002/articles/21680.html http://www.tkk7.com/fjpan2002/comments/21680.html http://www.tkk7.com/fjpan2002/articles/21680.html#Feedback 0 http://www.tkk7.com/fjpan2002/comments/commentRss/21680.html http://www.tkk7.com/fjpan2002/services/trackbacks/21680.html 阅读全文 ]]> java面试攉Q持l更斎ͼ http://www.tkk7.com/fjpan2002/articles/21654.html勇敢的心 勇敢的心 Mon, 28 Nov 2005 05:05:00 GMT http://www.tkk7.com/fjpan2002/articles/21654.html http://www.tkk7.com/fjpan2002/comments/21654.html http://www.tkk7.com/fjpan2002/articles/21654.html#Feedback 0 http://www.tkk7.com/fjpan2002/comments/commentRss/21654.html http://www.tkk7.com/fjpan2002/services/trackbacks/21654.html 阅读全文 ]]>
վ֩ģ壺
avһas |
ԻȫƵ߹ۿ |
һȫëƬ |
ҹ˾Ʒɫ |
˳վ |
AVպAV
|
ѹ˦Ƭ |
ŷɫƵ߹ۿ |
Ʒ˽Ĺ |
Ļ |
þþþþѹۿ |
һavĻ |
ôӲˬƵ |
˳߲ |
ӰԺ |
þëƬѿһ |
ղһ |
97Ƶ |
AVɫ |
ҹƬ69 |
24Сʱձwwwѵ |
ƷƷ߹ۿ |
鶹ƷѹƬ |
ƷŷƷ |
ɬɬƵ |
ɫҳѹۿ |
99ȳ˾ƷȾþ |
йһëƬѿƵ |
þ99ڹ |
18ڵվ |
ǧ˾ղ |
ƷAVĻӰվ |
ձ18 |
ձҺ |
һaƬɫëƬ |
˿wwwƵ |
߲ |
ӰԺ |
һѹۿ |
Ʒר |
AV˿߹ۿ |