猿来绘Java-46-Collection接口及其方法

查看Java中Collection接口的源码,我们可以指定该接口的定义:

public interface Collection<E> extends Iterable<E> { ... }

该接口中主要有以下方法,以下将通过该接口的实现类ArrayList的对象进行介绍说明Collection方法的使用

1. add() 、 size() 、 addAll()、 clear()、 isEmpty() 方法的使用

@Test
public void testColl(){
    Collection coll = new ArrayList();

    // boolean add(E e);
    coll.add(123);
    coll.add('a');
    coll.add("ylaihui");

    // size() 返回元素的个数
    System.out.println(coll.size()); // 3

    Collection coll2 = new ArrayList();
    coll2.add(new java.lang.String("ylaihui"));
    coll2.add(new java.lang.StringBuffer("ylaihui"));

    //addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中
    coll.addAll(coll2);

    System.out.println(coll.size());  // 5
    // 调用 ArrayList的 toString方法 [123, a, ylaihui, ylaihui, ylaihui]
    System.out.println(coll);

    // 判断集合是否为空 (集合中是否有元素) return size() == 0
    Collection coll3 = new ArrayList();
    System.out.println(coll3.isEmpty());  // true
    System.out.println(coll.isEmpty());   // false

    // 清空集合元素
    coll.clear();
    System.out.println(coll.isEmpty());  // true
}

 代码输出:

3

5

[123, a, ylaihui, ylaihui, ylaihui]

true

false

true

2. contains()、 containsAll()、 remove()、removeAll()方法的使用

class Order {
    private int id;
    private double price;

    public Order() {
    }

    public Order(int id, double price) {
        this.id = id;
        this.price = price;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Order order = (Order) o;
        return id == order.id &&
                Double.compare(order.price, price) == 0;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", price=" + price +
                '}';
    }
}
@Test
public void testMethod() {
    Collection objects = new ArrayList();
    objects.add(123);
    objects.add(false);
    objects.add(new String("ylaihui"));

    // contains(Object obj):判断当前集合中是否包含obj
    // 会调用obj对象所在类的equals(),并非比较的对象的地址,而是比较的对象的内容
    System.out.println(objects.contains(123));  // 自动装箱 true
    System.out.println(objects.contains("ylaihui")); // true
    System.out.println(objects.contains(new String("ylaihui")));  // true

    Order order = new Order(111, 100.00);
    objects.add(order);
    // 不管有没有重写equals,结果都为true,因为是同一个对象 调用== 或 equals都是true
    System.out.println(objects.contains(order));  // true

    // true, 如果Order类没有重写equals方法,结果为 false
    System.out.println(objects.contains(new Order(111, 100.00))); // true

    Collection coll1 = Arrays.asList(123, false);
    // 判断 objects 集合中是否包含集合 coll1, 子集的关系
    System.out.println(objects.containsAll(coll1)); // true

    // remove(Object obj):从当前集合中移除obj元素。
    objects.remove(new Order(111, 100.00));
    System.out.println(objects);  // [123, false, ylaihui]

    //removeAll():移除两个部分的交集(coll2和objects的交集被移除)
    Collection coll2 = Arrays.asList(123, false, 1111);
    objects.removeAll(coll2);
    System.out.println(objects);  // [ylaihui]
}

 

3. retainAll() 方法的使用(交集)

@Test
public void test3() {
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add(456);
    coll.add(new Order(1111, 100.00));
    coll.add(new String("ylaihui"));
    coll.add(false);

    //retainAll(Collection coll1):交集:获取当前集合和coll1集合的交集,并返回给当前集合
    Collection coll1 = Arrays.asList(123, 456, 789);
    coll.retainAll(coll1);
    System.out.println(coll);  // [123, 456]
}

4. equals() 方法的使用

@Test
public void test4() {
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add(456);
    coll.add(new Order(1111, 100.00));
    coll.add(new String("ylaihui"));
    coll.add(false);

    Collection coll2 = new ArrayList();
    coll2.add(123);
    coll2.add(456);
    coll2.add(new Order(1111, 100.00));
    coll2.add(new String("ylaihui"));
    coll2.add(false);

    //equals(Object obj):要想返回true,需要当前集合和形参集合的元素都相同。
    System.out.println(coll.equals(coll2));  // true
}

 

5. toArray()、hashCode()、 Arrays.asList()

@Test
public void test5() {
    Collection coll = new ArrayList();

    coll.add(123);
    coll.add(456);
    coll.add(new Order(1111, 100.00));
    coll.add(new String("ylaihui"));
    coll.add(false);

    //hashCode():返回当前对象的哈希值
    System.out.println(coll.hashCode());

    //集合 -> 数组:toArray()
    Object[] objects = coll.toArray();
    for (int i = 0; i < objects.length; i++) {
        System.out.println(objects[i]);
    }

    //数组 -> 集合:调用Arrays类的静态方法asList(),基本数据类型的数组无法转换为多元素的集合
    Collection coll2 = Arrays.asList(objects);
    System.out.println(coll2);  // [[123, 456, Order{id=1111, price=100.0}, ylaihui, false]]
    System.out.println("coll2.size() = " + coll2.size());  // 5

    Collection coll3 = Arrays.asList(new String[]{"y", "lai", "hui"});
    System.out.println(coll3);  // [y, lai, hui]
    System.out.println(coll3.size()); // 3

    Collection coll4 = Arrays.asList(new int[]{1, 2, 3});
    System.out.println(coll4);  // [[I@22927a81]
    System.out.println(coll4.size()); // 1

    Collection coll5 = Arrays.asList(new Integer[]{1, 2, 3});
    System.out.println(coll5);  // [1, 2, 3]
    System.out.println(coll5.size()); // 3
}

6. iterator() 方法的使用

 

 

调用 next() 时指针下移

每次调用 Iterator() 方法都会返回一个 Iterator 对象

System.out.println(iterator.getClass());

对于ArrayList集合的迭代器, 是其内部类的类型, class java.util.ArrayList$Itr,该内部类实现了 Iterator接口

@Test
public void testIterator(){
    Collection coll = new ArrayList();
    coll.add(123);
    coll.add(234);
    coll.add("ylaihui");

    Iterator iterator = coll.iterator();

    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }

    // 迭代器遍历结束后,需要重新初始化 否则报异常 NoSuchElementException
    // 可以这样实现,但是不推荐这么使用
    iterator = coll.iterator();
    for (int i = 0; i < coll.size(); i++) {
        System.out.println(iterator.next());
    }
}

7. 迭代器的remove()方法

如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,

再调用remove都会报IllegalStateException。

public class IteratorRemove {
    @Test
    public void testremove(){
        Collection coll = new ArrayList();
        coll.add(111);
        coll.add(222);
        coll.add("ylaihui");

        Iterator it = coll.iterator();
        while(it.hasNext()){
            Object next = it.next();
            if(next.equals(111)){
                it.remove();
            }
        }
        it = coll.iterator();
        while (it.hasNext())
            System.out.println(it.next());
    }
}

おすすめ

転載: blog.csdn.net/asdfjklingok/article/details/118338072