中文字幕精品无码亚洲字 ,亚洲国产第一站精品蜜芽,99999久久久久久亚洲http://www.tkk7.com/youling/面對挑戰,我告訴自己:面對是勇氣,積極面對是態度,堅持積極面對是毅力!zh-cnSat, 10 May 2025 11:11:40 GMTSat, 10 May 2025 11:11:40 GMT60千萬級sql優化http://www.tkk7.com/youling/archive/2011/09/06/358076.html黑豆熊黑豆熊Tue, 06 Sep 2011 04:18:00 GMThttp://www.tkk7.com/youling/archive/2011/09/06/358076.htmlhttp://www.tkk7.com/youling/comments/358076.htmlhttp://www.tkk7.com/youling/archive/2011/09/06/358076.html#Feedback22http://www.tkk7.com/youling/comments/commentRss/358076.htmlhttp://www.tkk7.com/youling/services/trackbacks/358076.html
select a.tcol2, a.departcode, a.sendtime, sum(a.mainamount) mainamount
  from sf02 a
 where a.ksdm = '11019204'
  and exists
 (select policyno
  from sf01 b
  where b.businessnature = '531'
  union all select policyno from sf01 b where b.businessnature = '532'
  and a.policyno = b.policyno)
  and (a.kindcode = 'R21' or a.kindcode = 'R29')
  and a.insert_time <= to_date('2011-09-05', 'yyyy-MM-dd')
  and a.insert_time >= to_date('2000-08-25', 'yyyy-MM-dd')
 group by a.tcol2, a.departcode, a.sendtime
 
由于數據庫是分公司的,創建臨時表不是太好使,這個問題一直沒有太好的解決辦法,不知道各位有沒有好的思路,希望各位留下寶貴的意見,由于這個帖子放在提問區一直沒有人瀏覽,不得已放在首頁,還請blogJava對該帖放行,非常感謝。

黑豆熊 2011-09-06 12:18 發表評論
]]>
關于:Cannot create JDBC driver of class '' for connect URL 'null' http://www.tkk7.com/youling/archive/2009/03/17/260230.html黑豆熊黑豆熊Tue, 17 Mar 2009 05:29:00 GMThttp://www.tkk7.com/youling/archive/2009/03/17/260230.htmlhttp://www.tkk7.com/youling/comments/260230.htmlhttp://www.tkk7.com/youling/archive/2009/03/17/260230.html#Feedback0http://www.tkk7.com/youling/comments/commentRss/260230.htmlhttp://www.tkk7.com/youling/services/trackbacks/260230.html
今天在使用潤乾報表的時候,出現了一個錯誤:Cannot create JDBC driver of class '' for connect URL 'null'

當我們用Tomcat5.0.XX時,以Oracle為例,一般我們的配置如下,但直接移到5.5.XX時就會發生錯誤
   <Resource name="jdbc/XXX" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/XXX">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>password</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbcracle:thin:@localhost:1521:SID</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>oracle.jdbc.driver.OracleDriver</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>username</value>
    </parameter>
  </ResourceParams>

當要移植到Tomcat5.5.XX時,配置應當修改一下,如下所示: 
    <Resource
    name="jdbc/XXX"
    type="javax.sql.DataSource"
    password="password"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    maxIdle="2"
    maxWait="5000"
    username="username"
    url="jdbcracle:thin:@localhost:1521:SID"
    maxActive="4"/>


上面的錯誤消失以后,緊接著出現了:Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'

修改方法如下:

1. 將servlet-api.jar和classes12.jar考到WEB-INF/lib目錄下

2. 將servlet-api.jar和classes12.jar考到\Tomcat   5.0\common\lib下




黑豆熊 2009-03-17 13:29 發表評論
]]>
大家來說說改Bug的好方法http://www.tkk7.com/youling/archive/2008/12/16/246672.html黑豆熊黑豆熊Tue, 16 Dec 2008 09:02:00 GMThttp://www.tkk7.com/youling/archive/2008/12/16/246672.htmlhttp://www.tkk7.com/youling/comments/246672.htmlhttp://www.tkk7.com/youling/archive/2008/12/16/246672.html#Feedback6http://www.tkk7.com/youling/comments/commentRss/246672.htmlhttp://www.tkk7.com/youling/services/trackbacks/246672.html&#@$%^$#%$......
        改完這個Bug以后,我給自己一點時間,反思一下出現這種情況的原因,感覺最主要的原因就是自己對測試方法和調試方法比較陌生,在這次的錯誤修改過程當中,我主要用的是日志分段打印輸出,來查找出錯的地方,真的是太浪費時間了,不知道各位大俠一般是怎樣查找定位錯誤,修改錯誤以后,又是怎樣快速高效的測試?
         望各位大俠不吝賜教,小弟感激不盡,先行謝過!

