容器

容器是用来容纳物体、管理物体。生活中我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等。

程序中的“容器”也有类似的功能用来容纳和管理数据。

事实上,我们前面所学的数组就是一种容器,可以在其中放置对象或基本类型数据。

但是基于数组并不能满足我们对于“管理和组织数据的需求″,所以我们需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对象。

这就是我们今天要学习的容器,容器( Collection)也称之为集合,容器存放在内存中。

接口

1.接口是一个特殊的类,它的特征是其中所有方法只有定义,没有实现.

2.接口的方法只能在它的实现类中实现.

3.接口属于特殊的抽象类.

单例集合的使用

Collection接口

Collection是单例集合的根接口,它是集中、收集的意思

Collection接口的两个子接口是 List接口和Set接口

Collection接口中的抽象方法

迭代器

Iterator对象的工作原理


作用:可以将不同的容器用相同的形式迭代

  • 使用Iterator接口中的方法hasNext()   判断还有没有下一个元素

  • 使用Iterator接口中的方法next()          取出集合中的下一个元素

  • 使用Iterator接口中的方法remove()    删除遍历到当前位置的元素 (每次只使用一次)

1.

2.


List接口介绍

List接口特点:

有序:元素存入集合的顺序和取出的顺序一致,List中每个元素都有索引标记

可重复:List允许加入重复的元素

List除了继承Collection的方法,List还有一些跟索引相关的方法,详情如表:

ArrayList容器类

ArrayList是List接口的实现类。是List存储特征的具体实现

ArrayList底层是用数组实现的存储

特点:查询效率高,增删效率低,线程不安全

使用Java泛型应该注意如下几点:

①在定义一个泛型类时,在之间定义形式类型参数

②实例化泛型对象时,一定要在类名后面指定类型参数类型,一共要有两次书写

添加与获取元素:

get(int index)方法 它是List的方法,并不是继承Collection接口的方法,返回此列表指定位置的元素

优化

size()方法确定边界,返回此列表中的元素个数

删除元素:

remove(int index)方法 根据索引位置删除元素 返回原来位置的元素

remove(object)删除指定元素

set(索引 ,需替换的元素) 替换元素

clear()方法 清空容器 没有返回值

isEmpty()方法判断容器是否为空 有返回值

contains()方法 判断是否包含指定元素

查找元素的位置

indexof ( ) 查找元素第一次出现的位置 返回下标 如果元素在容器中不存在则返回-1

lastIndexof( ) 查找元素最后一次出现的位置 返回下标 如果元素在容器中不存在则返回-1

将单例集合转换成数组

toArray() 转换为Object数组 返回一个数组

类型转换注意事项

转换为泛型类型(指定类型)数组

容器并集操作

addAll()方法 并集并一起

不能对不存在元素的容器进行并集操作

容器交集操作

retainAll()方法 交集取交集

同样不能对不存在元素的容器进行交集操作

容器差集操作

removeAll() 方法

vector容器类

Vectort也是List接口的实现类。是List存储特征的具体实现

Vector底层是用数组实现的存储

特点:相关方法都加了同步检查,线程安全,效率低

Stack容器

Stack栈容器是 Vector的一个子类,它实现了一个标准的后进先出的栈。

Stack特点:后进先出 它通过5个操作方法对 Vector进行扩展,允许将向量视为堆栈

操作栈的方法

empty() 测试这个栈是否为空 返回布尔值

peek() 查看堆栈顶部是否有元素 返回该元素

pop() 删除这个堆栈的顶部的元素 返回该元素的值函数

push(E item ) 把一个元素添加到顶部

search(Object o) 寻找元素在栈的什么位置 返回一个int型的值

LinkedList容器类

底层用双向链表实现的存储

特点:查迿效率低,增删效率髙,线程不安全

每个数据节点中都有两个指针,分别指向前一个节点和后一个节点

LinkedList实现了List接口所以 LinkedList具备List的存储特征(有序性,允许元素重复)

LinkList还拥有自己的方法 (非list标准)

void addFirst(E e) 将指定元素插入到开头

void addLast(E e) 将指定元素插入到结尾

getFirst() 返回此列表的第一个元素

getLast() 返回此列表的最后一个元素

remove First () 移除此列表中的第一个元素,并返回这个元素

