引用数据类型(即对象,实际上是保存对象的引用变量).
2.Java的集合类主要由两个接口派生而出: Collection和Map, Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类.
3.Collection集合的两个子接口:Set和List , 分别代表了无序集合和有序集合. Queue是Java提供的队列实现.
4.Collection集合的高级功能:
5.Collection集合和Iterator接口.
Iterator接口也是java集合框架, Collection集合用来盛装对象, 而Iterator接口用来遍历集合. Iterator对象也被称为迭代器.
Iterator接口中的三个方法:
boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true
Object next():返回集合里下一个元素.
void remove():删除集合里上一次next()方法返回的元素.
6.并发修改异常
(1)
Collection<String> c=new ArrayList<String>();
c.add("hello");
c.add("world");
c.add("java");
c.add("javase");
System.out.println("c:"+c);
Iterator<String> it=c.iterator();
while(it.hasNext()) {
String s=it.next();
if(s.equals("javase")) {
c.remove(s);//错误,将会引发异常
c.add("hhh");//同上
//修改方法: it.remove();
}
s="emmm"; //对s变量进行赋值,不会影响集合元素
}
System.out.println(c);
当用迭代器遍历集合时,不能通过Collection集合修改(增加或删除)集合元素, 只有通过Iterator里的remove()方法来移除 上一次next()方法返回的元素,否则将会引发ConcurrentModificationException异常.
Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中其他线程修改),程序立即引发并发修改异常,而不是显示显示修改之后的结果,这样可以避免共享资源而引发的潜在问题.
另外一种解决并发修改异常的方法:使用集合遍历,使用集合删除
Collection<String> c=new ArrayList<String>();
c.add("hello");
c.add("world");
c.add("java");
c.add("javase");
Object[] arrstr=c.toArray();
for(int x=0;x<arrstr.length;x++) {
String s=(String)arrstr[x];
if(s.equals("javase")) {
c.remove(s); //正确
}
}
System.out.println(c);
for(String s:c) {
System.out.println(s);
}
结论: 当使用迭代器遍历集合时,只能通过迭代器来删除集合中的元素; 也可以通过将集合转换数组,然后遍历过程中对集合元素进行增删. 不能使用迭代器遍历集合而通过集合来增删元素,这样会引起并发修改异常.
7.可以使用增强for循环来遍历集合, 当使用增强for来遍历集合时, 集合也不能增删元素,否则会引发ConcurrentModificationException异常.
例: Collection c=new ArrayList();
for(Object obj: c){
String s=(String)obj;
if(s.equals("...")){
c.add("...."); //错误,会引发异常
}
}
解决方法:将集合转换成数组,然后遍历的时候可以修改集合.
8.Collection集合的高级功能
boolean addAll(Collection c):添加一个集合中所有元素
boolean removeAll(Collection c):删除的高级功能,( 删除所有还是删除一个算是删除?)
结论:删除一个算是删除;
例:Collection<String> c=new ArrayList<String>();
c.add("abc1");
c.add("abc2");
c.add("abc3");
Collection<String> c2=new ArrayList<String>();
c2.add("abc1");
System.out.println(c.removeAll(c2)); //true
System.out.println(c); //[abc2,abc3]
System.out.println(c2); //[abc1]
boolean containsAll(Collection c):结论:包含所有算是包含;
例:Collection<String> c=new ArrayList<String>();
c.add("abc1");
c.add("abc2");
c.add("abc3");
Collection<String> c2=new ArrayList<String>();
c2.add("abc1");
c2.add("abc2");
c2.add("abc5");
System.out.println(c.containsAll(c2)); //false
System.out.println(c); //[abc1,abc2,abc3]
System.out.println(c2); //[abc1,abc2,abc5]
boolean retainAll(Collection c):A集合对B集合取交集, 交集元素全部到A集合中去, 如果A集合中元素发生变化, 则返回true,否则返回false.
例:Collection<String> c=new ArrayList<String>();
c.add("abc1");
c.add("abc2");
c.add("abc3");
Collection<String> c2=new ArrayList<String>();
c2.add("abc1");
c2.add("abc2");
System.out.println(c.retainAll(c2)); //true
System.out.println(c); //[abc1,abc2]
System.out.println(c2); //[abc1,abc2]