黑豆熊 2008-12-16 17:02 發表評論
]]>
java.lang.UnsupportedClassVersionError異常的解決方法http://www.tkk7.com/youling/archive/2008/12/12/246015.html黑豆熊黑豆熊Fri, 12 Dec 2008 10:11:00 GMThttp://www.tkk7.com/youling/archive/2008/12/12/246015.htmlhttp://www.tkk7.com/youling/comments/246015.htmlhttp://www.tkk7.com/youling/archive/2008/12/12/246015.html#Feedback2http://www.tkk7.com/youling/comments/commentRss/246015.htmlhttp://www.tkk7.com/youling/services/trackbacks/246015.html今天下午的時候,一個同事買了一臺筆記本,把他的臺式機撤給我用,就在我把開發環境裝好準備測試一下的時候,Tomcat啟動時卻是報了java.lang.UnsupportedClassVersionErrorde的錯誤,仔細看了一下,好像是什么:未知的版本錯誤,這時候才想起來,自己的Myeclipse裝的是6.0的,jdk是1.4,Tomcat是5.5,而裝好Meclipse以后默認的jdk版本是5.0,如果不注意著一點,Tomcat服務器在啟動的時候,就會報上面的錯誤。現把解決得方法貼出來:
    

1、Jbuilder2006自帶了1.5的JDK,但如果你還想繼續用JDK1.42,如果只是在Jbuilder2006的tool->configure->JDKs中添加一個JDK1.42或更低版本,那么即使你只寫一個最簡單的HelloWorld程序,Jbuilder2006都會給你報出長長一串錯誤,編寫的代碼在Jbuilder2005中也無法運行。JBuilder2006在運行編譯工程時,會針對特定版本的VM進行編譯,默認的是Java 2 SDK, v 5.0 And Late,因此,如果工程用的是1.5以下的JDK,碰到都是java.lang.UnsupportedClassVersionError這個錯誤。

解決的辦法其實很簡單,只要更改這個選項就行了。具體步驟如下:
----------------------------------------------------------
1、右鍵點擊工程文件,選擇屬性(properties),
2、在屬性窗口中選擇 Build-->Java,在右邊的選項中有四個下拉框,就可以看到編譯選項了,
3、其中Compiler和Debug Option可以不用管,只在Languege features和Target VM中選擇相應的JDK版本就可以了,然后確定,一切OK。
附件中是配置的圖片。
-----------------------------------------------------------
如果在Target VM中選擇了All Java SDKs,那么你的class文件在使用JDK1.1的VM上都可以運行(Jbuilder2006幫助中是這么說的,估計沒幾個人的機子上還在用JDK1.1吧 :-)
2、Eclipse3.1同樣會出現相同的問題,這時候只需要把項目用的JDK與你安裝的JDK搞成版本一樣就解決了.
步驟:右擊你的項目-->屬性-->Java Compiler,設置合適的版本!!


黑豆熊 2008-12-12 18:11 發表評論
]]>
求教:讓人郁悶的時間問題http://www.tkk7.com/youling/archive/2008/12/01/243703.html黑豆熊黑豆熊Mon, 01 Dec 2008 06:15:00 GMThttp://www.tkk7.com/youling/archive/2008/12/01/243703.htmlhttp://www.tkk7.com/youling/comments/243703.htmlhttp://www.tkk7.com/youling/archive/2008/12/01/243703.html#Feedback8http://www.tkk7.com/youling/comments/commentRss/243703.htmlhttp://www.tkk7.com/youling/services/trackbacks/243703.html f.QUARTER1_BUDGET,f.QUARTER2_BUDGET,f.QUARTER3_BUDGET,f.QUARTER4_BUDGET,f.ID,f.PROJ_CODE,b.PROJ_TYPE,
b.PROJ_NAME,b.PROJ_SORT,b.PROJ_STAT,b.P_RECORD_TIME
其中DATA_YEAR和DATA_MONTH在數據庫中的存儲類型是String型,  DATA_DATE存儲的類型是Date型,使用到的DataParser.formatStringDate方法如下:
 public static Date formatStringDate(String sDate)
 {
  DateFormat df = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  Date tDate = null;
  try {
   tDate = df.parse(sDate);
  } catch (ParseException e) {
   e.printStackTrace();
  }
  return tDate;
 }
