Java之集合实例(ArrayList、Set、Map)详解

版权声明:欢迎转载,转载请注明出处哦! https://blog.csdn.net/qq_41647999/article/details/88598257

目录直通车

一、 重点

二、 Java的集合框架

概述

Collection接口:

Map接口:

三、 Collection接口API

四、 Iterator迭代器

1、 Iterator

2、 增强型for循环

 五、 Collection 子接口:List和Set

六、 Map接口

七、 Collections工具类

1、 Collection 与 Collections的区别是什么?

2、 Collections的使用


学习Java语言就必须学习Java集合类。在Java中的集合类就像是一个容器,专门用来存储Java类的对象。List接口继承自Collection接口,是单列集合的一个重要分支。只是我们一直习惯性的把实现了List接口的对象称为List集合

一、 重点

在Java的集合里面最重要的是以下几点:

1、 常用的集合类

2、 Iterator迭代器

3、 泛型

4、 Collections、Arrays 工具类

二、 Java的集合框架

概述

Java集合分为Collection和Maps两种体系。

Collection接口:

      1) Set:元素无序、不可重复的集合。

      2) List:元素有序、可重复的集合 。就相当与动态数组(长度可变化的)。

Map接口:

      具有映射关系“key-Value”(键值对)的集合。

三、 Collection接口API

这张图先放在这里,简单的看一下,学完下面的函数在回来理解这张图就很容易了。

以下表格中的内容来自官网JDK1.8 :

修饰类型

方法以及描述

boolean add(E e)

确保此集合包含指定的元素(可选操作)。

boolean addAll(Collection<? extends E> c)

将指定集合中的所有元素添加到此集合(可选操作)。

void clear()

从此集合中删除所有元素(可选操作)。

boolean contains(Object o)

如果此集合包含指定的元素,则返回 true 。

boolean containsAll(Collection<?> c)

如果此集合包含指定 集合中的所有元素,则返回true。

boolean equals(Object o)

将指定的对象与此集合进行比较以获得相等性。

int hashCode()

返回此集合的哈希码值。

boolean isEmpty()

如果此集合不包含元素,则返回 true 。

Iterator<E> iterator()

返回此集合中的元素的迭代器。

default Stream<E> parallelStream()

返回可能并行的 Stream与此集合作为其来源。

boolean remove(Object o)

从该集合中删除指定元素的单个实例(如果存在)(可选操作)。

boolean removeAll(Collection<?> c)

删除指定集合中包含的所有此集合的元素(可选操作)。

default boolean removeIf(Predicate<? super E> filter)

删除满足给定谓词的此集合的所有元素。

boolean retainAll(Collection<?> c)

仅保留此集合中包含在指定集合中的元素(可选操作)。

int size()

返回此集合中的元素数。

default Spliterator<E> spliterator()

创建一个Spliterator在这个集合中的元素。

default Stream<E> stream()

返回以此集合作为源的顺序 Stream

Object[] toArray()

返回一个包含此集合中所有元素的数组。

<T> T[] toArray(T[] a)

返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。

举一个全家套的实例(附详解注释):

package List;

import java.util.*;

public class TestCollection {
    public static void testCollection1(){
        Collection coll1 = new ArrayList();
        // size() 返回集合个数
        System.out.println("集合元素个数"+coll1.size());

        // add(Object o) 像集合添加一个元素
        coll1.add("djun");
        coll1.add(new Date());
        System.out.println("集合元素个数"+coll1.size());

        Collection coll2 = Arrays.asList(1,2,3);
        coll1.add(coll2);
        System.out.println("集合元素个数"+coll1.size());

        // 直接打印集合的元素名可以直接查看集合的元素
        System.out.println("集合的元素有:"+coll1);

        // isEmpty() 集合是否为空
        System.out.println("集合为空 ? "+coll1.isEmpty());
        // clear() 清空集合
        coll1.clear();
        System.out.println("集合为空 ? "+coll1.isEmpty());

    }
    public static void testCollection2(){
        Collection coll1 = new ArrayList();
        coll1.add("djun");
        coll1.add(123);
        coll1.add(new Date());
        coll1.add("AAA");
        // contains(object obj) 判断集合中是否包含obj元素,返回boolen
        boolean b1 = coll1.contains(123);
        System.out.println(b1);
    }
    public static void testCollection3(){
        Collection coll1 = new ArrayList();
        coll1.add(new Person("Djun",21));
        coll1.add(123);
        coll1.add("AA");
        System.out.println("集合中的元素有:"+coll1);
        boolean b1 = coll1.contains(new Person("Djun",21));
        System.out.println(b1);
        /*
         集合中明明有[Person{name='Djun', age=21}],但为啥还是false?
         先卖个关子。现在到Person里面通过快捷键重写equals方法之后重新运行查看结果。

          一般都会重写equals方法。因为contains的判断的依据如下:
          1、 根据自定义的equals方法进行判断。
          2、 如果存入集合中的元素是自定义类的对象,要求:自定义类要重写equals方法。
          */
        Collection coll2 = new ArrayList();
        coll2.add(123);
        coll2.add("BB");
        // containsAll判断当前集合coll1是否包含coll2中所有的元素
        boolean b2 = coll1.containsAll(coll2);
        System.out.println("coll1中是否包含coll2所有的元素?"+b2);

        // retainAll(Collection coll) 将coll1与coll2中共有的元素返回给当前集合
        coll1.retainAll(coll2);
        System.out.println("coll1的所有元素为: " + coll1);

        // remove可以删除指定元素和指定下标
        boolean b3 = coll1.remove("BB");
        System.out.println("删除是否成功?" + b3);

        // removeAll 删除全部是否成功
        boolean b4 = coll1.removeAll(coll1);
        System.out.println("删除是否成功?" + b4);
        System.out.println("coll2中的元素:" + coll2);
    }
    public static void testCollection4(){
        Collection c1 = new ArrayList();
        Collection c2 = new ArrayList();

        c1.add(123);
        c1.add("BB");

        c2.add(123);
        c2.add("AA");

        // equals 判断c1和c2是否完全相同,有一个不同都为false
        System.out.println("c1 和 c2是否完全相同? " + c1.equals(c2));

        // hashcode() 可以得到集合的hash值
        /*
        这个值是怎么得到的呢?
        hashCode把集合中的每一个元素计算成hash值,通过迭代的方式
        加起来最终的一个数字。
         */
        System.out.println("hash:" + c1.hashCode());

        // toArray 集合转数组
        Object[] obj = c1.toArray();
        for (int i = 0; i < obj.length; i++) {
            System.out.println("obj的元素"+ obj[i]);
        }
        // iterator() 返回一个Iterator接口实现类的对象
        Iterator iterator = c1.iterator();
        // 方式1 : 不用hashNext
//        System.out.println("不用hashNext: "+iterator.next());
//        System.out.println("不用hashNext: "+iterator.next());

        // 方式2 : 不用hashNext
//        for (int i = 0; i < c1.size(); i++) {
//            System.out.println("不用hashNext: "+iterator.next());
//        }

        // 方式3: 用hashNext
            while (iterator.hasNext()){
                System.out.println("hashNext: "+iterator.next());
            }
    }

