首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

关于ArrayList,该如何处理

2012-12-19 
关于ArrayList关于下面的一段代码import java.util.*public class Test{public Test(){}static void prin

关于ArrayList
关于下面的一段代码


import java.util.*;
public class Test{
     public Test(){}
     static void print(ArrayList al){
         al.add(2);
         al = new ArrayList();
         al.add(3);
         al.add(4);
     }
     public  static void main(String[] args){
     ArrayList al=new ArrayList();
     al.add(1);
     print(al);
     System.out.println(al.get(1));
     }
}
}

为什么运行的结果是2,菜鸟求解惑
[最优解释]
你那个代码和下面的效果是一模一样的、原理估计你也就明白了。
import java.util.*; 
public class Test{
      public Test(){}
      static void print(ArrayList al){
          al.add(2); 
         a2 = new ArrayList();
          a2.add(3); 
         a2.add(4); 
     }
      public  static void main(String[] args){
        ArrayList al=new ArrayList();
          al.add(1);
        print(al);
        System.out.println(al.get(1));
      }
 }
 }

[其他解释]
当然是2了,这个看似引用传递,实则不是。

static?void?print(ArrayList?al){
?????????al.add(2);//这里的a1为传递过来的引用,它指向原传递的对象,下面虽然修改了指向,但原来list对象在内存中的值还是存在的,因为在该方法外面(mian方法的第二句)有引用。
?????????al?=?new?ArrayList(); //这一句代码,将a1的引用指向了新的list对象,即内存中新产生的对象。
?????????al.add(3);  //这一句和下面的一句操作的都是新的对象,由于a1失去了原来指向的对戏那个的引用,故无法再操作原来的对象。
?????????al.add(4);
?????}
?????public??static?void?main(String[]?args){
???????ArrayList?al=new?ArrayList();
?????????al.add(1);
???????print(al);//在方法内的a1失去了原来的引用,但只在方法内起作用,在main方法中a1始终指向的最初的对象,或者说内存,即在main方法中的a1无法操作方法内新的对象。
???????System.out.println(al.get(1));
?????}

[其他解释]
引用:
当然是2了,这个看似引用传递,实则不是。
Java code?12345678910111213static void print(ArrayList al){         al.add(2);//这里的a1为传递过来的引用,它指向原传递的对象,下面虽然修改了指向,但原来list对象在内存中的值还是存在的,因为在该方法外面(mian方法的第二句)有引用。      ……
  既然是新的对象的话,那原来的对象不是应该是丢失被内存释放了么?MAIN 方法中的 AI 对象又是指的哪个?
[其他解释]
main方法中的ArrayList al=new ArrayList();是一个对象
print中的al = new ArrayList();又是一个对象  你去仔细看看new关键字的定义就明白了
[其他解释]
引用:
引用:当然是2了,这个看似引用传递,实则不是。
Java code?12345678910111213static void print(ArrayList al){         al.add(2);//这里的a1为传递过来的引用,它指向原传递的对象,下面虽然修改了指向,但原来list对象在内存中的值还是存在的,因为在该方法……


原对象没有失去引用呀,在main方法里a1还在被引用呀。
你好好考虑一下申明对象或者说变量的作用范围。
[其他解释]
拜托,ArrayList取值的下标识从0开始的。你的ArrayList没有定义类型所以它是按照下标来取值的。
[其他解释]
引用:
关于下面的一段代码
Java code?123456789101112131415161718import java.util.*;public class Test{     public Test(){}     static void print(ArrayList al){         al.add(2);         al = new ArrayLis……


al = new ArrayList();
         al.add(3);
         al.add(4);

这儿只添加了两个!所以为2
[其他解释]
1楼正解。。
[其他解释]
一楼解释的清楚!
[其他解释]
2楼说得很清楚,引用传递的问题

[其他解释]
print(a1) a(2)及a1中有1和2,方法中a1=new ArryList(),及再用new开辟空间,与main()中的a1无关,所以a1.get(1)=2
[其他解释]
这样好像还是值传递
[其他解释]
return 一个List就不会是2了
[其他解释]
引用:
引用:关于下面的一段代码
Java code?123456789101112131415161718import java.util.*;public class Test{     public Test(){}     static void print(ArrayList al){         al.add(2);       ……

额。。。添加三个是不是为3呢?
是al.get不是al.size()
[其他解释]
引用:
引用:引用:关于下面的一段代码
Java code?123456789101112131415161718import java.util.*;public class Test{     public Test(){}     static void print(ArrayList al){       ……


额,不好意思,先前看得不仔细,
get()是通过下标获取的,所以无论你添加的是否是int型,也通过下标,而不是添加的数据
[其他解释]
不错的帖子,具有代表性
[其他解释]


static void print(ArrayList al) {
//方法是值传递,此时的参数 al 是传递过来的 al,还是指向的那块内存地址
al.add(2);//添加元素2,添加到同样的地址里面
al = new ArrayList();//第二个对象,已经不是传递过来的al了,虽然名字还是al,但是新对象对应的是新的内存地址
al.add(3);//添加元素,与main方法里面的al没有关系,在新地址里面添加,所以不会改变原先al地址里面的内容
al.add(4);
}

public static void main(String[] args) {
//这是第一个对象,你可以理解为al指向一块内存地址
ArrayList al = new ArrayList();
al.add(1);//添加元素1,向al指向的地址里面放入元素
print(al);//调用方法
System.out.println(al.get(1));
}


[其他解释]
顶一楼!!!
[其他解释]
按照执行顺序下来    有问题吗?


[其他解释]
不错的帖子,这样的问题,程序中应该避免下!
[其他解释]
print方法里面的a1和main方法的a1有区别 3,4是放到了print方法中新new的ArrayList对象里面
[其他解释]
楼主搞清楚java中的引用传递和值传递就自然清楚了
[其他解释]
null
[其他解释]
好好看下1楼的代码   这个问题挺不错的

热点排行