唠唠SE的集合-01——Collection接口

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 14:00   22   0

0. 泛型

在使用集合之前,要先了解泛型:

当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常,所以jdk1.5加入了泛型机制。

以下内容要配合第一部分Collection同步。

1. Collection

为什么不愿意用数组?长度固定 ̄へ ̄

集合只能存储对象(引用数据类型),但数组可以存储基本数据类型

集合做什么

  1. 将对象添加到集合
  2. 从集合中删除对象
  3. 从集合中查找一个对象
  4. 从集合中修改一个对象

也就是增删改查

注意:集合和数组中存放的都是对象的引用而非对象本身

来瞅一个简单的栗子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Collection collection = new ArrayList();
        collection.add(123);
        collection.add("abc");
        collection.add(new Date());
    }
}

100517_HGLT_3041734.png

为什么在Collection的下面出现了黄线?

jdk1.5之后引入泛型,集合在声明/创建时要标记集合所能存放的数据类型,这样再取出元素的时候就是对应的数据类型(无需强转

那我们来加上泛型,看看加入泛型之后的Collection:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add("abc"); // 编译报错
        collection.add(new Date()); // 编译报错
    }
}

100733_j23K_3041734.png

提示:Integer的集合不允许加入String!这就有点像int[] ,也就是数组了!保证每个集合只放一类东西。

(-- 后续涉及到泛型,统一用E或者T等大写字母表示 --)

Collection有两个子接口:List(表)和Set(集)

List有序,可重

Set无序,不可重

Collection作为单列集合的顶级接口,定义了一些通用方法:

增加

1:add() 将指定对象存储到容器中。add 方法的参数类型是T,便于接收任意对象,返回值为boolean,代表添加是否成功

2:addAll() 将指定集合中的所有元素添加到调用该方法和集合中

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5); // 一次添加一个元素
        collection.add(123); // jdk1.5新引入了自动拆装箱机制
        Collection<Integer> collection2 = new ArrayList<Integer>();
        collection2.addAll(collection); // 一次性导入一个集合
    }
}

删除

3:remove() 将指定的对象从集合中删除,返回值为boolean,代表删除是否成功

4:removeAll() 将指定集合中的元素删除

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5);
        collection.add(123);
        
        boolean flag1 = collection.remove(5); // 从集合中删除 5
        boolean flag2 = collection.remove(6); // 集合中没有6,没有任何反应
        System.out.println(flag1);
        System.out.println(flag2);
        
        collection.removeAll(collection); // 删除自身的所有元素
        System.out.println(collection.size()); // 0
    }
}

修改

5:clear() 清空集合中的所有元素

注意这里的clear与removeAll(自身)的效果是一样的

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5);
        collection.add(123);
        
        collection.clear(); // 删除自身的所有元素
        System.out.println(collection.size()); // 0
    }
}

判断

6:isEmpty() 判断集合是否为空

7:contains() 判断集合何中是否包含指定对象

8:containsAll() 判断集合中是否包含指定集合。使用equals()判断两个对象是否相等

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5);
        collection.add(123);
        
        System.out.println(collection.contains(5)); // true
        System.out.println(collection.contains(10)); // false
        
        System.out.println(collection.isEmpty()); // false
        collection.clear();
        System.out.println(collection.isEmpty()); // true
    }
}

获取

9:int size() 返回集合容器的大小

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5);
        collection.add(123);
        
        System.out.println(collection.size()); // 2
        System.out.println(collection.isEmpty()); // false
        
        collection.clear();
        System.out.println(collection.size()); // 0
        System.out.println(collection.isEmpty()); // true
    }
}

转成数组

10:toArray() 集合转换数组

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(5);
        collection.add(123);
        
        Integer[] arr = new Integer[collection.size()]; // 先创建一个跟集合大小一样的数组
        arr = collection.toArray(arr); // 再把数组传入,collection返回的数组就是真正转换出来的数组
    }
}

------------------------------多说几句----------------------------------

在面向对象的专题中,我们提过继承和多态,在集合这个范畴中可以清晰地看到它的利用之处:

如果我们定义一个动物园,里面可以放入任意动物,这个时候只需要在泛型中标记Animal,那么所有Animal以及它的子类都可以被加入到集合中:

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<Animal> zoo = new ArrayList<>();//jdk7增加了菱形泛型,等号右侧的尖括号可以省略
        collection.add(new Cat());
        collection.add(new Dog());
    }
}

abstract class Animal {
    protected String name;
}
class Cat extends Animal {
    
}
class Dog extends Animal {
    
}

有关更多的内容,可以多学一点:泛型的上限和下限

转载于:https://my.oschina.net/LinkedBear/blog/1615328

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP