java中 List类及其子类转换成数组
e.g. List中盛放 SomeClass 对象
两个方法
1. toArray() 返回 Object[],无法强制转换成 SomeClass[],Object[]和SomeClass[]均是Object子类,想要转换,就必须对SomeClass[]中每个元素依次转换
Object[] o= new Object[2];
o[0]= "1 ";
o[1]= "2 ";
String[] ss = new String[2];
ss[0] = (String)o[0];
ss[1] = (String)o[1];
2.
SomeClass[] sc = null;
sc = List.toArray(new SomeClass[List.size()]);
含义,先创建一个大小为List容量的SomeClass[],通过toArray(),将里面的对象全部复制到SomeClass[]中,然后用sc指向这个新创建的SomeClass[]
根据java源码
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;
}
如果看api仍然看不懂,建议看源码,自己学习分析,不要动不动就要google,先自己分析,再来求教他人。
容器存放内容
如果容器中盛放类,数组,存放的实际上是引用,而非值。如果是基本类型,如整型,String等,则为值。
在ArrayList, HashMap中多次犯错
e.g.
HashMap<String[], Integer> map = new HashMap<String[], Integer>();
for i ... {
String[] strs = new String[3]; 1
map.put(strs, i);
}
语句 1 不能放在 for 外面,debug的时候,发现,HashMap中,存储的是 strs 地址,如果放在外面,则整个过程中,HashMap只有一组 key-value,HashMap 存储的内容一直未变。
3. 增加或删除容器元素
通过遍历容器来增删元素时,要注意修改索引值,根据api,增加或删除后,该元素之后的所有元素都会发生变化,索引值均加1或减1
e.g.
for(int i = 0; i < List.size(); i++) {
if (some condition) {
List.remove(i);
i--;
}
}