removeLast() 移除此列表中的最后一个元素,并返回这个元素

pop() 移除栈顶元素并返回该元素

void push(E e) 将元素添加到栈顶

boolean isEmpty() 判断列表是否包含元素,如果不包含元素则返回true

Set接口

set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持一致

set接口特点:无序、不可重复。

无序:Set中的元素没有索引,只能遍历查找

不可重复:不允许加入重复的元索

HashSet容器类

HashSet的存储特征

不重复:依赖于equals和hashCode

HashSet的使用

方法都是Collection接口中的一些方法

通过 Hash Set存储自定义

创建 Users对象

在 HashSet中存储 Users对象

package com.vis_yang.study_hashset;
import java.util.Objects;
/**
 * @author Vis.Yang
 * @project_name  通过HashSet存储自定义对象
 * @date 2021/3/14 17:14
 */
public class Users {
    private String userName;
    private int userAge;
    public Users() {
    }
    @Override
    public boolean equals(Object o) {
        if (this == o)return true;
        if (o == null || getClass() != o.getClass()) return false;
        Users users = (Users) o;
        return userAge == users.userAge && Objects.equals(userName, users.userName);
    }
    @Override
    public int hashCode() {
        return Objects.hash(userName, userAge);
    }
    public Users(String userName, int userAge) {
        this.userName = userName;
        this.userAge = userAge;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public int getUserAge() {
        return userAge;
    }
    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
    @Override
    public String toString() {
        return "Users{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                '}';
    }
}

import java.util.HashSet;
import java.util.Set;
/**
    @author Vis.Yang
    @project_name HashSet中存放Users对象
    @date 2021/3/14 16:13
    /
    public class HashSetTest {
    public static void main(String[] args) {```
    //实例化HashSet 泛型为Users类型
    Set set =new HashSet();
    Users users1 = new Users("Ricky",20);
    Users users2 = new Users("Ricky",20);
    set.add(users1);
    set.add(users2);
    System.out.println(users1.hashCode());
    System.out.println(users2.hashCode());
    for (Users users : set) {
      System.out.println(users);
    }
    }

图片说明

根据hash值判断

Treeset 容器类



整型数据也有本身定义好的排序方法:

 compareTo(Integer anotherInteger)
 在数字上比较两个Integer对象

自定义比较规则

实现Comparable接口中的 compareTo方法,用该方法自定义比较规则,Treeset通过调用该方法来完成对元素的排序处理

实现

重写

结果

通过比较器实现比较规则

Comparator接口

方法:

int compare(To1, To2) 比较用来排序的两个参数

boolean equals(Object o) 指示某个其他对象是否“等于”此 Comparator


Map接口


Map的常用方法

HashMap 容器类


添加

V  put(K key ,V value)      添加时,若key在Map不存在则返回空   若key已存在,添加的value会替代原来的value,同时返回返回被替代的value


Map取并集

void putAll(Map m)          将一个Map添加到另外一个Map中     若两个Map中有key相同的,添加的Map中value也会替代被替代的Map中value


删除

V remove(Object key)      删除key对应的键值对,同时返回被删除的value

boolean remove(K ,V)      传参不同,作用一致,返回布尔值



获取元素

V get(Object key)                根据key获取对应的value


判断是否包含指定的key

boolean containKey(Object key)             如果包含该key,返回true,不包含则返回false

判断是否包含指定的value

boolean containValue(Object value)      如果包含value,返回true,不包含返回false

获取key存放在Set集合中

Set keySet()                       获取Map集合中所有key存储到Set集合中,返回这个Set集合

获取键值

entrySet()    返回一个Set<Map.Entry<k,v>>类型的集合

遍历集合,通过getKey()和getValue()方法获取key和value



清空Map

void clear()                  删除所有,没有返回值 


TreeMap

必须要有比较规则的key放入,否则TreeMap会报错,可以自身比较规则,也可以是自定比较规则,外部比较器也可

自定义比较规则

通过比较器实现比较规则

Comparator接口

方法:

int compare(To1, To2) 比较用来排序的两个参数

boolean equals(Object o) 指示某个其他对象是否“等于”此 Comparator

Iterator不能直接迭代Map集合


需注意的几个小点:

List接口型数组,不能在循环中直接删除,添加元素 ,元素会移动,下标改变


Collections工具类