但是無論如何都是出不來結果,報的是一個Not all named parameters have been set: [00:00]的錯誤,格式化出來的時間也不是想要的類型,而是這個衰樣:Sat Nov 01 00:00:00 CST 2008,與我想要的“yyyy-MM-dd hh:mm:ss”相去甚遠,不知道該怎么格式化一下,麻煩那位高手指點一下,感激不盡!

黑豆熊 2008-12-01 14:15 發表評論
]]>
sql語句的執行順序--簡介http://www.tkk7.com/youling/archive/2008/11/28/243177.html黑豆熊黑豆熊Fri, 28 Nov 2008 03:17:00 GMThttp://www.tkk7.com/youling/archive/2008/11/28/243177.htmlhttp://www.tkk7.com/youling/comments/243177.htmlhttp://www.tkk7.com/youling/archive/2008/11/28/243177.html#Feedback6http://www.tkk7.com/youling/comments/commentRss/243177.htmlhttp://www.tkk7.com/youling/services/trackbacks/243177.html 一、sql語句的執行步驟:
 1)語法分析,分析語句的語法是否符合規范,衡量語句中各表達式的意義。
2) 語義分析,檢查語句中涉及的所有數據庫對象是否存在,且用戶有相應的權限。
3)視圖轉換,將涉及視圖的查詢語句轉換為相應的對基表查詢語句。
4)表達式轉換, 將復雜的 SQL 表達式轉換為較簡單的等效連接表達式。
 5)選擇優化器,不同的優化器一般產生不同的“執行計劃”
6)選擇連接方式, ORACLE 有三種連接方式,對多表連接 ORACLE 可選擇適當的連接方式。
7)選擇連接順序, 對多表連接 ORACLE 選擇哪一對表先連接,選擇這兩表中哪個表做為源數據表。
8)選擇數據的搜索路徑,根據以上條件選擇合適的數據搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。
9)運行“執行計劃”
二、oracle 共享原理:
        ORACLE將執行過的SQL語句存放在內存的共享池(shared buffer pool)中,可以被所有的數據庫用戶共享 當你執行一個SQL語句(有時被稱為一個游標)時,如果它和之前的執行過的語句完全相同, ORACLE就能很快獲得已經被解析的語句以及最好的 執行路徑. 這個功能大大地提高了SQL的執行性能并節省了內存的使用
三、oracle 語句提高查詢效率的方法:1: where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二種格式要遠比第一種格式的效率高。在Oracle中可以幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢 使用EXIST,Oracle系統會首先檢查主查詢,然后運行子查詢直到它找到第一個匹配項,這就節省了時間 Oracle系統在執行IN子查詢時,首先執行子查詢,并將獲得的結果列表存放在在一個加了索引的臨時表中 避免使用having字句 避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷

SQL Select語句完整的執行順序: 

1、from子句組裝來自不同數據源的數據;
 2、where子句基于指定的條件對記錄行進行篩選;
3、group by子句將數據劃分為多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序。



黑豆熊 2008-11-28 11:17 發表評論
]]>
Hibernate 中的Formula 攻略(轉載)http://www.tkk7.com/youling/archive/2008/11/26/242749.html黑豆熊黑豆熊Wed, 26 Nov 2008 03:07:00 GMThttp://www.tkk7.com/youling/archive/2008/11/26/242749.htmlhttp://www.tkk7.com/youling/comments/242749.htmlhttp://www.tkk7.com/youling/archive/2008/11/26/242749.html#Feedback2http://www.tkk7.com/youling/comments/commentRss/242749.htmlhttp://www.tkk7.com/youling/services/trackbacks/242749.html

閱讀對象:

  1.已經在使用Hibernate JPA完成持久化映射的朋友。

  2.在網上搜索Formula并通通搜到轉載oralce一篇技術文章或hibernate annotations技術文檔的朋友。

  3.發現@Formula不能使用并想Ctrl+Delete hibernate jar包,然后砸爛顯示器的朋友。

 

文章內容

  本文將說明如何使用@Formula,并且說明在哪幾種情況下@Formula會失靈。

 

