在实际开发中,需要将使用的对象存储于特定数据结构的容器中。JDK提供了这样的容器—集合。
Collection是一个接口,定义了集合相关的操作方法。
其派生了两个子接口:
* List: 可重复集
* Set: 不可重复集
元素是否重复是依靠元素自身equals方法比较的结果而定的。
集合中存储的都是引用类型元素,并且集合只保存每个元素对象的引用,而并非将元素对象本身存入集合。
public class CollectionDemo1 {
public static void main(String[] args) {
Collection c = new ArrayList();
/*
* boolean add(E e)
* 向集合中添加元素。
* 当元素成功添加到集合后返回true
*/
c.add("one");
c.add("two");
c.add("three");
System.out.println(c);
/*
* int size()
* 返回当前集合的元素个数
*/
System.out.println("size:"+c.size());
/*
* boolean isEmpty()
* 判断当前集合是否不含有任何元素
* 空集合
*/
boolean isEmpty = c.isEmpty();
System.out.println("是否是空集:"+isEmpty);
/*
* void clear()
* 清空集合元素
*/
System.out.println("清空集合");
c.clear();
System.out.println("size:"+c.size());
/*
* 集合判断是否包含指定元素是依靠元素的equals比较的结果。
* 只要集合中有元素与给定元素比较为true,则认为包含。
*/
boolean contains = c.contains("one");
System.out.println("包含:"+contains);
/*
* boolean remove(E e);
* 从集合中删除指定元素。删除成功返回true
* 只删除集合中第一个与给定元素equals比较为true的元素
*/
c.remove("one");
System.out.println(c);
//================== 集合的批量操作 ===================
Collection c1 = new ArrayList();
c1.add("java");
c1.add("c++");
c1.add(".net");
System.out.println(c1);
Collection c2 = new HashSet();
c2.add("ios");
c2.add("android");
c2.add("linux");
System.out.println(c2);
/*
* 取并集
* boolean addAll(Collection c)
* 将给定集合中的所有元素添加到当前集合中
* 添加后只要当前集合元素数量发生了变化,则返回true
*/
boolean flag = c1.addAll(c2);
System.out.println(c1);
System.out.println(flag);
Collection c3 = new ArrayList();
c3.add("java");
c3.add("c++");
c3.add("windows");
/*
* boolean containsAll(Collection c)
* 判断当前集合是否包含给定集合中的所有元素
*/
boolean contains = c1.containsAll(c3);
System.out.println("全包含:"+contains);
/*
* 从c1集合中删除两个集合中共有的元素
*/
c1.removeAll(c3);
System.out.println(c1);
}
}
迭代器:
/**
* 遍历集合
* Collection提供了统一的遍历元素的方式:迭代器模式
*
* Iterator iterator()
* 获取用于遍历当前集合的迭代器
*
* java.util.Iterator是一个接口,规定了用于遍历集合元素的相关方法,
* 不同的集合提供了相应的实现类。无需记住那些实现类的名字,只将他们当做Iterator即可。
*
* 遍历集合遵循:问,取,删的步骤,其中删除不是必须的操作。
*/
public class CollectionDemo2 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("one");
c.add("#");
c.add("two");
c.add("#");
c.add("three");
c.add("#");
c.add("four");
//获取用于遍历当前集合的迭代器
Iterator it = c.iterator();
/*
* boolean hasNext() 问的过程
* 该方法是判断集合中是否还有元素可以取出
*
* E next() 取的过程
* 获取集合中下一个元素
*/
while(it.hasNext()){
String str = (String) it.next();
if("#".equals(str)){
/*
* 在使用迭代器遍历集合时,不要使用集合的方法增删元素,否则会引发并发更改异常。
*/
//c.remove(str);
/*
* 迭代器提供了remove方法,用来删除next方法取出的元素。
*/
it.remove();
}
System.out.println(str);
}
System.out.println(c);
}
}
集合对泛型的支持
/**
* 集合支持泛型,而泛型是用来约束集合中元素的类型。
*/
public class CollectionDemo3 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
//只能添加String类型的元素
c.add("one");
c.add("two");
c.add("three");
c.add("four");
//遍历集合元素
for(String str:c){
System.out.println(str);
}
/*
* 迭代器也应当指定泛型,而泛型的实际类型
* 应当与它遍历的集合的泛型类型一致。
*/
Iterator<String> it = c.iterator();
while(it.hasNext()){
//获取元素时不需要再造型了
String str = it.next();
System.out.println(str);
}
}
}
增强型for循环
public class NewForDemo {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
System.out.println(c);
/*
* 新循环并非新的语法,新循环是编译器认可,而不是虚拟机认可。
* 使用新循环遍历集合时,编译器会将它改为迭代器方式遍历。
* 所以在使用新循环遍历集合时,不能通过集合的方法增删元素。
*/
for(Object o:c){
//Iterator it = c.iterator();
//while(it.hasNext()) {
// Object o = it.next();
String str = (String)o;
System.out.println(str);
}
}
}