您的位置:首页 > 编程语言 > Java开发

Java - Collection 接口及主要实现类

2020-08-16 21:57 218 查看

Collection 接口及主要实现类

  • 二、List
  • 三、Set 接口
  • 一、Collection

    1. 基本介绍

    Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.Listjava.util.Set。其中:

    • List 的特点是有索引、存取有序、可重复。
    • Set 的特点是无索引、存取无序(LinkedHashSet除外)、不可重复。

    而两个子接口又分别有各自对应的实现类。其中,List 接口的主要实现类包括 java.util.ArrayListjava.util.LinkedList;Set 接口的主要实现类有 java.util.HashSetjava.util.LinkedHashSetjava.util.TreeSet。可以通过一张图来描述 Collection 接口的继承实现体系。

    2. 常用方法

    • public boolean add(E e):把给定的对象添加到当前集合中 。
    • public void clear():清空集合中所有的元素。
    • public boolean remove(E e):把给定的对象在当前集合中删除。
    • public boolean contains(E e):判断当前集合中是否包含给定的对象。
    • public boolean isEmpty():判断当前集合是否为空。
    • public int size():返回集合中元素的个数。
    • public Object[] toArray():把集合中的元素,存储到数组中。
    public class DemoCollection {
    public static void main(String[] args) {
    // 创建集合对象
    Collection<String> coll = new ArrayList<String>();                        // 使用多态形式
    // 使用方法
    // 添加功能  boolean  add(String s)
    coll.add("小李广");
    coll.add("扫地僧");
    coll.add("石破天");
    System.out.println(coll);
    // boolean contains(E e) 判断o是否在集合中存在
    System.out.println("判断  扫地僧 是否在集合中"+coll.contains("扫地僧"));
    //boolean remove(E e) 删除在集合中的o元素
    System.out.println("删除石破天:"+coll.remove("石破天"));
    System.out.println("操作之后集合中元素:"+coll);
    
    // size() 集合中有几个元素
    System.out.println("集合中有"+coll.size()+"个元素");
    // Object[] toArray()转换成一个Object数组
    Object[] objects = coll.toArray();
    // 遍历数组
    for (int i = 0; i < objects.length; i++) {
    System.out.println(objects[i]);
    }
    // void  clear() 清空集合
    coll.clear();
    System.out.println("集合中内容为:"+coll);
    // boolean  isEmpty()  判断是否为空
    System.out.println(coll.isEmpty());
    }
    }

    二、List

    1. 基本介绍

    java.util.List 接口继承自 Collection 接口,习惯性地会将实现了 List 接口的对象称为 List 集合。这类集合具有以下特点:

    • List集合中的元素是以线性方式进行存储的,基于不同的实现类有不同的表现形式(数组/链表)
    • List集合中的元素是带索引的,可以通过索引来访问集合中的指定元素
    • List集合中的元素是有序的,即元素的存入顺序和取出顺序一致。
    • List 集合中的元素是可重复的,允许出现重复的元素,可以通过元素的 equals() 方法比较两个元素是否重复

    2. List 的特有方法

    List集合特有方法均与索引相关:

    • public void add(int index, E element):将指定的元素,添加到该集合中的指定位置上。
    • public E get(int index):返回集合中指定位置的元素。
    • public E remove(int index):移除列表中指定位置的元素, 返回的是被移除的元素。
    • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
    public class ListDemo {
    public static void main(String[] args) {
    // 创建List集合对象
    List<String> list = new ArrayList<String>();
    
    // 往 尾部添加 指定元素
    list.add("图图");
    list.add("小美");
    list.add("不高兴");
    
    System.out.println(list);
    // add(int index,String s) 往指定位置添加
    list.add(1,"没头脑");
    
    System.out.println(list);
    // String remove(int index) 删除指定位置元素  返回被删除元素
    // 删除索引位置为2的元素
    System.out.println("删除索引位置为2的元素");
    System.out.println(list.remove(2));
    
    System.out.println(list);
    
    // String set(int index,String s)
    // 在指定位置 进行 元素替代(改)
    // 修改指定位置元素
    list.set(0, "三毛");
    System.out.println(list);
    
    // String get(int index)  获取指定位置元素
    
    // 跟size() 方法一起用  来 遍历的
    for(int i = 0;i<list.size();i++){
    System.out.println(list.get(i));
    }
    //还可以使用增强for
    for (String string : list) {
    System.out.println(string);
    }
    }
    }

    3. List 接口的实现类

    java.util.ArrayList 底层采用数组实现,查询快,增删慢

    java.util.LinkedList 底层采用双向链表实现,查询慢,增删快

    其中,由于 LinkedList 自身的结构特性,JDK提供了大量有关首尾操作的方法:

    • public void addFirst(E e):将指定元素插入此列表的开头。
    • public void addLast(E e):将指定元素添加到此列表的结尾。
    • public E getFirst():返回此列表的第一个元素。
    • public E getLast():返回此列表的最后一个元素。
    • public E removeFirst():移除并返回此列表的第一个元素。
    • public E removeLast():移除并返回此列表的最后一个元素。
    • public E pop():从此列表所表示的堆栈处弹出一个元素。
    • public void push(E e):将元素推入此列表所表示的堆栈。
    • public boolean isEmpty():如果列表不包含元素,则返回true。
    public class LinkedListDemo {
    public static void main(String[] args) {
    LinkedList<String> link = new LinkedList<String>();
    //添加元素
    link.addFirst("abc1");
    link.addFirst("abc2");
    link.addFirst("abc3");
    System.out.println(link);
    // 获取元素
    System.out.println(link.getFirst());
    System.out.println(link.getLast());
    // 删除元素
    System.out.println(link.removeFirst());
    System.out.println(link.removeLast());
    while (!link.isEmpty()) { //判断集合是否为空
    System.out.println(link.pop()); //弹出集合中的栈顶元素
    }
    System.out.println(link);
    }
    }

    三、Set 接口

    1. 基本介绍

    java.util.Set 接口同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,但是比 Collection 接口更加严格。Set 接口的实现类对象具有以下特点:

    • Set 接口实现类中的元素是无索引的,无法通过索引来访问集合中的指定元素
    • LinkedHashSet 以外,Set 接口实现类中的元素是无序的,元素的存入顺序和取出顺序不能保证一致
    • Set 接口实现类中的元素是不可重复的,不允许出现重复的元素,在添加元素的过程中,Set类对象会通过某些规则保证存入的元素不出现重复

    2. Set 接口的实现类

    java.util.HashSet 底层采用散列表实现,无索引、不可以存储重复元素、存取无序。当出现哈希冲突时,相同哈希值的元素采用链表结构存储,当同一哈希值的冲突元素超过 8 个时,改为红黑树存储。

    public class HashSetDemo {
    public static void main(String[] args) {
    //创建 Set集合
    HashSet<String>  set = new HashSet<String>();
    //添加元素
    set.add(new String("cba"));
    set.add("abc");
    set.add("bac");
    set.add("cba");
    //遍历
    for (String name : set) {
    System.out.println(name);
    }
    }
    }

    java.util.LinkedHashSet 底层采用散列表实现,同样使用链表+红黑树的搭配解决哈希冲突的问题。且无索引、不可以存储重复元素、存取有序。数据结构与存储机制与 HashSet 一致,但是多了一个维护数据存储顺序的链表。

    public class LinkedHashSetDemo {
    public static void main(String[] args) {
    Set<String> set = new LinkedHashSet<String>();
    set.add("bbb");
    set.add("aaa");
    set.add("abc");
    set.add("bbc");
    Iterator<String> it = set.iterator();
    while (it.hasNext()) {
    System.out.println(it.next());
    }
    }
    }

    运行结果:

    bbb
    aaa
    abc
    bbc

    注意:Set接口实现类中的元素能够保证唯一性,实际上是根据对象的 hashCode() 和 equals() 方法来决定的。如果向 Set 类集合中存放自定义的对象,保证其唯一性的方式是复写 hashCode() 和 equals() 方法建立属于当前对象的比较方式。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: