優(yōu)化背景
有些場景下(比如入?yún)⒁螅┬枰獙⒓希ū热鏛ist)轉(zhuǎn)為數(shù)組類型舱卡,利用集合的toArray方法應該最為方便的侈玄,對于toArray()無參方法其返回的是Object[]氓侧,強制轉(zhuǎn)其他類型數(shù)組會ClassCastException壹若。推薦使用帶參數(shù)的toArray(T[])晌姚,不過使用上需要注意
list強轉(zhuǎn)數(shù)組拋異常-ClassCastException
@Test
//list強轉(zhuǎn)數(shù)組拋異常-ClassCastException
public void arrayError(){
List<String> listToArray = new ArrayList<>();
listToArray.add("java");
listToArray.add(0, "python");
listToArray.add("php");
listToArray.add("c#");
String[] str = (String[]) listToArray.toArray();
System.out.println(str);
}
異常信息打踊κ铩:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
- 對于toArray()無參方法其返回的是Object[]邑蒋,正確寫法
@Test
//list轉(zhuǎn)數(shù)組姓蜂,使用object對象接受再循環(huán)遍歷轉(zhuǎn)出
public void arrayObject(){
List<String> listToArray = new ArrayList<>();
listToArray.add("java");
listToArray.add(0, "python");
listToArray.add("php");
listToArray.add("c#");
String[] s = new String[listToArray.size()];
Object[] o = listToArray.toArray();
for (int i = 0; i < o.length; i++) {
s[i] = o[i].toString();
}
System.out.println(Arrays.toString(s));
}
輸出:[python, java, php, c#]
另外<T> T[] toArray(T[] a);
解決方案:https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#toArray-T:A-
輸入?yún)?shù)為對應類型數(shù)組,那么應該建立多大的數(shù)組作為參數(shù)呢医吊,推薦為0钱慢,例如我們的有一個List<String>包含100w的數(shù)據(jù)toArray(new String[0]), 創(chuàng)建一個大小為0的數(shù)組,當為輸入數(shù)組長度小于集合size時卿堂,toArray方法會自動創(chuàng)建一個等大數(shù)組放入數(shù)據(jù)并返回滩字。
toArray(new String[100000]),同上輸入的10w數(shù)組比集合size小御吞,toArray方法會重新創(chuàng)建一個等大數(shù)組放入數(shù)據(jù)并返回麦箍,原來的10w數(shù)組等于白建了
toArray(new String[1000000]),輸入數(shù)組長度與集合size相等陶珠,當是一個理想狀態(tài)時挟裂,即數(shù)組size沒有發(fā)生變化(比如沒有并發(fā)情況),那么toArray方法會直接使用輸入數(shù)組并返回揍诽,但如果在輸入數(shù)組創(chuàng)建之后诀蓉,原集合size發(fā)生了變化栗竖,最糟糕的情況會退化為#2
toArray(new String[2000000]),輸入數(shù)組長度大于集合size渠啤,那么toArray方法會直接使用輸入數(shù)組并返回狐肢,當然多出去的那部分數(shù)組量就算浪費了
最優(yōu)化寫法
@Test
//list轉(zhuǎn)數(shù)組-最優(yōu)化寫法
public void OptimizeCode(){
List<String> listToArray = new ArrayList<>();
listToArray.add("java");
listToArray.add(0, "python");
listToArray.add("php");
listToArray.add("c#");
String[] str = listToArray.toArray(new String[0]);
System.out.println(Arrays.toString(str));
}
輸出:[python, java, php, c#]
- 由此可以看出,如果在沒有特殊需要的情況下沥曹,使用#1是比較高效的份名,也是大多數(shù)情況下比較推薦的寫法