day008 集合【LinkedList、HashSet、Collection集合体系】

集合体系结构.png

1 List集合存储数据的结构

(1)栈

栈结构.png

(2)队列

队列.png

(3)数组

数组.png

 

(4)链表

链表.png

2 List接口

List 是Collection的一个子接口。

 

这个接口下面的集合有以下特点:

 1. 有序。(有序不是顺序,有序指的是怎么存,就怎么取。)

 2. 有索引。

 3. 可以存放重复元素。

 

List接口下面的实现类。

    ArrayList,LinkedList,Vector

 

List接口中的常见方法:

boolean add(E e): 在集合的尾部添加元素。

void add(int index, E element): 在指定位置添加元素。

void clear(): 清除所有元素。

boolean contains(Object o):是否包含。

E get(int index):根据索引获取元素。

boolean isEmpty():如果集合中没有任何元素,返回true。

E remove(int index):根据索引删除元素。

boolean remove(Object o):删除指定元素。

E set(int index, E element):替换指定索引位置的元素。

int size() :获取集合的大小。

Object[] toArray():把集合转成数组。

2.1 ArrayList集合

ArrayList 是我们用的最多的一个集合,没有之一。

 

ArrayList 内部使用【数组】存储数据。

所以说这个集合的特点: 【查询快,增删慢】。

2.2 Vector集合(被淘汰了)

 

Vector 也是 List接口的一个实现类。

内部也是使用数组去存储数据。

特点: 查询快,增删慢。

 

但是Vector里面做了一些线程同步的操作。可以保证线程安全,牺牲效率,所以这个集合整体的性能非常低。

 

这个集合现在已经【被淘汰了】

 

使用方式和ArrayList一样。

2.3 LinkedList集合

LinkedList 也是List的一个实现类。

 

内部是由双向链表组成的。

因为是链表这种结构,所以他的特点是: 查询慢, 增删快。

 

LinkedList内部还有一些【特有】的方法,支持对集合的首尾进行操作

 

void addFirst(E e): 将数据添加到集合的开头。

void addLast(E e): 将数据添加到集合的尾部。

E getFirst(): 获取集合的首个元素。

E getLast(): 获取集合的最后一个元素。

E removeFirst(): 删除集合中的第一个元素。 返回的被删除的元素

E removeLast(): 删除集合中的最后一个元素。返回的被删除的元素

void push(E e): 压入。 把数据添加到集合的首部。

E pop(): 弹出。 把集合的第一个元素删除,并返回这个元素。

3 Set接口

Set是一个接口,是Collection下面的一个子接口。

 

Set接口特点:

 1. 无序。(怎么存不一定怎么取)

 2. 没有索引,不能通过索引获取元素。

 3. 不能存放重复的元素。

 

Set接口下面的常用实现类:

 HashSet(常用), LinkedHashSet

3.1 HashSet集合

HashSet 是Set接口下面的一个实现类。

满足Set接口的所有的特点: 1. 无序。  2. 没有索引。  3. 不能重复。

 

HashSet 内部采用的是哈希表进行存储。效率非常高。

 

因为HashSet没有索引,所以不能使用普通for循环进行遍历。

 

如何遍历HashSet集合。

 1. 迭代器。

 2. 增强for循环。

3.1.1 用HashSet保存自定义对象

使用HashSet保存Dog对象。

 

如果想要让对象的属性相同,就当做是同一个对象,该怎么解决?

因为HashSet判断唯一性是先调用hashCode再调用equals,所以重写这两个方法就可以了。

 

【如果要对自定义对象进行去重,一定要重写hashCode和equals】

里面的规则一定要根据属性值去生成。 使用快捷键生成的hashCode和equals方法都是根据属性值的得来

例如:在Dog类中重写这两个方法(Ctrl+Shift+s点出来的)

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dog other = (Dog) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

3.2 LinkedHashSet

LinkedHashSet是Set接口下面的一个实现类。

 

内部除了有一个哈希表之外,还有一个链表。

这个链表的作用是可以保证有序。

 

注意:Set接口特点是无序,但是他不能保证下面所有的集合都无序。

 

特点:有序。

4 ArrayList里面的contains和HashSet里面的contains

ArrayList 里面的contains: 仅仅调用equals方法进行比较。

HashSet里面的contains: 先调用hashCode求出哈希值进行比较,然后再使用equals进行比较。