1.前言
前文中提及Collection接口,故该文来讨论Collection接口中常用的方法.
public interface Collection<E> extends Iterable<E> int size(); boolean isEmpty(); boolean contains(Object o); Iterator<E> iterator(); Object[] toArray(); <T> T[] toArray(T[] a); boolean add(E e); boolean remove(Object o); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c);boolean retainAll(Collection<?> c); boolean equals(Object o); int hashCode();
2.添加
(1). add(Object obj) : 添加元素对象至当前集合.
(2). addAll(Collection other) 将other集合中的其他所有元素对象添加至当前集合.
例1 : add方法
Collection c = new ArrayList(); c.add(12); c.add("hexua"); c.add(new Object()); c.add(new Person("hexua", 20)); System.out.println(c); 控制台 [12, hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}]
此处是Person类的代码.
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
说明 :
(1). 由于Collection是接口,不能构造实例,new其实现类的对象,即接口的引用指向实现类的对象(体现多态).
(2). 第一次调用add(Object obj)方法时,因为形参是引用类型,而传入的是12基本数据类型为什么并没有报错呢?
自动装箱.类型为包装类Integer.
(3). 由于集合的元素对象都是引用数据类型,打印集合对象,其中显示的是Object对象的地址,而Person类重写了toString方法,所以将显示如上.
(4). 打印集合对象c,默认调用c.toString方法.
例2 : addAll方法
Collection o = new ArrayList(); o.add("AA"); o.addAll(c); System.out.println(o); 控制台 [AA, 12, hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}]
说明 :
(1). 先调用add()方法,"AA"对象被加入到集合中,接着调用addAll方法,将c中所有元素对象依次加入到o集合中.
3.判断
(1). boolean isEmpty(Collection c) : 判断集合元素个数是否为0.
(2). int size() : 返回当前集合元素个数.
(3). boolean contains(Object obj) : 判断当前集合中是否有该obj对象.
(4). boolean containsAll(Collection other) : 判断当前集合中的元素是否包含了other集合中的所有元素.如果other集合是当前集合的子集,返回true,否则返回false.
例1 : 集合c与o与上文同.
System.out.println(c.size()); System.out.println(c.isEmpty()); System.out.println(c.contains(new String("hexua")); System.out.println(c.contains(new Person("hexua", 20))); System.out.println(o.containsAll(c)); 控制台 4 false true true true
说明 :
(1). 集合c有四个元素对象,故输出size()方法,将输出4.
(2). 集合显然有元素对象,所以siEmpty()方法返回false.
(3). 判断集合c中是否包含了字符串hexua,底层使用for循环结构,并调用equals方法依次判断集合中是否有与"hexua"相等的元素对象.String类中重写了equals方法.比较的是内容是否相等,而非引用.所以返回true.
(4). contains括号内new了一个Person类的对象,显然其与集合中的Persob类的对象的引用不等.但由于Person类中重写了equals方法,所以返回的是true.
4.删除
(1). void clear() : 清空集合中的所有元素.
(2). boolean remove(Object obj) : 从当前集合中删除与obj相同的元素对象.
(3). boolean removeAll(Collection other) : 从当前集合中删除所有与other集合元素中相同的元素.
(4). boolean retainAll(Collection other) : 删除两个集合中不同的元素,使得当前集合只保留与other集合中相同的元素.
c.remove(12); System.out.println(c); Collection o = new ArrayList(); o.add("hexua"); c.removeAll(o); System.out.println(c); c.clear(); System.out.println(c.isEmpty()); 控制台 [hexua, java.lang.Object@3b07d329, Person{name='hexua', age=20}] [java.lang.Object@3b07d329, Person{name='hexua', age=20}] true
说明 :
(1). clear清空了集合的元素,isEmpty()判定true.
ArrayList类中clear()源码.
public void clear() { modCount++; final Object[] es = elementData; for (int to = size, i = size = 0; i < to; i++) es[i] = null; }
5.其他
(1). Object[] toArray() : 返回包含当前集合中所有元素的数组.
(2). hashCode() : 返回当前集合对象的哈希值.
(3). iterator() : 返回迭代器对象,用于遍历集合对象.
Object[] arr = c.toArray(); for (Object element : arr) { System.out.println(element); } System.out.println(c.hashCode()); 控制台 12 hexua java.lang.Object@3b07d329 Person{name='hexua', age=20} 234414305
说明 :
(1). 当前集合调用toArray方法返回一个Object数组,并运用foreach循环结构打印数组元素.
(2). 调用hashcode()方法返回哈希值.
6.杂谈
(1). 既然有可以让集合转换为数组的方法(如toArray),那么有没有让数组转换为集合的方法呢?
是有的.如Arrays中的静态方法(Arrays.asList(Object... objexts))
String[] s = new String[]{"AA", "BB", "CC"}; Collection o = Arrays.asList(s); System.out.println(o); 控制台 [AA, BB, CC]
(2).
对第一种情况,asList的形参是可变参数Object...,传入arr相当于传入三个Integer对象.(感觉这个过程有点像Python中的解包)所以集合的元素对象有3个.
对第二种情况,因为形参是引用类型,所以传入arr相当于传入一个int[]类型的数组,所以集合的元素对象有1个.
Integer[] arr1 = new Integer[]{1, 2,3}; Collection c1 = Arrays.asList(arr1); System.out.println(c1.size()); int[] arr2 = new int[]{1,2,3}; Collection c2 = Arrays.asList(arr2); System.out.println(c2.size()); 控制台 3 1
7.迭代器
(1). iterator()
Collection coll =new ArrayList();
//创建迭代器
//Iterator是接口类型
Iterator iter =coll.iterator();
(2). 方法
//判断下一个元素是否存在 while(iter.hasNext()) { //如果存在,就将指针下移,将下移以后的集合元素返回 System.out.println(iter.next()); }