IDE netbeans6.0.1    jdk   1.6测试代码:import java.util.*;public class test {
    
    public static void main(String args[]){
       ArrayList al=new ArrayList();
       String[] a=new String[2];
       String[] out=new String[2];
       System.out.println("使用同一个a在循环中取不同变量的时候:");
       System.out.println("依次a[]的取值:");
       for(int p=6;p<12;p=p+2){
               a[0]=String.valueOf(p);
               a[1]=String.valueOf(p+1);
               System.out.println("{"+a[0]+","+a[1]+"}");
               al.add(a);
           }
       System.out.println("ArrayList的取值:");
       for(int i=0;i<al.size();i++){
           out=(String[])al.get(i);
           System.out.println("{"+out[0]+","+out[1]+"}");
       }
       System.out.println("若用不同的数组add变量的时候");
       al.clear();
       System.out.println("不同的数组取值:");
       String[] s1={"6","7"};
       String[] s2={"8","9"};
       String[] s3={"10","11"};
       System.out.println("{"+s1[0]+","+s1[1]+"}");
       System.out.println("{"+s2[0]+","+s2[1]+"}");
       System.out.println("{"+s3[0]+","+s3[1]+"}");
       al.add(s1);
       al.add(s2);
       al.add(s3);
       System.out.println("ArrayList的取值:");
       for(int i=0;i<al.size();i++){
           out=(String[])al.get(i);
           System.out.println("{"+out[0]+","+out[1]+"}");
       }
    }   
}为什么只用一个a[]在循环中取不同的值的时候al的取值会只有{10,11}??PS:顺便提一个stack的问题,java.util.stack的执行速度和arraylist谁快?印象中stack这种只有单纯的压栈出栈的类的执行速度应该比较快的~~但问题在于java的stack类竟然是继续vector的……这个……所以不清楚了……那stack和vector的执行速度的差别呢?

解决方案 »

  1.   

    在单一线程里面使用:ArrayList的速度要比Stack快,但是,ArrayList不是线程安全的。
    Stack继承Vector,所以,速度应该差不多。
      

  2.   

    晕……似乎不能修改……这是运行结果……让我很困惑……使用同一个a在循环中取不同变量的时候:
    依次a[]的取值:
    {6,7}
    {8,9}
    {10,11}
    ArrayList的取值:
    {10,11}
    {10,11}
    {10,11}
    若用不同的数组add变量的时候
    不同的数组取值:
    {6,7}
    {8,9}
    {10,11}
    ArrayList的取值:
    {6,7}
    {8,9}
    {10,11}
      

  3.   


    我只知道ArrayList的异步的~~这么说stack和vector一样是同步的了?
      

  4.   

    String[] a=new String[2]; 
    字符串数组为2只有两个实例变量,在arraylist里是用数组记录引用,在第一个循环中只是把引用放到了数组里,
    所以在arraylist里的数组内容是{a[0],a[1],a[0],a[1],a[0],a[1]}
    值要根据最后的a[0],a[1]的值来定
      

  5.   

    我想,类和对象,没有什么同步、异步的概念。楼主可能是指线程同步这个概念吧。
    而对于类和对象,一般都说它是否是线程安全的。
    线程同步,我理解是在多线程协作处理一个任务时,所用到的概念。比如,生产者消费者问题中,消费线程必须在生产线程产生产品时,对生产的产品进行消费处理,并且,同一件产品只能处理一次。多个线程并发处理同一个任务时,时常会发生一些不符合逻辑的事情,这时,我们就要想办法让相应的线程,按照任务的流程,协作进行处理,以达到线程同步的目的。
    而线程安全,我理解是,在多个线程访问同一个对象的时候,可以保证对象状态的确定性。线程访问对象,会造成对象状态的改变。而多线程访问同一个对象的时候,对象的状态就会不确定了。线程安全的对象,就会保证在A线程访问对象并且改变对象状态的时候,其他线程不会改变该对象的状态。比如,多个线程同时向一个ArrayList里面添加元素的时候,就会抛出ConcurrentModificationException异常,表示该ArrayList对象的状态已经发生改变,也就是说,两个以上的线程同时在修改同一个ArrayList对象,该对象无法确定是按照哪个线程的做法来处理。使用Vector就会保证,同一时间只有一个线程改变对象的状态。
      

  6.   


    数组对象 String a[]=new String[2];也只是创建一个包含两个字符串对象的引用的数组。
    也就是说,a[0]和a[1]也是字符串的引用。
    你在第一个循环体里面做的事情是:
    1.改变a[0]和a[1]的值,使其成为不同字符串对象的引用(或者理解为指向不同的字符串)。
    2.将a对象添加到ArrayList对象里面。注意:每次循环,你添加的是同一个a对象。该对象包含两个对字符串的引用(与C语言当中的指针概念相仿)
    所以,循环以后,ArrayList对象就有3个相同的对象。因为每次循环都会将对象的内容改变(使对象中两个字符串的引用变成新字符串的引用)。所以,循环结束的结果,应该是对a对象内容最后一次操作的结果{10,11}
      

  7.   

    此贴先都已结……没有分了……= =!不过还是谢谢perferme了……总结一下:问题1:他人已说了……解决方法:在for(int p=6;p <12;p=p+2){这一行后加一句 a=new String();问题2:结论……java stack方法那效率@#$%&……真的想用就自己重写个去……要不然就乖乖用ArrayList或者Vector之类吧……