1.Formula的作用

  引用hibernate annotations技術文檔中的解釋可以很好的說明@Formula的作用,但它確實沒有說清楚怎么使用,并且給出的示例是用不了的,這讓我浪費了好幾個鐘頭的時間!

   Formula的作用就是說白了就是用一個查詢語句動態的生成一個類的屬性,比如java eye登陸之后 收件箱顯示有幾封未讀郵件的數字,就是一條select count(*)...構成的虛擬列,而不是存儲在數據庫里的一個字段。用比較標準的說法就是:有時候,你想讓數據庫,而非JVM,來替你完成一些計算,也可能想創建某種虛擬列,你可以使用sql片段,而不是將屬性映射(物理)列。這種屬性是只讀的(屬性值由公式求得).Formula甚至可以包含sql子查詢

   Formula真的這么強大嗎?確實,它很好很強大,節省了不少代碼!

 

2.使用Formula

 

Java代碼 復制代碼
  1. package aa;   
  2.   
  3. import static javax.persistence.GenerationType.IDENTITY;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.Id;   
  8. import javax.persistence.Table;   
  9.   
  10. import org.hibernate.annotations.Formula;   
  11.   
  12. /**  
  13.  * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
  14.  * @author 昆明蜂鳥軟件  
  15.  * @version 0.1.0 2008-7-15 下午06:09:38  
  16.  */  
  17. @Entity  
  18. @Table(name = "user", catalog = "test")   
  19. public class User {   
  20.        
  21.     @Id  
  22.     @GeneratedValue(strategy = IDENTITY)   
  23.     private int id;   
  24.   
  25.     @Formula("(select COUNT(*) from user)")   
  26.     private int count;   
  27.   
  28.     public int getId() {   
  29.         return id;   
  30.     }   
  31.   
  32.     public void setId(int id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public int getCount() {   
  37.         return count;   
  38.     }   
  39.   
  40.     public void setCount(int count) {   
  41.         this.count = count;   
  42.     }   
  43. }  

 

 

 

 數據庫表:

Sql代碼 復制代碼
  1. CREATE TABLE  `test`.`user` (   
  2.   `id` int(10) unsigned NOT NULL auto_increment,   
  3.   PRIMARY KEY  USING BTREE (`id`)   
  4. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  

 

 

細節1.使用@Formula 你的注解必須是在屬性上,如果有一個注解在方法上,那么@Formula將失效。這個我是做過實驗的,比如把以上的java文件改為:

Java代碼 復制代碼
  1. package aa;   
  2.   
  3. import static javax.persistence.GenerationType.IDENTITY;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.Id;   
  8. import javax.persistence.Table;   
  9.   
  10. import org.hibernate.annotations.Formula;   
  11.   
  12. /**  
  13.  * 注解必須是在屬性上的,如果有任何一個注解在方法上,那么@Formula將失效  
  14.  * @author 昆明蜂鳥軟件  
  15.  * @version 0.1.0 2008-7-15 下午06:09:38  
  16.  */  
  17. @Entity  
  18. @Table(name = "user", catalog = "test")   
  19. public class User {   
  20.        
  21.     private int id;   
  22.   
  23.     @Formula("(select COUNT(*) from user)")   
  24.     private int count;   
  25.        
  26.     @Id  
  27.     @GeneratedValue(strategy = IDENTITY)   
  28.     public int getId() {   
  29.         return id;   
  30.     }   
  31.   
  32.     public void setId(int id) {   
  33.         this.id = id;   
  34.     }   
  35.   
  36.     public int getCount() {   
  37.         return count;   
  38.     }   
  39.   
  40.     public void setCount(int count) {   
  41.         this.count = count;   
  42.     }   
  43. }  

 

 這樣@Formula就不可以運行!!!我前邊就是被Hibernate官方的文檔給搞暈了。

細節2.既然@Formula 是一個虛擬列,那么數據庫中不需要建這一列,同樣可以,如果有個列存在,hibernate也會將   其忽略。以上示例中的user就沒有count列。

細節3.sql語句必須寫在()中,這個以前也有人說過。

細節4.如果有where子查詢,那么表需要用別名,比如 select COUNT(*) from user where id=1 是錯的

而select COUNT(*) from user u where u.id=1是正確的

細節5.只要是你在數據庫的sql控制臺執行過的語句,并且使用了表別名,那么@Formula都應該是支持的。

 

 確實@Formula是一個很常用且好用的東西!希望這篇文章能幫助你~~

 



黑豆熊 2008-11-26 11:07 發表評論
]]>
JS的編碼與解碼http://www.tkk7.com/youling/archive/2008/11/17/240967.html黑豆熊黑豆熊Mon, 17 Nov 2008 07:07:00 GMThttp://www.tkk7.com/youling/archive/2008/11/17/240967.htmlhttp://www.tkk7.com/youling/comments/240967.htmlhttp://www.tkk7.com/youling/archive/2008/11/17/240967.html#Feedback0http://www.tkk7.com/youling/comments/commentRss/240967.htmlhttp://www.tkk7.com/youling/services/trackbacks/240967.html        今天遇到這樣一個問題,通過JS傳遞的URL中包含了一個中文詞語,傳遞過去的值就變成了亂碼,后來上網上一查,才發現,原來JS傳遞URL參數是采用UTF-8,而我們平常的地址欄傳遞編碼格式是“ISO-8859-1”,因此在通過JS傳遞參數的時候,必須先編碼,然后在使用的時候進行解碼,針對此情況,我們可以寫下面的一個方法,對它方便的進行轉換:
public static String decodeParamString(String paramValue)
 {
  if(paramValue==null)
   return null;
  
  try
  {
   String tmp0=URLEncoder.encode(paramValue, "ISO-8859-1");
   
   String result=URLDecoder.decode(tmp0, "utf-8");
   
   if(log.isInfoEnabled())
    log.info("原始字符串:"+tmp0+",解碼結果:"+result);
   
   return result;
  }
  catch(Exception e)
  {
   log.error("解碼失敗:", e);
   return null;
  }
 }
