黑马程序员技术交流社区

标题: 关于集合的引用是什么? [打印本页]

作者: 李玉江    时间: 2013-6-1 17:34
标题: 关于集合的引用是什么?
class  Demo
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add("java01");
                al.add("java02");
                al.add("java03");
                sop(al);
                Iterator it =al.iterator();
                while (it.hasNext())
                {
                        Object obj=it.next();
                        if (obj.equals("java02"))
                        {
                                it.remove();
                        }
                        sop("obj="+obj);
                }
                sop(al);
                //老师说将java02的引用从集合中删除了 。这个引用是角标吗?
                //删除后那在打印集合的时候像数组一样没有al[1]了吗?
                //应该不是吧也就是集合是怎么调用它的元素的?

        }
}//在并发异常中如要用listIterator操作删除集合的元素,集合进行访问的时候不也会出错吗?

作者: First    时间: 2013-6-3 19:07
首先要理解的是ArrayList 是动态的数组,
这样增加元素是会增加数组的长度,减少元素是会缩短数组的长度。
要实现这样的效果就要new 出新数组。
换句话说把原来那个数组里的元素遍历后重新放到一个新的数组中,这样是否可以理解?

贴个动态数组的例子,希望楼主能够理解我的观点:
  1. /*
  2. 现在要求定义一个数组(Array),里面定义了一个整型数组,但是此整型数组属于动态分配大小,
  3. 即:所以大小由程序指定,并在此基础上实现以下的两个子类。
  4.         *反转类:可以将数组的内容反转排列
  5.         *排序类:可以对数组进行排序的操作
  6. */

  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.Collections;
  10. import java.util.Comparator;
  11. import java.util.List;

  12. public class MyDynamicArray {

  13.         public static void main(String []args){
  14.        
  15.                 ReverseArray al = new ReverseArray();
  16.                 SortArray sa = new SortArray();

  17.                 al.add(1);
  18.                 al.add(15);
  19.                 al.add(7);
  20.                 al.add(19);
  21.                 al.add(5);
  22.                 al.add(29);
  23.                 al.add(9);
  24. /*
  25.                                 al.add(7);
  26.                 al.add(19);
  27.                 al.add(5);
  28.                 al.add(29);
  29.                 al.add(9);
  30.                 sa.add(7);
  31.                 sa.add(19);
  32.                 sa.add(5);
  33.                 sa.add(29);
  34.                 sa.add(9);   */
  35.                
  36.                 sa.add(1);
  37.                 sa.add(15);
  38.                 sa.add(7);
  39.                 sa.add(19);
  40.                 sa.add(5);
  41.                 sa.add(29);
  42.                 sa.add(9);


  43.                 System.out.println(al.toString());
  44.                 //System.out.println(al);
  45.                 al.reverse();
  46.                 System.out.println(al.toString());
  47.                
  48.                 System.out.println(sa.toString());
  49.                 sa.sort();
  50.                 System.out.println(sa.toString());

  51.         }
  52. }


  53. class Array {
  54.         private int [] array = new int[10];
  55.         private int size =0;
  56.        
  57.         public int getSize() {
  58.                 return size;
  59.         }
  60.         public void setSize(int size) {
  61.                 this.size = size;
  62.         }
  63.          
  64.         public int get(int index){
  65.                 return array[index];
  66.         }
  67.        
  68.         public int set(int index, int element){
  69.                 array[index] = element;
  70.                 return get(index);
  71.         }
  72.        
  73.         public boolean add(int i){
  74.                 size++;
  75.                 System.out.println(size);
  76.                 if(size>10)
  77.                         array = copyArray(array);

  78.                 array[size-1] = i;
  79.                 return true;
  80.         }
  81.        
  82.         private int[] copyArray(int[] array){
  83.                        
  84.                 int []array1 = new int[array.length+1];
  85.                
  86.                 for(int i = 0; i<array.length;i++){
  87.                         array1[i] = array[i];
  88.                 }
  89.                 return array1;
  90.         }
  91.        
  92.         public boolean remove(int index){
  93.                 if(index>=size)
  94.                         return false;
  95.                 else{
  96.                         int[] array1 = new int[size - 1];
  97.                         for(int i = 0, count = 0; i<size;i++){
  98.                                 if(i == index)
  99.                                         continue;
  100.                                 array1[count++] = array[i];                               
  101.                         }
  102.                         array = array1;
  103.                         size--;
  104.                         return true;
  105.                 }
  106.         }
  107.        
  108.         @Override
  109.         public String toString() {
  110.                 // TODO Auto-generated method stub
  111.                 Integer [] intList = new Integer[size];
  112.                
  113.                 for(int i = 0;i<size;i++){//注意角标越界。
  114.                         intList[i] = get(i);
  115.                 }
  116.                 List list = Arrays.asList(intList);
  117.                 return list.toString();
  118.         }       
  119. }

  120. class ReverseArray extends Array{
  121.        
  122.         public void reverse(){
  123.                 int size = getSize();
  124.                 int half = size>>1;
  125.                
  126.                 for(int i =0,x=0; i< half;i++){
  127.                         x = get(i);
  128.                         set(i, get(size-1-i));
  129.                         set(size-1-i,x);
  130.                 }
  131.         }

  132.        
  133.         public void sort(){
  134.                 int size = getSize();

  135.                 for(int z=0,x=0;z<size-1;z++){
  136.                         for(int y=z+1; y<size;y++){//y=z+1; 而不是1;
  137.                                 if(get(z)>get(y)){
  138.                                         x = get(z);
  139.                                         set(z, get(y));
  140.                                         set(y,x);
  141.                                 }
  142.                         }
  143.                 }
  144.         }
  145.        
  146. }

  147. class SortArray extends Array{
  148.         public void sort(){
  149.                 int size = getSize();

  150.                 for(int z=0,x=0;z<size-1;z++){
  151.                         for(int y=z+1; y<size;y++){
  152.                                 if(get(z)>get(y)){
  153.                                         x = get(z);
  154.                                         set(z, get(y));
  155.                                         set(y,x);
  156.                                 }
  157.                         }
  158.                 }
  159.         }
  160. }
复制代码

作者: 王瀛    时间: 2013-6-4 00:06
我是这样理解的,在ArrayList集合中,"java02"这个对象有一个集合中的名字(索引、角标),当使用Iterator迭代器进行hasNext判断后,迭代器将这个集合中的名字告诉了外界,obj这时找到了对应的集合中元素。

在使用remove进行判断移除时,迭代器仅仅是将这个对象元素在集合中移除了,但是这个对象还是在的,他被obj指向,所以while循环内打印出来的相当于是集合中原来所有元素的遍历结果。

出循环后,打印的al就是迭代器进行了一轮操作后的集合元素

作者: 殇_心。    时间: 2013-6-4 16:16
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2