Java开发实战经典里P498有这段代码:import java.util.ArrayList ;
import java.util.List ;
public class ArrayListDemo04{
public static void main(String args[]){
List<String> allList = null ;
allList = new ArrayList<String>() ; // 指定操作的泛型为String
allList.add("Hello") ; // 此方法由Collection接口而来
allList.add(0,"World") ; // 在第一个位置上添加新的内容
allList.add("MLDN") ; // 向Collection中加入内容
allList.add("www.mldn.cn") ;
String str[] = allList.toArray(new String[]{}) ; // 指定好类型
System.out.print("指定数组类型:") ;
for(int i=0;i<str.length;i++){
System.out.print(str[i] + "、") ;
}
System.out.print("\n返回对象数组:") ;
Object obj [] = allList.toArray() ; // 返回Object类型
for(int i=0;i<obj.length;i++){
String temp = (String)obj[i] ; // 进行向下转型
System.out.print(temp + "、") ;
}
}
};请问 划红线那句代码什么意思??怎么使用了new String[]{}??
import java.util.List ;
public class ArrayListDemo04{
public static void main(String args[]){
List<String> allList = null ;
allList = new ArrayList<String>() ; // 指定操作的泛型为String
allList.add("Hello") ; // 此方法由Collection接口而来
allList.add(0,"World") ; // 在第一个位置上添加新的内容
allList.add("MLDN") ; // 向Collection中加入内容
allList.add("www.mldn.cn") ;
String str[] = allList.toArray(new String[]{}) ; // 指定好类型
System.out.print("指定数组类型:") ;
for(int i=0;i<str.length;i++){
System.out.print(str[i] + "、") ;
}
System.out.print("\n返回对象数组:") ;
Object obj [] = allList.toArray() ; // 返回Object类型
for(int i=0;i<obj.length;i++){
String temp = (String)obj[i] ; // 进行向下转型
System.out.print(temp + "、") ;
}
}
};请问 划红线那句代码什么意思??怎么使用了new String[]{}??
如果传入的数组类型与集合中的元素类型不相符那么就会抛出java.lang.ArrayStoreException异常
补充一下:如果只传入一个零长度的数组,就像代码中的那样“new String[]{}”,那么还需要在创建一个allList长度的String数组对象存储返回值,就会多创建一个零长度的String数组对象。
假如传入把allList的长度也传入,就像这样“new String[allList.size()]”,那么allList的内容就会直接存入该数组对象,那么就少创建一个对象了。
而又必须向下兼容,现在当然有泛型之类的,可以实现的更美一点但是在那个黑暗的21世纪(以下省略万字)
假如以绝大多数都传入0长度代码做为推出后面结论的依据,恐怕也说不过去,因为依据本身就不是分妥当,是吧?!
T[] toArray(T[] a) 参数传入一个数组,输出和参数同类型的数组,该参数相当于告诉方法要转为什么类型,所以一般传入个0长度的数组就可以了,即代码中的new String[]{}或new String[0]
或许方法定义为toArray(Class<T>)会好理解一些,可能是考虑兼容的问题吧
之前的版本应该是Object[] toArray(Object[] a)
String str[] = allList.toArray(String.class);只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
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);
if (a.length > size)
a[size] = null;
return a;
}
Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned array is that of the specified array.通过参数类型来确定返回值类型。-------String str[] = allList.toArray(new String[]{}) ; // 指定好类型
-------将allList中的元素按集合中的顺序以String[]形式返回。
public <T> T[] toArray(Class<T> clazz) {
//if (a.length < size)
T[] a = (T[])java.lang.reflect.Array.newInstance(clazz, size);
System.arraycopy(elementData, 0, a, 0, size);
return a;
}