集合
1.概述
面向对象的语言将一切事物抽象为对象,为了方便地对多个对象进行操作,Java提供了集合类。(为什么不用对象数组呢?数组的长度不可变)
数组和集合的区别是什么呢?
数组和集合都是容器:
A.数组长度固定,集合长度可变
B.内容不同:数组存储的是同一种类型的元素;集合存储的可以是不同类型的元素
C.数据类型问题:数组既可以存基本类型,也可以存引用类型;集合只能存引用类型
2.深层次
集合是数据的容器,生活中装物件的东西各式各样,可以对它们进行分类:用来喝水的水杯、用来吃饭的饭碗、用来储存食物的冰箱等等,所以Java里的集合类在一定规则(如需求)下可以划分为多种,即集合类不是一个类,而是多个类(这些类的数据结构不同)。但这些集合类又是有共性的,如获取、添加、删除等。往上抽象,即可得到集合类的继承体系。这个体系是怎样的呢?
所有集合类的超类是Collection,下分List和Set
List下有三类:ArrayList、Vector、LinkedList
Set下有两类:HashSet、TreeSet
3.Collection
继承体系的根层次都是抽象的,要么是抽象类要么是接口,Collection就是接口,它是集合的顶层接口,它里面的元素,有唯一的,有重复的,有的有序,有的无序。
A.功能
E是泛型,没学。此处均认为E e: Object obj
添加:
boolean add(E e) 添加一个元素
boolean addAll(Collection<? extends E> c) 添加一个集合元素
删除:
void clear() 移除所有元素
boolean remove(Object o) 移除指定元素
boolean removeAll(Collection<?> c) 移除指定集合元素
判断:
boolean contains(Object o) 集合中是否包含指定元素
boolean containsAll(Collection<?> c) 集合中是否包含指定的集合元素
boolean isEmpty() 集合是否为空
获取:
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器
长度:
int size() 返回集合的长度
(小面试题:数组有length()方法吗?String有length()方法吗?集合有length()方法吗?
数组有length属性,但没有length()方法;String有length()方法;集合没有length()方法,有size()方法
另外StringBuffer有length()方法,它还有一个capacity()方法)
交集:
boolean retainAll(Collection<?> c) 两个集合共有的元素
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)
把集合转换为数组:
Object[] toArray() 把集合元素转换为对象数组
<T> T[] toArray(T[] a) 把同种类型元素的集合转换为这种类型的数组
4.测试Collection里的方法
Collecton是接口,而且在继承体系里它也没有直接实现类,它只有子接口。API里的描述是:
“JDK不提供此接口的任何直接实现:它提供更具体的子接口(如 Set和List)实现。”
这里用Collection接口的子接口List下的非抽象已知实现类ArrayList类来测试 。
package knowledge_basic_02;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
//接口不能实例化
//Collection c=new Collection()错误
//通过多态方法形式实例化Collection
Collection c=new ArrayList();
System.out.println("c:"+c);
//添加功能
System.out.println("add:"+c.add("abc"));
c.add("ABC");
c.add("def");
System.out.println("c:"+c);
//移除功能
System.out.println("remove:"+c.remove("A"));
System.out.println("remove:"+c.remove("ABC"));
System.out.println("c:"+c);
c.clear();
System.out.println("c:"+c);
//判断功能
c.add("abc");
c.add("def");
c.add("ghi");
c.add("jkl");
System.out.println("c:"+c);
System.out.println("contains:"+c.contains("ghi"));
System.out.println("contains:"+c.contains("xyz"));
System.out.println("isEmpty:"+c.isEmpty());
//长度功能
System.out.println("size:"+c.size());
//创建集合1
Collection c1=new ArrayList();
c1.add("ab");
c1.add("cd");
c1.add("ef");
System.out.println("c1:"+c1);
//创建集合2
Collection c2=new ArrayList();
c2.add("gh");
c2.add("ij");
c2.add("kl");
c2.add("ef");
System.out.println("c2:"+c2);
//removeAll:移除集合c2里的一个就算成功,返回true
System.out.println("c1.removeAll(c2):"+c1.removeAll(c2));
System.out.println("c1:"+c1);
//addALL
System.out.println("c1.addAll(c2):"+c1.addAll(c2));
System.out.println("c1:"+c1);
//containsAll:包含集合c2里的所有就算成功,返回true
System.out.println("c1.contains(c2)"+c1.containsAll(c2));
//retainAll:c1存的是交集元素,c2不变
System.out.println("c1.retainsAll(c2)"+c1.retainAll(c2));
System.out.println("c1:"+c1);
System.out.println("c2:"+c2);
}
}
c:[]
add:true
c:[abc, ABC, def]
remove:false
remove:true
c:[abc, def]
c:[]
c:[abc, def, ghi, jkl]
contains:true
contains:false
isEmpty:false
size:4
c1:[ab, cd, ef]
c2:[gh, ij, kl, ef]
c1.removeAll(c2):true
c1:[ab, cd]
c1.addAll(c2):true
c1:[ab, cd, gh, ij, kl, ef]
c1.contains(c2)true
c1.retainsAll(c2)true
c1:[gh, ij, kl, ef]
c2:[gh, ij, kl, ef]