欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
ArrayList使用toArray()構造數組時(shí)的問(wèn)題
標題:ArrayList使用toArray()構造數組時(shí)的問(wèn)題

關(guān)鍵字:toArray  構造數組

作者:jrq

摘要:解決使用ArrayList.toArray()構造數組時(shí)的問(wèn)題。做備忘。

本文鏈接: http://blog.csdn.net/jrq/archive/2005/10/27/517428.aspx

正文:

1. 為了方便按列作外循環(huán),想把ArrayList構造成一個(gè)二維數組,如下:

    ......

  ArrayList result=GetResult();

  int n=result.size();

  String[][] myArray=new String[n][]; //定義二維數組
 
  for (int i=0;i<n;i++)  //構造二維數組
  {
    ArrayList tempArray= (ArrayList)result.get(i);
    myArray[i]=(String[])tempArray.toArray();
  }

  ......

程序可以編譯通過(guò)。

但在運行到myArray[i]=(String[])tempArray.toArray()時(shí),出現java.lang.ClassCastException的錯誤,很奇怪。

花了一晚上時(shí)間,查了N多資料,總算搞定了?,F把問(wèn)題記錄下來(lái),以備參考。

2. 此事從頭說(shuō)起?! ?/p>

ArrayList類(lèi)擴展AbstractList并執行List接口。ArrayList支持可隨需要而增長(cháng)的動(dòng)態(tài)數組。

    ArrayList有如下的構造函數:
  
        ArrayList( )
        ArrayList(Collection c)
        ArrayList(int capacity)

如果調用new ArrayList()構造時(shí),其默認的capacity(初始容量)為10。

參見(jiàn)ArrayList源碼,其中是這樣定義的:

    public ArrayList() {
  this(10);
     }

默認初始化內部數組大小為10。為什么是10?不知道??赡躍UN覺(jué)得這樣比較爽吧。

程序編譯后執行ArrayList.toArray(),把ArrayList轉化為數組時(shí),該數組大小仍為capacity(為10)。

當 裝入的數據和capacity值不等時(shí)(小于capacity),比如只裝入了5個(gè)數據,數組中后面的(capacity - size)個(gè)對象將置為null,此時(shí)當數組強制類(lèi)型轉換時(shí),容易出現一些問(wèn)題,如java.lang.ClassCastException異常等。

解決辦法是:在用ArrayList轉化為數組裝數據后,使用trimToSize()重新設置數組的真實(shí)大小。


3. 本例修改后的代碼修如下,可順利運行:

    for (int i=0;i<n;i++)  //構造二維數組
      {
            ArrayList tempArray= (ArrayList)result.get(i);
            myArray[i]=(String[])tempArray.toArray(new String[0]);   //注意此處的寫(xiě)法
       }

 看看下面這些也許就明白了--

ArrayList.toArray()之一:

public Object[] toArray() {
  Object[] result = new Object[size];
  System.arraycopy(elementData, 0, result, 0, size);
  return result;
}

返回ArrayList元素的一個(gè)數組,注意這里雖然生成了一個(gè)新的數組,但是數組元素和集合中的元素是共享的,Collection接口中說(shuō)這個(gè)是安全的,這是不嚴格的。

下面的例子演示了這個(gè)效果。
 
   ArrayList al=new ArrayList();
   al.add(new StringBuffer("hello"));
   Object[] a=al.toArray();
   StringBuffer sb=(StringBuffer)a[0];
   sb.append("changed");  //改變數組元素同樣也改變了原來(lái)的ArrayList中的元素
   System.out.println(al.get(0));    

這里不要用String來(lái)代替StringBuffer,因為String是不可變的。


ArrayList.toArray()之二:

public Object[] toArray(Object a[]) {
  if (a.length < size)
    a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
   System.arraycopy(elementData, 0, a, 0, size);
   if (a.length > size)
      a[size] = null;
   return a;
}

這個(gè)方法有可能不需要生成新的數組,注意到如果數組a容量過(guò)大,只在size處設置為null。

如果這個(gè)數組a足夠大,就會(huì )把數據全放進(jìn)去,返回的數組也是指向這個(gè)數組,(數組多余的空間存儲的是null對象);要是不夠大,就申請一個(gè)跟參數同樣類(lèi)型的數組,把值放進(jìn)去,然后返回。


