1. 程式人生 > >把Java陣列轉換為List時的注意事項

把Java陣列轉換為List時的注意事項

本文由唐尤華 校稿,翻譯自 mlangc
不幸的是並不是每件事都盡如人意。舉個例子,現在將一個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
    list = Arrays.asList(ArrayUtils.toObject(new int[] { 1, 2 }));
  • 請注意:一般情況下推薦使用原始資料型別陣列而不是裝箱後的原始資料型別列表。
    如果你打算將一個引用型別的陣列轉換為list,可以直接使用Arrays.asList: List list =
    Arrays.asList(new String[] { “a”, “b” });

不要忘了告訴和你一起工作的人以確保他們不和你犯同樣的錯誤。當然,你也可以選擇僅僅記住那些使用Arrays.asList方法時可能出現問題的地方,並使用普通的for迴圈來代替,但是那會使你的程式碼很雜亂,還會帶來效能方面的問題

相關推薦

Java陣列轉換List注意事項

本文由唐尤華 校稿,翻譯自 mlangc 不幸的是並不是每件事都盡如人意。舉個例子,現在將一個Java陣列轉換為List。當然,我們可以使用Arrays.toList方法,但是如果沒有慎重思考就隨便使用幾乎肯定會產生令人討厭的意外。考慮完下面這段程式並預測其輸

Java 陣列轉換ListList陣列,要怎麼辦。

簡單記錄下,就留個筆記,順便挖個坑。 1 陣列轉換為List 呼叫Arrays類的靜態方法asList。 String[] arr = new String[] {"str1", "str2"};

JAVA物件轉換JSON日期格式轉換處理

PS→無奈:受思深處宜先退,得意濃時便可休。 今天在返回json物件到前端時發現前端接收到的資料裡面的時間格式被拆開了,原因如下:         預設JSON對DATE型別會轉換成一個多屬性物件, 而不是單獨的一個字串, 在某些應用處理上不是很方便,  可以利用Js

陣列轉換List(Arrays.asList)後add或remove出現UnsupportedOperationException

從別的部落格上看到了出現這種情況的分析,我也不再自己從頭分析了,附上大神分析好的。 Java中,可以使用Arrays.asList(T... a)方法來把一個數組轉換為List,返回一個受指定陣列支援的固定大小的列表。此方法同 Collection.toArray()一起

排序陣列轉換高度最小的二叉搜尋樹

題目描述:給一個排序陣列(從小到大),將其轉換為一棵高度最小的二叉搜尋樹。 樣例:給出陣列 [1,2,3,4,5,6,7], 返回 首先,先來看一下二叉搜尋樹(也稱為二叉排序樹)的定義:它或者是一棵

Java 陣列轉換List,然後執行add或remove拋異常UnsupportedOperationException問題的解決

在使用Arrays.asList()後呼叫add,remove這些method時出現java.lang.UnsupportedOperationException異常。這是由於Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是

lintcode——排序陣列轉換高度最小的二叉搜尋樹

/**  * Definition of TreeNode:  * class TreeNode {  * public:  *     int val;  *     TreeNode *left, *right;  *     TreeNode(int val) {  *         this->

java 使用jaxb xml 直接轉換ben

有一個 alt new ima 告訴 repo artifact style log 首先有一個xml 文件。 使用 trang-20091111.jar 把xml 文件轉化為 .xsd 文件(jar 下載地址 : http://mvnrepository.com/art

[轉]Java中怎樣數組轉換ArrayList

com supported array 文檔 java 靜態 拷貝 light size 方法匯總: Element[] array = {new Element(1),new Element(2),new Element(3)}; ArrayList<E

leetcode 108. 將有序陣列轉換二叉搜尋樹(java)

將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。 本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。 示例: 給定有序陣列: [-10,-3,0,5,9], 一個可能的答案是:[0,-3,9,-10,null,5],它可以

json轉換list陣列

   JS中程式碼            var lstBasicDataType = new Array();        

Java基礎IO流將一個文字檔案的內容轉換List

import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.uti

JSON陣列形式字串轉換List<Map<String,String>>的8種方法

package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject;

java中將陣列轉換集合,不能進行增刪操作解惑

</pre>java中我們經常會使用Arrays.asList(陣列);將陣列轉換為List型別,但是卻不能對轉換後的List進行增刪。示例如下:<pre name="code" class="java">import java.util.*; cl

Java 任意長度byte陣列轉換int陣列

嗯。最近工程上遇到一個byte陣列轉換為int的問題,解決過程中遇到了幾個坑,經過各種查資料終於還是解決了。撒花。 Java的位運算以及byte陣列與其他型別資料的轉換比c/c++感覺麻煩一些。這裡簡單說明一下byte陣列和int的轉換吧。 總所周知,int型別資料在Jav

java利用工具fastjson將陣列轉換JsonArray

一:下載fastjson-1.2.38.jar 二:java程式碼 @Test public void test4() { int[] my = new int[2]; my[0] = 6; my[1] = 8; try { JSONArray jsonObj = (

java 將毫秒轉換 *天**分*秒 的格式

public static String formatDuring(long mss) { long days = mss / (1000 * 60 * 60 * 24);

list轉換JsonArray,使用JsonValueProcessor處理有關資料型別

使用JSONArray jsonarray = JSONArray.fromObject(list);可以輕鬆將list轉換為array,但是當list中含有data型別的資料的時候,就會轉換不正確,

JAVA下整形和String陣列轉換列表

資料整理自網上,若有錯誤請及時通知博主。 JAVA下陣列轉換為列表 java的陣列一般可以分為int陣列和String陣列。先看下面的例子: public static void main(String[] args) {