单列集合

时间:2022-06-01 19:01:48

一、集合和数组既然都是容器,它们的区别:

  1. 数组的长度是固定的。集合的长度是可变的

  2. 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储

二、集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.Listjava.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayListjava.util.LinkedListSet接口的主要实现类有java.util.HashSetjava.util.TreeSet

 

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:
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(): 把集合中的元素,存储到数组中。

三、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):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

注意: 操作索引的时候,一定要防止索引越界异常,IndexOutOfBoundsException:索引越界异常,集合会报 ArrayIndexOutOfBoundsException:数组索引越界异常 StringIndexOutOfBoundsException:字符串索引越界异常。

List接口的实现类:

  1. ArrayList,底层是数组结构。元素增删慢,查寻快

  2.LinkedList,底层链表结构。元素增删快,查询慢 ;里面包含了大量操作首尾的方法

  3.Vector,底层是数组结构,Vector是同步的,即单线程、速度慢,而ArrayList不是同步的

LinkedList中部分方法:

public void addFirst(E e):将指定元素插入此列表的开头。
public void addLast(E e):将指定元素添加到此列表的结尾。
public void push(E e):将元素推入此列表所表示的堆栈。

public E getFirst():返回此列表的第一个元素。
public E getLast():返回此列表的最后一个元素。

public E removeFirst():移除并返回此列表的第一个元素。
public E removeLast():移除并返回此列表的最后一个元素。
public E pop():从此列表所表示的堆栈处弹出一个元素,此方法相当于removeFirst

public boolean isEmpty():如果列表不包含元素,则返回true。

四、Set接口

特点:①不允许存储重复元素②没有索引,没有带索引的方法,也不能使用普通的for循环遍历

Set接口的实现类:

  1. HashSet,底层是哈希表结构(查询的速度非常快),不同步;是一个无序的集合,存储和取出元素的顺序可能不一致,两种遍历方式:增强for循环和迭代器遍历

  2. LinkedHashSet,底层是一个哈希表(数组 链表/红黑树) 链表:多了一条链表(记录元素的存储顺序),保证元素有序,有序,不允许存储重复元素

注意:
HashSet集合存储数据的结构(哈希表)
jdk1.8版本之前:哈希表=数组 链表
jdk1.8版本之后:
    哈希表=数组 链表
    哈希表=数组 红黑树(提高查询的速度)

 set集合保证元素唯一:存储的元素(String、Integer、Student、Person.......),必须重写hashCode方法和equals方法;如:存储Person类型,同名统年龄的人视为同一个人,此时为保证元素唯一,就必须重写hashCode方法和equals方法

import java.util.Objects;

public class Person {
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;

    }

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}