黑马程序员技术交流社区
标题:
list
[打印本页]
作者:
尹善波
时间:
2012-7-8 13:27
标题:
list
本帖最后由 菠菜(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);
}
}
}
谁有集合的总结没有?
作者:
杨_扬
时间:
2012-7-8 14:34
本帖最后由 杨_扬 于 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因此异常了
行了,搞定
作者:
王渠
时间:
2012-7-8 15:25
建议看下泛型 ,对于集合再多看点就可以解决问题了。
作者:
康大玮
时间:
2012-7-8 17:44
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集合,再通过迭代器。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2