在Java中,当对象多了,为了我们方便操作这些类,在JDK1.2版本后,出现了集合Collection。集合Collection就是用于存储集合的容器。
集合特点:
1. 用于存储对象的容器
2. 集合的长度是可变的
3. 集合中不可以存储基本数据类型值
由于需求不同,Java提供了不同的集合,这些集合容器内部数据结构不同,这些不同的容器将他们的共性不断的向上抽取,就形成了集合框架。框架的顶层就是Collection接口。
Java的集合框架主要有三种:List、Set、Map。
需要注意的是,Collection、List、Set、Map都是接口,不是具体的类的实现。比如List list = new ArrayList();List是接口,ArrayList才是具体的类。
Collection常见方法
1. 添加
boolean add(Object obj):向集合中添加元素,如果添加成功则返回true,否则返回false(add(E e);e现在就相当Object)
boolean addAll(Collection coll):添加一个集合
2. 删除
boolean remove(Object obj):删除集合中的元素,如果成功返回true,否则返回false。执行一次,删除开头的一个元素。remove会改变集合的长度。
boolean removeAll(Collection coll):删除集合中包含coll的所有元素
void clear():清空集合
3. 判断
boolean contains(Object obj):如果collection包含指定的元素,返回true,否则返回false。
boolean containsAll(Collection coll)
boolean isEmpty():判断集合中是否有元素,如果不包含元素,则返回true。
4. 获取
int size():返回Collection中的元素数。
Iterator iterator():返回在此collection的元素上进行迭代的迭代器。
5. 其他
boolean retainAll(Collection coll):保留两个Collection的交集
Object[] toArray():将集合转成数组
Iterator迭代器
Collection接口从java.lang.Iterable接口中继承了Iterator iterator()方法,该方法返回一个迭代器。在Java中迭代器Iterator是一个接口,位于java.util.Iterator中,Iterator中有三个方法:
- next():返回迭代的下一个元素
- boolean hasNext():如果仍有元素可以迭代,返回true
- void remove:删除迭代器返回的最后一个元素
例:
Collection c1= new ArrayList();
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
System.out.println(c1);
c1.remove("abc2");
System.out.println(c1);
System.out.println(c1.contains("abc3"));
System.out.println(c1.isEmpty());
System.out.println(c1.size());
Collection c2 = new ArrayList();
c2.add("abc1");
c2.add("abc4");
c1.addAll(c2);
System.out.println(c1);
c1.removeAll(c2);
System.out.println(c1);
c1.add("abc1");
c1.retainAll(c2);
System.out.println(c1);
System.out.println("-------------------");
//迭代器Iterator
Collection coll= new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
coll.add("abc5");
Iterator i = coll.iterator();
System.out.println(i.next());
System.out.println(i.next());
System.out.println(i.hasNext());
i.remove();
System.out.println(coll);
while(i.hasNext()){
System.out.println(i.next());
}
输出结果:
[abc1, abc2, abc3]
[abc1, abc3]
true
false
2
[abc1, abc3, abc1, abc4]
[abc3]
[abc1]
abc1
abc2
true
[abc1, abc3, abc4, abc5]
abc3
abc4
abc5
迭代器原理
迭代器是取出元素的方式,想要取出容器中的数据,因为容器有它自己的数据存储特点,所以迭代器想要取出容器内部的数据,就要依赖容器内部的结构来实现迭代器,否则迭代器与容器不相关,不了解容器内部的数据存储特点,是不知道怎么获取内部数据的。所以迭代器的取出动作应该是直接访问容器内部的元素,所以这个迭代器的实现应该是通过内部类来完成的。
每个容器的内部都有自己的取出方式,这个取出方式在容器的内部,外部不知道,为了能建立起所有容器的统一取出规则,就对其进行了规则的定义:
1.容器内部是否还存在元素hasNext()
2.怎么取出容器内部的元素next()
把这个规则向上抽取,就获得了Iterator接口,所有的容器都实现了这个接口,这个接口就是所有容器公共的取出方法。