    public static void main(String[] args) {
        testCollection1();
        testCollection2();
        testCollection3();
        testCollection4();
    }
}

class Person{
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Integer getAge() {
        return age;
    }

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

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return Objects.equals(getName(), person.getName()) &&
                Objects.equals(getAge(), person.getAge());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getAge());
    }
}

四、 Iterator迭代器

1、 Iterator

集合遍历都可以使用这款迭代器。具体如何使用,请看下例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

public class TestIterator {

    public void test1(){
        Collection c1 = new ArrayList();
        c1.add(123);
        c1.add("AA");
        c1.add(new Date());

        Iterator i = c1.iterator();
        /*
         hasNext() 判断集合的下一个是否为空,
         不为空则接着下移
          */

        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
}

除此遍历集合的方式,是否还有其它可靠的方式来取值呢?

2、 增强型for循环


import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

public class TestIterator {
    public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add(123);
        c1.add("AA");
        c1.add(new Date());

        // 增强型for循环实现遍历集合
        for(Object i : c1){
            System.out.println(i);
        }
        
        // 增强型for循环实现遍历集合
        String [] str = new String[]{"AA","BB","CC"};
        // s是一个新的局部变量,不会对str造成影响
        for (String s : str){
            System.out.println(s);
        }
    }
}

 五、 Collection 子接口:List和Set

内容有点长就不挤在一篇文章里面了,分开详细写了一篇:

https://blog.csdn.net/qq_41647999/article/details/88806372

六、 Map接口

详细的另外写了一篇:

https://blog.csdn.net/qq_41647999/article/details/88823947

七、 Collections工具类

1、 Collection 与 Collections的区别是什么?

(1) Collection 是接口。

(2) Collections是一个工具类可以操作Collection 与 Map 的工具类,提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

2、 Collections的使用

(1) reverse(List)   // 逆置List元素

(2) shuffle(List)    // 对List元素随机排序

(3) sort(List)        // 对List元素自然顺序升序排序

(4) sort(List. Comparator)  // 对List元素自定义排序

(5) swap(List.int, int)   // 将两个指定的List的元素 i 和 j 处元素进行交换

(6) Object max(Collection )  // 根据自然顺序,返回给集合最大的元素

(7) Object max(Collection.Comparator )  // 根据自定义顺序,返回给集合最大的元素

(8) Object min(Collection ) 

(9) Object min(Collection ) 

(10) int frequency(Collection ,Object )    // 返回指定集合中的元素出现的次数

(11)void copy(List list1 , List list2) // 将 list1 的元素复制到 list2 中

既然都是静态方法,直接调用就是了,这边还是举一个调用的栗子吧~

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class TestCollections {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(123);
        list.add("AA");
        list.add(new Date());
        list.add("BB");
        System.out.println(list);
        Collections.reverse(list);
        System.out.println(list);

    }
}

最后在说一个同步线程安全的控制方法:

通过 List list2 =  Collections.synchronizedList(list1); 来获取线程安全的 list2

最后最后在提一个接口,叫做Enumeration。

它是Iterator迭代器的一个古老版本,知道有这么个东西就可以了。

猜你喜欢

转载自blog.csdn.net/qq_41647999/article/details/88598257