Java中l(wèi)ist、array與set的互轉(zhuǎn)

一帘瞭、array 轉(zhuǎn) list

1??直接使用Arrays的asList方法

String[] str = new String[]{"a", "b", "c"};
List<String> list = Arrays.asList(str);

2??for循環(huán)方式

String[] str = new String[]{"a", "b", "c"};
List<String> list = new ArrayList<>();
for (int i = 0; i < str.length; i++) {
    list.add(str[i]);
}

二淑掌、array 與 Set 的互轉(zhuǎn)

三、list 轉(zhuǎn) array

public static void main(String[] args) {
    List<String> list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    String str[] = (String[]) list.toArray();
    System.out.println(str);
}

編譯雖通過(guò)蝶念,但運(yùn)行時(shí)報(bào)Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object;抛腕。正確的寫法如下:

String str[] = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
    str[i] = list.get(i);
}

解釋:Java中允許向上和向下轉(zhuǎn)型,但是這個(gè)轉(zhuǎn)型是否成功是根據(jù)Java虛擬機(jī)(JVM)中這個(gè)對(duì)象的類型來(lái)實(shí)現(xiàn)的媒殉。JVM中保存了每個(gè)對(duì)象的類型担敌,而數(shù)組也是一個(gè)對(duì)象,數(shù)組的類型是[Ljava.lang.Object适袜。把[Ljava.lang.Object轉(zhuǎn)換成[Ljava.lang.String顯然是不可能的事情柄错,因?yàn)檫@里是一個(gè)向下轉(zhuǎn)型,而虛擬機(jī)只保存了這是一個(gè)Object的數(shù)組,不能保證數(shù)組中的元素是String的售貌,所以這個(gè)轉(zhuǎn)型不能成功给猾。數(shù)組里面的元素只是元素的引用,不是存儲(chǔ)的具體元素颂跨,所以數(shù)組中元素的類型還是保存在Java虛擬機(jī)中的敢伸。

四、解決

由三恒削,可以把這個(gè)問(wèn)題歸納到下面這個(gè)模型:

Object objs[]=new Object[10];
String strs[]=(String[])objs;

這樣子和剛才上面運(yùn)行錯(cuò)誤是一樣的池颈。如果修改代碼如下:

String strs[]=new String[10];
Object objs[]=strs;

這樣子就可以了。所以這個(gè)問(wèn)題可以歸結(jié)為 Java 轉(zhuǎn)型規(guī)則的問(wèn)題钓丰。JDK5 中躯砰,Java 數(shù)組開(kāi)始支持范型,這樣可以保證在集合和 Map 中的數(shù)據(jù)類型的安全携丁∽列可是,List 的 toArray() 返回的竟然是 Object [] 讓人很迷惑梦鉴。開(kāi)發(fā)者可以根據(jù)范型李茫,直接返回相應(yīng)的 T[]。查看 JDK 源碼肥橙,發(fā)現(xiàn) List 轉(zhuǎn)化為 array 有兩個(gè)方法:
1??public Object[] toArray();
該方法把 List 中的全部元素返回一個(gè)相同大小的數(shù)組魄宏,數(shù)組中的所有元素都為 Object 類型。
2??public T[] toArray(T[] a);
該方法把 List 中的全部元素返回一個(gè)相同大小的數(shù)組存筏,數(shù)組中的所有元素都為 T 類型宠互。
List 如此設(shè)計(jì)是因?yàn)?Java 編譯器不允許 new 范型數(shù)組。也就是說(shuō)不能這么定義一個(gè)數(shù)組:T arr=new T[size];椭坚。但是卻可以用 T[] 來(lái)表示數(shù)組名秀,而且可以把數(shù)組強(qiáng)制轉(zhuǎn)化為 T[]。比如 List 中的public T[] toArray(T[] a)是這么實(shí)現(xiàn)的:

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

由上藕溅,因?yàn)椴恢肋@個(gè)數(shù)組的類型,必須通過(guò)反射機(jī)制創(chuàng)建這個(gè)數(shù)組(a.getClass().getComponentType()是取得一個(gè)數(shù)組元素的類型)继榆。最終巾表,List 轉(zhuǎn)換為 Array 可以這樣處理:

ArrayList<String> list=new ArrayList<String>();
String[] str= new String[list.size()];
list.toArray(str);

反過(guò)來(lái),如將數(shù)組轉(zhuǎn)換為 List 如下:

String[] str = {"a","b","c"};
List list = java.util.Arrays.asList(str);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末略吨,一起剝皮案震驚了整個(gè)濱河市集币,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠忠,老刑警劉巖鞠苟,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡当娱,警方通過(guò)查閱死者的電腦和手機(jī)吃既,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跨细,“玉大人鹦倚,你說(shuō)我怎么就攤上這事〖讲眩” “怎么了震叙?”我有些...
    開(kāi)封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)散休。 經(jīng)常有香客問(wèn)我媒楼,道長(zhǎng),這世上最難降的妖魔是什么戚丸? 我笑而不...
    開(kāi)封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任划址,我火速辦了婚禮,結(jié)果婚禮上昏滴,老公的妹妹穿的比我還像新娘猴鲫。我一直安慰自己,他們只是感情好谣殊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布拂共。 她就那樣靜靜地躺著,像睡著了一般姻几。 火紅的嫁衣襯著肌膚如雪宜狐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天蛇捌,我揣著相機(jī)與錄音抚恒,去河邊找鬼。 笑死络拌,一個(gè)胖子當(dāng)著我的面吹牛俭驮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播春贸,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼混萝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萍恕?” 一聲冷哼從身側(cè)響起逸嘀,我...
    開(kāi)封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎允粤,沒(méi)想到半個(gè)月后崭倘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翼岁,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年司光,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琅坡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飘庄,死狀恐怖脑蠕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跪削,我是刑警寧澤谴仙,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站碾盐,受9級(jí)特大地震影響晃跺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毫玖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一掀虎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧付枫,春花似錦烹玉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至掂榔,卻和暖如春继效,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背装获。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工瑞信, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穴豫。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓凡简,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親精肃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潘鲫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 看到@心藍(lán)更新的教程,一眼喜歡上這副畫的意境肋杖,今天花了好長(zhǎng)時(shí)間終于臨摹完了。 夕陽(yáng)無(wú)限好挖函,只是近黃昏状植。自古...
    圓滾滾的小阿瓜閱讀 921評(píng)論 11 14
  • 在親密關(guān)系過(guò)程中浊竟,克里斯把它分為四個(gè)階段:絢麗、幻滅津畸、內(nèi)省和啟示振定。 絢麗,作者用了“月暈現(xiàn)象”一詞來(lái)替代肉拓。因月亮本...
    像荼蘼一樣閱讀 1,862評(píng)論 1 4
  • 1.協(xié)議模型 2.模型概述 我們先考慮一下當(dāng)你辦公室使用局域網(wǎng)打CS后频,你double kill的消息傳遞給其他小伙...
    蝸牛1991閱讀 443評(píng)論 0 0