不過在傳遞URL的時候,需要先對URL進行處理url+=encodeURI(url);
然后在接收參數的時候進行轉化,呵呵,通過實際測試,效果還是不錯的!

黑豆熊 2008-11-17 15:07 發表評論
]]>
select中實現readonly的方法http://www.tkk7.com/youling/archive/2008/11/14/240472.html黑豆熊黑豆熊Fri, 14 Nov 2008 02:55:00 GMThttp://www.tkk7.com/youling/archive/2008/11/14/240472.htmlhttp://www.tkk7.com/youling/comments/240472.htmlhttp://www.tkk7.com/youling/archive/2008/11/14/240472.html#Feedback3http://www.tkk7.com/youling/comments/commentRss/240472.htmlhttp://www.tkk7.com/youling/services/trackbacks/240472.html          上網搜索了一下,發現一種不錯的方法,貢獻給大家,代碼如下:
    <select name="projInveSour.phaseType" <c:if test='${method eq "update"}'> onbeforeactivate="return false" onfocus="this.blur()" onmouseover="this.setCapture()" onmouseout="this.releaseCapture()" </c:if>>
        <option value="">全部</option>
        <option value="立項" <c:if test='${projInveSourForm.projInveSour.phaseType eq "立項"}'>selected</c:if>>立項</option>
        <option value="初設" <c:if test='${projInveSourForm.projInveSour.phaseType eq "初設"}'>selected</c:if>>初設</option>
       </select>
紅色部分為關鍵代碼,大家參考一下,呵呵

黑豆熊 2008-11-14 10:55 發表評論
]]>
JAVA中的集合類http://www.tkk7.com/youling/archive/2008/11/09/239507.html黑豆熊黑豆熊Sun, 09 Nov 2008 03:24:00 GMThttp://www.tkk7.com/youling/archive/2008/11/09/239507.htmlhttp://www.tkk7.com/youling/comments/239507.htmlhttp://www.tkk7.com/youling/archive/2008/11/09/239507.html#Feedback0http://www.tkk7.com/youling/comments/commentRss/239507.htmlhttp://www.tkk7.com/youling/services/trackbacks/239507.html理解集合類

集合類存放于java.util包中。
集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)
集合類型主要有3種:set(集)、list(列表)和map(映射)

(1)
集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。
對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。
集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。

(2)列表
列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。
列表在數據結構中分別表現為:數組和向量、鏈表、堆棧、隊列。
關于實現列表的集合類,是我們日常工作中經常用到的,將在后邊的筆記詳細介紹。

(3)映射
映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。
關鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況下,散列處理應該產生給定范圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。

  • 集合類簡介

java.util中共有13個類可用于管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹

集:
HashSet
使用HashMap的一個集的實現。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對象實現集的存儲和檢索操作是在固定時間內實現的.
TreeSet
在集中以升序對對象排序的集的實現。這意味著從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用了一個TreeMap.
列表:
Vector
實現一個類似數組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。
Stsck:
這個類從Vector派生而來,并且增加了方法實現棧??一種后進先出的存儲結構。
LinkedList:
實現一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。
ArrayList:
實現一個數組,它的規模可變并且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。


