当前位置: 代码迷 >> J2SE >> 有关ArrayList遍历的有关问题
  详细解决方案

有关ArrayList遍历的有关问题

热度:307   发布时间:2016-04-23 20:20:23.0
有关ArrayList遍历的问题
//ArrayList的使用练习
import java.util.*;
class food{
private String name;
private int num;
private double price;

food(String name,int num,double price){  //直接用构造函数进行赋值初始化
this.name=name;
this.num=num;
this.price=price;
}
public String getName(){
return name;
}
public double getPrice(){
return price;
}
public int getNum(){
return num;
}
}
public class L4_2 {
public static void main(String[] args){
ArrayList A=new ArrayList();
System.out.println("A中的对象数目为:"+A.size());
food a=new food("牛奶",0,4);
food b=new food("啤酒",20,5);
food c=new food("咖啡",8,20);
food e=new food("方便面",14,4);
A.add(a); //ArrayList的添加;添加a对象到A中
A.add(b);
A.add(c);
System.out.println("A中的对象数目为:"+A.size());
for(int i=0;i<A.size();i++){ //ArrayList的遍历
food print=(food)A.get(i);                 //********************************
System.out.println("第"+i+"个食品为:"+print.getName());
}
}
}
 
上面代码是一个ArrayList遍历的练习。***符号注释行中,为什么要强制转换A.get(i)?   为什么可以强制转换A.get(i) ?
求大神指教啊!!!
------解决方案--------------------
因为把food放到ArrayList中之后,food就变成object类型了,拿出来之后需要强制变换。 如果不想强制变换,可以使用泛型。
------解决方案--------------------
这个地方是java泛型,你开始定义arraylist的时候没有指定类型,而当你进行插入操作的时候往里面插入的是food类型,所以取出的时候需要进行类型转换,建议在定义容器时就进行指定容器存储类型,如下所示:
ArrayList<food> A = new ArrayList<food>();
这样取出的时候就不需要进行类型转换了,如下所示
food print = A.get(i); // ********************************
------解决方案--------------------
你的ArrayList没用泛型,用了就不需要强转了
------解决方案--------------------
你也可以当object对象来处理啊,只不过那样的话,就不能像你上面那么写了.可以这样写:
for(int i=0;i<A.size();i++){ //ArrayList的遍历
Object[] print=(Object[])A.get(i);                 //********************************
System.out.println("第"+i+"个食品为:"+print[0]);
}
------解决方案--------------------
你好,其实你的这个问题可以不用去问的,要养成独立思考的习惯,你的这个问题看看JavaSE开发帮助文档list里面的get方法就可以一目了然了,还有就是你要注意养成良好的编码习惯,比如类的名字首字母大写,变量名字首字母要小些,像你那样写的话也没有问题,只是不太规范哦
------解决方案--------------------
因为把food放到ArrayList中之后,food就变成object类型了,拿出来之后需要强制变换。 如果不想强制变换,可以使用泛型。
不强转的话,可以使用建议在定义容器时就进行指定容器存储类型,如下所示:

ArrayList<Food> A = new ArrayList<Food>();//建议类名大写

------解决方案--------------------
问题1:为什么要强制转换A.get(i)?
 因为你的ArrayList A=new ArrayList();并没有指定具体的类型,
源代码中定义:

public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }
private transient Object[] elementData;

也就是说elementData是Object类型。如果你不强制转换,显示错误Type mismatch: cannot convert from Object to food。也就说是不能从object类型转换成food类型。你可能会想,我明明是food类型啊,为什么在集合里面变成了object类型。那么因为在A.add(a);的时候就把foot类型转换成了object类型。

问题2:为什么可以强制转换A.get(i)?
这个问题涉及到向上转型和向下转型。向上转型是安全的,向下转型可能是不安全的。这时候object类型转为food类型是安全的,为什么,因为a,b,c本来就是一个food实例,我们把它转回去,当然不会出错。所以说可以转。但是如果a,b,c不是food实例,转就会出现问题。

建议你看看ArrayList源码和向下向上混合转型的相关知识。
  相关解决方案