A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹善波 中级黑马   /  2012-7-8 13:27  /  1507 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 菠菜(yinshi) 于 2012-7-12 23:31 编辑

import java.util.*;
class  CollectionDemo2
{
    public static void sop(Object obj)
{
   System.out.println(obj);
}
public static void main(String[] args)
{
  method_get();
}
public static void method_get()
{
  ArrayList al=new ArrayList();
   String str;
   int i;
   char[] arr=new char[12];
   al.add("java01");
   
   al.add("java03");
   al.add("java04");
   al.add(1,"java009");
   al.add("java02");
   sop(al);
   ListIterator li=al.listIterator();
   //sop(li.hasPrevious());
      while (li.hasNext())
      {
    Object obj=li.next();
    sop("111111111---"+obj);
     if (obj.equals("java02"))
        {
          li.add("java00222");
          sop("22222222---"+obj);
            }
      li.set("java00333");//为什么每次执行set时都会将li.next()覆盖掉,还有为什么最后obj.equals("java02")为真的时候没有执行?

                  sop("33333333333----"+al);
      }
     }
}

谁有集合的总结没有?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 杨_扬 于 2012-7-8 14:36 编辑

这种题目回答起来答案很短,不知道有没有技术分,不过既然你问了,我还是回答你吧
首先,我很想知道这个程序你运行了吗?如果运行了
为什么每次执行set时都会将li.next()覆盖掉,还有为什么最后obj.equals("java02")为真的时候没有执行?
这个问题我估计你不会问,因为运行结果中豁然现实这
java.lang.IllegalStateException 非法状态异常,而这个异常是  li.set("java00333");抛出的,程序运行到这里抛出了异常,当然最后得打印指令就不会完成了
这里,我额外解释一下为什么会抛出这个异常,查阅JDK 1.6的文档可知

void set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。

参数:
e - 用于替换 next 或 previous 返回的最后一个元素的元素。
抛出:
UnsupportedOperationException - 如果列表迭代器不支持 set 操作。
ClassCastException - 如果指定元素的类不允许该元素添加到此列表。
IllegalArgumentException - 如果指定元素的某个方面不允许该元素添加到此列表。
IllegalStateException - 如果既没有调用 next 也没有调用 previous,或者在最后一次调用 next 或 previous 后调用了 remove 或 add
注意我加红色的文字
正因为最后一次判断结果为真,所以在set前面执行了一次add因此异常了
行了,搞定

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
韦念欣 + 1 赞一个!
尹善波 + 10

查看全部评分

回复 使用道具 举报
建议看下泛型 ,对于集合再多看点就可以解决问题了。
回复 使用道具 举报
Collection
   |--List:元素是有序的,元素可以重复,因为该集合体系有索引。
       |--ArrayList;底层的数据结构是数组。特点:查询速度很快,但是增删稍慢线程不同不
       |--LinkedList:底层使用数据结构是链表。特点:增删速度很快,查询稍慢。
       |--Vector:底层数据结构是数组。特点:线程同步,被ArrayList取代
   |--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复
       |--HashSet:底层是哈系表
                  HashSet保证元素的唯一性是通过hashCode和equals来完成的。
                  如果元素的HashCode值相同,才会判断equals是否为true
                  如果元素的HashCode值不相同,不会判断equals

                  注意,对于判断元素是否存在,以及删除操作,依赖的方法是元素的hashCode和equals。
       |--TreeSet:可以对Set集合的元素进行排序,底层是二叉数。
                  保证元素唯一性的依据:compareTo方法return 0。
                  
                  TreeSet排序的第一种方式:     让元素自身具备比较性。
                  元素需实现Comparable接口,覆盖compareTo方法。
                  这种方式也叫自然顺序,或者叫做默认顺序。
     
   |--Map
       |--Hashtable:底层数据结构是哈希表,不可以存入null键null值,该集合是线程同步的,jdk1.0效率低
       |--HashMap:底层数据结构是哈系表:允许使用null键null值,该机和线程是不同步的,将hashtable代替,jdk1.2效率高。
       |--TreeMap:底层数据结构是二叉数,线程不同步,可以用map集合中的键进行排序   
和Set集合很像。其实Set集合底层就是使用了Map集合。
                              
List:
    特有方法,凡是可以操作角标的方法都是该体系特有的方法。


   add(index,element);
   addAll(index,Collection);

   remove(index);

   set(index,element);

   get(index);
   subList(from,to);
   listIterator();
   int indexOf(obj)获取指定元素的位置
   ListIterator listIterator();  


List集合特有的迭代器。ListIterator 是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合的元素。因为会发生ConcurrentModificationException异常

所以在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的ListIterator方法获得

LinkedList:特有方法
addFirst();
addLast();

getFirst();
getLast();
获取元素,但是不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了代替方法:
offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但是不删除元素。如果集合中没有元素,返回null。

pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,返回null。

Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。
    1.添加
         put(K key,V value)
         putAll(Map<? extends K,? extends V> m)
    2.删除
         clear()
         remove(Object key)
    3.判断
         containsValue(Object value)
         containKey(Object key)
         isEmpty()
    4.获取
         get(Object key)
         size()
         value()
         entrySet()
         keySet()  
map集合的两种取出方式:
1.keyset:将map中所有的键存入到Set集合当中。因为Set具备迭代器。
          所有可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值

          Map集合的取出原理:将map集合转换成set集合,再通过迭代器。     
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马