4. 網(wǎng)上的資料一:

  public String[] getPlatformIDList()
 
  {
        Vector result = new Vector();
        try
        {
            Statement stmt = conn.createStatement();
            String sql = "SELECT PlatformID FROM Platform";
            rs = stmt.executeQuery(sql);
            while(rs.next())
            {
                result.add(rs.getString(1));
            }       
            if (result.size() > 0)
            {
                String[] str = (String[]) result.toArray(); // 出現ClassCastException
                return str;
            }
            else
                return null;
        }
        catch(Exception e)
        {
            System.err.println(e);
            return null;
        }
        finally
        {
            try
            {
                rs.close();
                conn.close();
            }
            catch(Exception e2)
            {}
        }
    }

    程序運行后,發(fā)現不能將Vector類(lèi)經(jīng)過(guò)toArray()方法得到的Object[]直接轉換成String[]。

    找到用另一個(gè)帶有參數的 toArray(T[] a)方法才可以。

    將該語(yǔ)句改為:

    String[] str = (String[]) result.toArray(new String[1]);即告訴Vector,我要得到的數組的類(lèi)型。

    回想一下,應該是java中的強制類(lèi)型轉換只是針對單個(gè)對象的,想要偷懶,將整個(gè)數組轉換成另外一種類(lèi)型的數組是不行的。


5. 網(wǎng)上的資料二:

    正確使用List.toArray()--
 
   在程序中,往往得到一個(gè)List,程序要求對應賦值給一個(gè)array,可以這樣寫(xiě)程序:
 
    Long [] l = new Long[list.size()];
    for(int i=0;i<list.size();i++)
        l[i] = (Long) list.get(i);
 
    要寫(xiě)這些code,似乎比較繁瑣,其實(shí)List提供了toArray()的方法。
    但是要使用不好,就會(huì )有ClassCastExceptiony異常。究竟這個(gè)是如何產(chǎn)生的,且看代碼:

        List list = new ArrayList();
        list.add(new Long(1));list.add(new Long(2));
        list.add(new Long(3));list.add(new Long(4));
        Long[] l = (Long[])list.toArray();
        for(int i=0; i<l.length; i++)
            System.out.println(l[i].longValue());

    紅色代碼會(huì )拋java.lang.ClassCastException。

    當然,為了讀出值來(lái),你可以這樣code:

        Object [] a =  list.toArray();
        for(int i=0;i<a.length;i++)
            System.out.println(((Long)a[i]).longValue());

    但是讓數組丟失了類(lèi)型信息,這個(gè)不是我們想要得。


    toArray()正確使用方式如下:

        1)  Long[] l = new Long[<total size>];
              list.toArray(l);
 
        2)  Long[] l = (Long []) list.toArray(new Long[0]);

        3)  Long [] a = new Long[<total size>];
              Long [] l = (Long []) list.toArray(a);

6. 總結補充:

      java sdk doc 上講:
 
      public Object[] toArray(Object[] a)

      a--the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same  runtime type is allocated for this purpose.

      如果這個(gè)數組a足夠大,就會(huì )把數據全放進(jìn)去,返回的數組也是指向這個(gè)數組,(數組多余的空間存儲的是null對象);要是不夠大,就申請一個(gè)跟參數同樣類(lèi)型的數組,把值放進(jìn)去,然后返回。
 
     需要注意的是:你要是傳入的參數為9個(gè)大小,而list里面有5個(gè)object,那么其他的四個(gè)很可能是null , 使用的時(shí)候要特別注意。

7. 完畢。

 

                                                                                                              J.R.Q.

                                                                                                    2005.10.27凌晨于廣州 


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java集合框架03——ArrayList和源碼分析
用最直接的大白話(huà)來(lái)聊一聊Java中的反射機制
【Java集合源碼剖析】ArrayList源碼剖析(下)
Java中List轉換為數組,數組轉List
JDK5的新特性:增強for
【小家java】java11新特性(簡(jiǎn)述八大新特性) 首個(gè)重磅LTS版本
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久