目录

集合框架CollectionlistArrayListSetHashSet和LinkedHashSet判断两个对象是否相等

集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判断两个对象是否相等

DAY7.1 Java核心基础

集合框架

Java 中很 重要的一个知识点 ,实际开发中使用的频录较高,Java 程序中必备的模块

集合就是长度可以改变,可以保存任意数据类型的动态数组

最上层是一组接口,接下来是接口的实现类,第三层是对集合进行各种操作的工具类。

接口描述
Collection集合框架最基本的接口,一个 Collection 可以存储一组无序、不唯一的对象
ListCollection 的子接口,存储一组有序、不唯一的对象
SetCollection 的子接口,存储一组无序、唯一的对象
Map独立于 Collection 的另外一个接口,存储一组键值对象、提供键到值的映射
Iterator输出集合元素的接口,一般适用于无序集合,从前到后单向输出
ListIteratorIterator 的子接口,可以双向输出集合中的元素
Enumeration传统的输出接口,已被 Iterator 所取代
SortedSetSet 的子接口,可以对集合中的元素进行排序
SortedMapMap 的子接口,可以对集合中的键值元素进行排序
Queue队列接口,实现队列操作
Map.EntryMap 的内部接口,描述 Map 中的一个键值对元素

Collection接口

集合中最基础的父接口,存放无序、不唯一的对象,一般不用,不能被实例化,只能来规范定义

Collection常用的方法:

方法描述
int size()获取集合长度
boolean isEmpty()判断集合是否为空
boolean contains(Object o)判断集合中是否存在某个对象
Iterator iterator()实例化 Iterator 接口,遍历集合
Object[] toArray()将集合转换为一个 Object 类型的对象数组
boolean add(E e)向集合中添加元素
boolean remove(Object o)从集合中移除元素
boolean containsAll(Collection c)判断集合中是否存在某个集合的所有元素
boolean addAll(Collection c)向集合中添加某个集合的所有元素
boolean removeAll(Collection c)从集合中移除某个集合中的所有元素
void clear()清除集合中的所有元素
boolean equals(Object o)判断两个集合是否相等
int hashCode()获取集合的散列值

Collection 子接口

list:存放有序 、不唯一的元素

set:存放无序、唯一的元素

Queue:队列接口

list

在Collection接口上进行扩展

方法描述
E get(int index)通过下标获取指定位置的元素
E set(int index,E element)替换集合中指定位置的元素
void add(int index,E element)向集合中指定位置添加元素
E remove(int index)通过下标删除集合中指定位置的元素
int indexOf(Object o)查找某个对象在集合中的位置
int lastIndexOf(Objec o)从后向前查找某个对象在集合中的位置
ListIterator listIterator()实例化 ListIterator 接口
List subList(int index1,int index2)获取集合中的子集合(左闭右开)
List 接口的实现类

ArrayList 是最常用的 List 接口实现类

示例代码:

public static void main(String[] args) {
    ArrayList<Object> list = new ArrayList<>();
    list.add("java");
    list.add("javaSE");
    list.add("javaEE");
    list.add("spring");
    System.out.println("测试get获取方法");
    System.out.println(list.get(0));

    System.out.println("\n测试set替换方法");
    list.set(0, "shuwu");
    System.out.println("替换后的值为");
    System.out.println(list.get(0));

    System.out.println("\n测试remove移除方法");
    list.remove(0);

    System.out.println("当前数组元素:");
    System.out.println(list);

    System.out.println("\n测试indexOf移除方法");
    System.out.println("javaEE的位置index:"+list.indexOf("javaEE"));

    System.out.println("\n测试lastIndexOf方法");
    System.out.println("spring的位置index:"+list.lastIndexOf("spring"));

    System.out.println("\n测试迭代器输出数组..");
    System.out.println("数组长度为:"+list.size());
    ListIterator<Object> iterator = list.listIterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }

    System.out.println("\n测试subList方法");
    List<Object> objects = list.subList(0, 2);
    System.out.println("新数组:"+objects.toString());

}

输出:

https://i-blog.csdnimg.cn/img_convert/effe641093eb06f59d7c0428e59133e4.png

Set 接口

Set 是 Collection 的子接口,Set 接口以散列的形式存储数据,所以元素没有顺序,可以存储一组无序且唯一的对象

Set 接口的实现类

HashSet 是开发中经常使用的实现类,存储一组无序且唯一的对象,无序是指元素的存储顺序和遍历顺序不一致

public static void main(String[] args) {
    HashSet set = new HashSet();
    set.add("Hello");
    set.add("World");
    set.add("Java");
    set.add("Hello");
    System.out.println(set.size());
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    set.remove("World");
    System.out.println("删除之后的遍历");
    iterator = set.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}

https://i-blog.csdnimg.cn/img_convert/57db6fe96b3b68b0f9bc8615074e0f7d.png

LinkedHashSet 是 Set 的另外一个子接口,可以存储一组有序且唯一的元素,有序是指元素的存储顺序和遍历顺序一致

public static void main(String[] args) {
    LinkedHashSet set = new LinkedHashSet();
    set.add("Hello");
    set.add("World");
    set.add("Java");
    set.add("Hello");
    System.out.println(set.size());
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    set.remove("World");
    System.out.println("删除之后遍历集合");
    iterator = set.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

输出:

https://i-blog.csdnimg.cn/img_convert/3a71cd28c49870f0ec4268d6f05f0369.png

如果我们要让在set存入对象的时候会判断set集合里面是否有这个元素(对象)

public static void main(String[] args) {
    HashSet set = new HashSet();
    set.add(new A(1));
    set.add(new A(1));
    System.out.println(set);
}

怎么实现set集合里面只保存一个呢?

那如何判断两个对象是否相等呢,首先调用 hashCode 方法,如果 hashCode 的值不一样,则直接可以判定两个对象不相等,如果 hashCode 的值相等,再通过 equals 方法来判断两个对象是否相等。

所以我们要重写hashCode 方法和equals 方法

@Override
public int hashCode() {
    return num;
}

@Override
public boolean equals(Object obj) {
    A a = (A) obj;
    return a.num == this.num;
}

重写后set集合里面只有一个对象啦

https://i-blog.csdnimg.cn/img_convert/f517647f16c4169733a3400fc6cc85de.png