Java进阶之路读书Java

Java 基础 - 集合框架

2021-09-16  本文已影响0人  java搬砖从来不加班

集合概述

集合的由来

通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了!

集合是什么?

Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

注意:

① 集合只能存放对象。比如你存一个int 型数据放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。

② 集合存放的是多个对象的引用,对象本身还是放在堆内存中。

③ 集合可以存放不同类型,不限数量的数据类型。

集合和数组的区别

集合框架的基础接口

集合框架常用集合类

[图片上传失败...(image-7e819-1631774982060)]

Collection接口

Collection接口是Set,Queue,List的父接口。

Collection接口中定义了多种方法可供其子类进行实现,以实现数据操作。

下面是Collection的类结构图:

[图片上传失败...(image-255600-1631774982060)]

Collections工具类

Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。

Collections提供了多个synchronizedXx()方法,把线程不安全的list/Collection/map转换为线程安全0

public class CollectionsTest {
    @Test
    public void test1() {
        List<Integer> list = new ArrayList<>();
        list.add(41);
        list.add(13);
        list.add(55);
        list.add(55);
        //1) reverse(list)方法 反转list中的元素
        Collections.reverse(list); // 对list做修改 没有返回值
        //2) shuffle(list)方法 对list进行随机打乱排列
        Collections.shuffle(list);
        //3) sort(list) 对list进行排序 需要实现compareTo方法
        Collections.sort(list);
        //4) swap(list,i,j) 对list中的i处的元素和j处的进行交换
        Collections.swap(list,0,3);
        //5) max(Collection) 返回Collection中最大的元素(基于compareTo方法)
        //6) min(Collection) 返回Collection中最小的元素(基于compareTo方法)
        //7) frequency(Collection,i) 返回Collection中i出现的次数
        int frequency = Collections.frequency(list, 55);
        //8) copy(list dest,list src) 把src的内容复制到dest中
        // 应该先新建一个带src.size()个数null的一个list
        List<Object> dest = Arrays.asList(new Object[list.size()]);
        Collections.copy(dest,list);
        // 9) 利用synchronizedList(list)方法 将list转换为线程安全的
        List<Integer> list1 = Collections.synchronizedList(list);
    }
}

Collection和Collections的区别

List接口

实现List接口的集合是有序的、可重复的。

List接口主要有四个实现类: 分别是ArrayList、Vector、LinkedList和CopyOnWriteArrayList

常用方法

1.操作元素

2.判断元素

3.查询元素

4.其它

遍历集合

集合最常用的操作之一是遍历,遍历就是将集合中的每一个元素取出来,进行操作或计算。

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
for (Object o : list) {
    System.out.println(o);
}
//获取迭代器
Iterator iterator = list.iterator();
//判断是否还有元素
while(iterator.hasNext()){
   System.out.println(iterator.next());
}

:使用for-each循环遍历和使用迭代器遍历从集合中取出的元素都是Object类型。

ListIterator和Iterator的区别

Set接口

常用方法

1.操作元素

2.判断元素

3.其他

Set和List的区别

  1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
  2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>
  3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>

Map接口

Map(映射)集合表示一种非常复杂的集合,允许按照某个键来访问元素。Map集合是由两个集合构成的,一个是键(key)集合,一个是值(value)集合。键集合是Set类型,因此不能有重复的元素。而值集合是Collection类型,可以有重复的元素。Map集合中的键和值是成对出现的。

常用方法

1.操作元素

2.判断元素

3.查看集合

Map与Set、List的关系

1)Map集合与Set集合的关系:如果把Map里的所有key放在一起看,他们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用户返回Map里所有key组成的Set集合。

2)Map集合与List集合的关系:如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中索引不再使用整数值,而是以另外一个对象作为索引。

Queue

Queue用于模拟队列这种数据结构。队列通常是指“先进先出(FIFO)”的容器。队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素。新元素插入到队列的尾部,取出元素会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。

PriorityQueue

优先队列采用堆这种数据结构,元素可以按照任意顺序插, 但是删除的时候总是会删除最小的那个。优先队列主要用于任务调度,当启动新任务时会把优先级最高的任务从队列中删除(习惯上优先级最高的是1)。这里添加的对象(元素)需要实现compareTo方法。

public class PriorityQueueTest {
    @Test
    public void test1() {
        var pq = new PriorityQueue<LocalDate>();
        pq.add(LocalDate.of(2021, 7, 1));
        pq.add(LocalDate.of(2021, 8, 18));
        pq.add(LocalDate.of(2021, 9, 20));
        // 调用remove时会把元素中最小的那个删除掉
        pq.remove();
        System.out.println(pq); //output:[2021-07-01, 2021-09-20]
    }
}
上一篇下一篇

猜你喜欢

热点阅读