java容器中toArray的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java容器中toArray的用法相关的知识,希望对你有一定的参考价值。
请高手帮我看看toArray的用法 其返回的是哈希码 是不是需要重写
import java.util.*;
public class Test1
public static void main(String[] args)
Name n1 = new Name("f1","l1");
Name n2 = new Name("f2","l2");
Collection c1 = new ArrayList();
c1.add(n1);
c1.add(n2);
c1.add("hello");
c1.add("world");
c1.add(new Integer(100));
int a = c1.size();
System.out.println(a);
System.out.println(c1.contains(n1));
System.out.println(c1);
System.out.println(c1);
Object[] x=c1.toArray(new Object[0]);
for(int i=0;i<x.length;i++)
System.out.println(c1.toArray());
Iterator y = c1.iterator();
while(y.hasNext())
//Name n = (Name)y.next();
System.out.print(y.next()+" ");
class Name
String firstname,lastname;
Name(String f1,String f2)
this.firstname = f1;
this.lastname = f2;
public String getFirstname()
return firstname;
public String getLastname()
return lastname;
public String toString()
return firstname+" "+lastname;
public boolean equals(Object o)
if(o instanceof Name)
Name name = (Name)o;
return (firstname.equals(name.firstname))
&&(lastname.equals(name.lastname));
return super.equals(o);
public int hashCode()
return firstname.hashCode();
其运行结果是这样的
c1.toArray()返回的是一个Object类型的数组,即Object[]
你的这段代码
for(int i=0;i<x.length;i++)
System.out.println(c1.toArray());
System.out.println(c1.toArray());等效于System.out.println(c1.toArray().toString());打印的是数组对象的字符串表示形式,不是你说的哈希码 参考技术A
java中不带参数的toArray()是不行的,运行时会报ClassCastException;
java中toArray正确用法有三种,toArray方法都需要带参数,分别如下:
public static String[] vectorToArray1(Vector<String> v)
String[] newText = new String[v.size()];
v.toArray(newText);
return newText;
public static String[] vectorToArray2(Vector<String> v)
String[] newText = (String[])v.toArray(new String[0]);
return newText;
public static String[] vectorToArray3(Vector<String> v)
String[] newText = new String[v.size()];
String[] newStrings = (String[])v.toArray(newText);
return newStrings;
toArray()在Java中的用法
toArray()在Java中的用法
一直不太熟悉toarray()的用法 现整理如下
一.Incident
- public static void main(String[] args) {
- List<String> list = new ArrayList<String>();
- list.add("1");
- list.add("2");
- String[] tt = (String[]) list.toArray(new String[0]);
- }
这段代码是没问题的,但我们看到String[] tt =(String[]) list.toArray(new String[0]) 中的参数很奇怪,然而去掉这个参数new String[0]却在运行时报错.
二. Root Cause Analysis
经研究发现toArray有两个方法:
- public Object[] toArray() {
- Object[] result = new Object[size];
- System.arraycopy(elementData, 0, result, 0, size);
- return result;
- }
不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException,这也就是上述问题的root cause了。
- 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;
- }
而带参数的toArray方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常。
三. Solutions
因此在使用toArray的时候可以参考以下三种方式
- 1. Long[] l = new Long[<total size>];
- list.toArray(l);
- 2. Long[] l = (Long[]) list.toArray(new Long[0]);
- 3. Long[] a = new Long[<total size>];
- Long[] l = (Long[]) list.toArray(a);
四.Further Consideration
该容器中的元素已经用泛型限制了,那里面的元素就应该被当作泛型类型的来看了,然而在目前的java中却不是的,当直接String[] tt =(String[]) list.toArray()时,运行报错。回想一下,应该是java中的强制类型转换只是针对单个对象的,想要偷懒,将整个数组转换成另外一种类型的数组是不行的,这和数组初始化时需要一个个来也是类似的。
以上是关于java容器中toArray的用法的主要内容,如果未能解决你的问题,请参考以下文章