Java數組轉換爲List如何避免意外

我們直接用Arrays.toList方法將java數組轉換爲List時,會産生意外的問題,現在我們來談談把Java數組轉換爲List時的注意事項。

現在將一個Java數組轉換爲List。可以使用Arrays.toList方法,但是使用幾乎肯定會産生令人討厭的意外。

package com.wordpress.mlangc.arrays;
import java.util.Arrays;
public class ArraysToList
{
  public static void main(final String[] args)
  {
    System.out.println(
        Arrays.asList(new String[] { "a", "b" }));
    System.out.println(
        Arrays.asList(new Integer[] { 1, 2 }));
    System.out.println(
        Arrays.asList(new int[] { 1, 2 }));
    System.out.println(
        Arrays.asList(new String[] { "a", "b" }, "c"));
  }
}


  由于Javadoc對Arrays.asList的說明相當模糊,對你來說預測出程序的運行結果可能有點困難,下面我們來一步步的揭曉答案:
第9行就像我們根據API所預測的那樣在我們的控制台輸出了“[a,b]”,這正是我們樂意看到的。
第12行也一樣如預期那樣輸出了“[1,2]”。
第15行就不同了,當然這裏不是說15與12的不同,而是一個是int另一個是Integer,因此在我們的控制台列印出了類似這樣的結果“[[[email protected]]”,這就不再如預期那樣了。我們得到一個包含數組中標識每個元素唯一性的地址串的list,而不是包含兩個Integer對象的list。
看到上面的結果後,對于第18行輸出的類似“[[Ljava.lang.String;@20cf2c80, c]”這樣的結果就不會感到驚奇了。
  但是發生了什麽呢?前兩個列印語句與我們預期的結果相同,因Java語言規範規定了調用一個聲明爲foo(T… t)的方法,比如foo(new T[]{bar,baz})等同于foo(bar,baz)這樣的調用。在Arrays.asList方法中T是參數類型,因此它必須爲一個Object 類型,但是int不是,而int[]卻是。這就是爲什麽第16行的聲明等同于 Arrays.asList(new Object[] { new int[] { 1, 2 } })。
Arrays.asList(new Object[] { new int[] { 1, 2 } })
  最後也是非常重要的一點,在第19行的聲明從一開始就産生了調用問題。我們告訴編譯器我們需要一個包含String數組和字符串的list,正如我們預期的那樣我們得到了我們想要的東西。
  到現在爲止解釋了這麽多,但是我們還可以從中學到更多的東西:問題的真正來源並不是可變參數設計的很糟糕;相反的我認爲這個設計很好。關于這個問題在Effective Java2第 42項規範中已經解釋地很清楚了,Arrays.asList違反了該項規範,事實上Arrays.asList作爲一個反面教材,告訴了我們在使用Java的可變參數設計API時爲什麽要非常小心。在這裏我不會再重複那篇文章裏的回答,但是你自己確實需要親自去讀一下它,但是考慮到完整性我必須指出 上面有問題的聲明在使用Java1.4的編譯器下編譯的時候就會報錯,這是相當好的。現在我們仍然會使用Arrays.asList,但是爲了安全要求我 們知道所面臨的問題的複雜性。下面是在將數組轉換爲lists的時候我們需要遵循的規則,做到這些可以確保沒有任何意外的情況發生:
如果你要將一個數組轉換爲list時最好將其轉換爲一個string,使用Arrays.toString代替上面的方法吧。即使對于基本類型的數組該方法也不會出現任何問題。
如果你打算將一個基本類型的數組轉換爲所對應的封裝類型的list,使用Apache Commons Lang吧,關于這個可能你很早就在專案中使用過了,類似下面這樣使用ArrayUtils.toObject:
List<Integer> list = Arrays.asList(ArrayUtils.toObject(new int[] { 1, 2 }));
  請注意:一般情況下推薦使用原始數據類型數組而不是裝箱後的原始數據類型列表。
如果你打算將一個引用類型的數組轉換爲list,可以直接使用Arrays.asList:
List<String> list = Arrays.asList(new String[] { "a", "b" });
  不要忘了告訴和你一起工作的人以確保他們不和你犯同樣的錯誤。當然,你也可以選擇僅僅記住那些使用Arrays.asList方法時可能出現問題的地方,並使用普通的for循環來代替,但是那會使你的代碼很雜亂,還會帶來效能方面的問題。

更多相關文章
  • 實現,我們經常會用到緩存數據就是把數組保存成xml文檔方便處理,下面我們提供一個數組轉換成xml文檔的類,有需要的朋友可以參考一下.<? $elementLevel = 0 ; function array_Xml(
  • <!--asp教程.net c int[]數組轉換成decimal[]數組實例--><%int32[] arr = { 1, 2, 3 };ilist<decimal> lists = new list<decimal>();foreach (int32 i ...
  • <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-trans
  • 數組與Json格式其實是非常像了,我們可以利用相關的函數來進行相互轉換的,下面來給各位整理一個從mysql讀取數據之後再利用php函數轉換成json回傳,具體如下數組轉Json<?php header("Content-Type: text/html; charset=utf-8&q ...
  • 文章給大家提供一個php字符串與byte字節數組轉化類示例,希望文章對各位同學會有所幫助. 代碼如下 <?php /** * byte數組與字符串轉化類 */ class Bytes { /** * 轉換一個Stri
  • PHP 提供了 simplexml_load_string 方法用來解析 XML 格式的字符串,並返回 SimpleXMLElement 對象.不過一般數組是更爲適用的,所以也會有轉換爲普通數組的需求,這個方法測試完全奏效,支持 SimpleXMLElement 對象多層嵌套的情況.提供兩個參數,第 ...
  • 各位如果對于java中的string數組轉long數組不是非常 的了解我們可以和111cn小編一起來看看小編整理了三種轉換方法 ,希望文章對大家有幫助.方法 一,把數組for 下一個轉String[] yq1012= {"123", "234", " ...
  • 一篇php 利用json_decode強制json數據轉換成數組的簡單應用實例參考文檔,我們利用了var_dump(json_decode($str,true)); 就把json轉換成我們想要的數據了. 代碼如下 $a['d'][]=1;$a['d'][]=2;echo $str=json_enco ...
一周排行
  • 學而時習之,不亦悅乎?--<論語> 注釋:<論語>是儒家學派的經典著作之一,由孔子的弟子及其再傳弟子編撰而成.它以語錄體和對話文體爲主,記錄了孔子及其弟子言行,集中體現了孔子的政治主張論理思想 ...
  • 1) try catch finally中的finally不管在什麽情況之下都會執行,執行的時間是在程序return 之前. 2) Java 編譯器不允許有顯示的執行不到的語句塊,比如return之後就不可能再有別的
  • 這個背後有一個悲傷的故事,所以就取了個這麽有點像標題黨的標題,具體什麽我就不說了.很早之前就知道css3裏面有這麽個東西,而且隨著規範的改變,它的版本也改了幾次.也就是因爲這個flexbox伸縮盒布局太強大了,以至于 ...
  • 本文章來給大家介紹asp.net中CSharpThinking 擴展方法 ,有需要了解的朋友可進入參考.本章主要描述擴展方法的應用及相關原理.一, 演變 1.1 擴展方法特征 1)必須在一個靜態方法中. 2)至少有一
  • 以下是收集的是各種實用的 .htaccess 代碼片段,或許你要用的可以直接在這裏找到,絕大多數情況可以直接用,個別的還是測試一下有問題小修改吧.重新和重定向 注意:首先需要伺服器安裝和啓用mod_rewrite模塊
  • php,curl函數組可以幫助我們把機器爲裝成人行爲來抓取網站,下面來分享兩個例子,一個是訪問http網頁,一個訪問https網頁,下面一起看看.每次要使用curl的時候,總要查一堆資料.現在將常用的幾句保存下來,省 ...
  • 蘋果iphone6 plus退出qq方法圖解
    在iphone6 plus登錄QQ之後我們發現直接按home退出之後QQ還是可以接受到消息
  • js中replace函數是可以執行正則替換與普通的字符替換了,下面我們來給各位介紹利用replace 來替換指定的字符變量吧.先來個最基礎的,看下面代碼 代碼如下 var str = 'sasldfjlkdsjf';
  • windows 2003關閉IE增強的安全配置(安全站點)
    用伺服器的朋友可發現如果我們在伺服器上打開一個網頁ie會提示我們要先輸入增加到安全站點然後
  • Ubuntu安裝FTP伺服器及配置FTP用戶步驟
    ubuntu系統中的ftp安裝的是vsftpd了,這個也是linux內核系統中常用的ftp ...