映射:
HashTable
實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的一個繼承,并且通常能在實現映象的其他類中更好的使用。
HashMap
實現一個映象,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當然只能有一個)。
WeakHashMap
實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。
TreeMap
實現這樣一個映象,對象是按鍵升序排列的。

SetList都是由公共接口Collection擴展而來,所以它們都可以使用一個類型為Collection的變量來引用。這就意味著任何列表或集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標準途徑是使用Collection類型的參數。

  • Vector 還是ArrayList,哪一個更好,為什么?

要回答這個問題不能一概而論,有時候使用Vector比較好;有時是ArrayList,有時候這兩個都不是最好的選擇。你別指望能夠獲得一個簡單肯定答案,因為這要看你用它們干什么。下面有4個要考慮的因素:

(1)API

(2)同步處理

(3)數據增長性

(4)使用模式

下面針對這4個方面進行一一探討

API
在由Ken Arnold等編著的《Java Programming Language(Addison-Wesley, June 2000)一書中有這樣的描述,Vector類似于ArrayList.。所有從API的角度來看這兩個類非常相似。但他們之間也還是有一些主要的區別的。

同步性

Vector是同步的。這個類中的一些方法保證了Vector中的對象是線程安全的。而ArrayList則是異步的,因此ArrayList中的對象并不是線程安全的。因為同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那么使用ArrayList是一個很好的選擇,這樣可以避免由于同步帶來的不必要的性能開銷。

數據增長

從內部實現機制來講ArrayListVector都是使用數組(Array)來控制集合中的對象。當你向這兩種類型中增加元素的時候,如果元素的數目超出了內部數組目前的長度它們都需要擴展內部數組的長度,Vector缺省情況下自動增長原來一倍的數組長度,ArrayList是原來的50%,所以最后你獲得的這個集合所占的空間總是比你實際需要的要大。所以如果你要在集合中保存大量的數據那么使用Vector有一些優勢,因為你可以通過設置集合的初始化大小來避免不必要的資源開銷。

使用模式

ArrayListVector中,從一個指定的位置(通過索引)查找數據或是在集合的末尾增加、移除一個元素所花費的時間是一樣的,這個時間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數,i代表元素增加或移除元素的索引位置。為什么會這樣呢?以為在進行上述操作的時候集合中第i和第i個元素之后的所有元素都要執行位移的操作。這一切意味著什么呢?

這意味著,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用VectorArrayList都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費的時間都是一樣的—O(1),但它在索引一個元素的使用缺比較慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因為你可以簡單的使用索引來代替創建iterator對象的操作。LinkList也會為每個插入的元素創建對象,所有你要明白它也會帶來額外的開銷。

最后,在《Practical Java》一書中Peter Haggar建議使用一個簡單的數組(Array)來代替VectorArrayList。尤其是對于執行效率要求高的程序更應如此。因為使用數組(Array)避免了同步、額外的方法調用和不必要的重新分配空間的操作。

 



黑豆熊 2008-11-09 11:24 發表評論
]]>
主站蜘蛛池模板: 成人免费视频网站www| 亚洲免费在线观看视频| 啦啦啦手机完整免费高清观看| 亚洲视频在线观看免费视频| 久久一区二区三区免费播放| 亚洲成色999久久网站| 精品国产麻豆免费人成网站| 亚洲av激情无码专区在线播放| 国产免费拔擦拔擦8X高清在线人| 亚洲AV无码专区国产乱码电影| 久草免费福利视频| 亚洲AV无码一区东京热久久| 69视频免费在线观看| 亚洲国产视频一区| 好吊妞在线新免费视频| 激情小说亚洲图片| 亚洲综合另类小说色区| 精品视频一区二区三区免费| 久久亚洲日韩看片无码| 毛片高清视频在线看免费观看| 亚洲国产美女精品久久久| 亚洲人成网站在线观看青青| 爽爽爽爽爽爽爽成人免费观看| 777亚洲精品乱码久久久久久 | 久久国产精品成人片免费| 亚洲va成无码人在线观看| 国产免费一区二区三区VR| 久久久久久久久久免免费精品| 久久久婷婷五月亚洲97号色 | 亚洲日本一线产区和二线产区对比| 国产男女猛烈无遮挡免费视频 | 国产91成人精品亚洲精品| 怡红院亚洲怡红院首页| 最近中文字幕国语免费完整| 亚洲av日韩综合一区二区三区| 亚洲一区二区三区在线视频| 久久免费看黄a级毛片| 国产成人不卡亚洲精品91| 亚洲国产综合专区电影在线| 四虎免费在线观看| 国产无遮挡裸体免费视频在线观看|