Java 基础 -- 集合Conllection

Java 基础 – 集合


前言:

集合的由来

在编程时,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定了数组长度,

Alt
在这里插入图片描述
在这里插入图片描述
这个数组长度就是不可变的,如果需要保存数量变化的数据,数组就有点无能为力了。

而且数组无法保存具有映射关系的数据,如成绩表为语文一79,数学一80。这种数据看上去像两个数组,但这两个数组的元素之间有一定的关联关系。

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java 提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java 所有的集合类都位于 java.util 包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。

集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。


Conllection

Collection 接口是 List 接口和 Set 接口的父接口,通常情况下不被直接使用。Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作。因为 List 接口和 Set 接口继承自 Collection 接口,所以也可以调用这些方法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


Conllection代码演示

在这里插入图片描述
在这里插入图片描述

为什么没有用Conllection是由于 Collection 是接口,不能对其实例化,所以上述代码中使用了 Collection 接口的 实现类来调用 Collection 的方法。add() 方法可以向 Collection 中添加一个元素,而调用 addAll() 方法可以将指定 Collection 中的所有元素添加到另一个 Collection 中。

代码创建了两个集合 list1 和 list2,然后调用 add() 方法向 list1 中添加了两个元素,再调用 addAll() 方法将这两个元素添加到 list2 中。接下来又向 list2 中添加了一个元素,最后输出 list2 集合中的所有元素


ArrayList 实现类 – list接口

经常使用

ArrayList 类提供了快速的基于索引的成员访问方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过,向 ArrayList 中插入与删除元素的速度相对较慢。该类的常用构造方法有如下两种重载形式。

查询快 增删慢 可重复
在这里插入图片描述
ArrayList():构造一个初始容量为 10 的空列表。

ArrayList(Collection<?extends E>c):构造一个包含指定 Collection 的元素的列表,这些元素是按照该 Collection 的迭代器返回它们的顺序排列的。

ArrayList 类除了包含 Collection 接口中的所有方法之外,还包括 List 接口中提供的如表 所示的方法。

在这里插入图片描述

{
        List<String> list = new ArrayList<String>();
        list.add("One");
        list.add("|");
        list.add("Two");
        list.add("|");
        list.add("Three");
        list.add("|");
        list.add("Four");
        System.out.println("list 集合中的元素数量:" + list.size());
        System.out.println("list 集合中的元素如下:");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "、");
        }

        System.out.println("在 list 集合中'丨'第一次出现的位置是:" + list.indexOf("|"));
        System.out.println("在 list 集合中'丨'最后一次出现的位置是:" + list.lastIndexOf("|"));
        System.out.println("list集合第一个元素是"+list.get(0));

        System.out.println("list集合第一个元素设置为你好");
        list.set(0,"你好");

        System.out.println(list.get(0));


        List<String> list1 = list.subList(0, 2);
        System.out.println("list返回一到二的新集合为");
        Iterator<String> iterator = list1.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next() + "、");
        }
    }

在这里插入图片描述


LinkList类–List接口

不经常使用

LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是 LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。

查询慢插入快,两边查询快

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

  • LinkedList 实现 List 接口,能对它进行队列操作。
  • LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
  • LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
  • LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序- 列化去传输。
  • LinkedList 是非同步的。

在这里插入图片描述
实现Conllection方法,自身新增方法

在这里插入图片描述
双向链表,结构在这里插入图片描述

节点方式连接

既然LinkedList是通过双向链表的,但是它也实现了List接口{也就是说,它实现了get(int location)、remove(int location)等“根据索引值来获取、删除节点的函数”}。LinkedList是如何实现List的这些接口的,如何将“双向链表和索引值联系起来的”?
实际原理非常简单,它就是通过一个计数索引值来实现的。

例如,当我们调用get(int location)时,首先会比较“location”和“双向链表长度的1/2”;若前者大,二分查询,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查找,直到location位置。

这就是“双线链表和索引值联系起来”的方法。

 public static void main(String[] args) {
        LinkedList<String> products = new LinkedList<String>(); // 创建集合对象
        String p1 = new String("六角螺母");
        String p2 = new String("10A 电缆线");
        String p3 = new String("5M 卷尺");
        String p4 = new String("4CM 原木方板");
        products.add(p1); // 将 p1 对象添加到 LinkedList 集合中
        products.add(p2); // 将 p2 对象添加到 LinkedList 集合中
        products.add(p3); // 将 p3 对象添加到 LinkedList 集合中
        products.add(p4); // 将 p4 对象添加到 LinkedList 集合中
        String p5 = new String("标准文件夹小柜");
        products.addLast(p5); // 向集合的末尾添加p5对象
        products.addFirst("首部插入展柜");
        System.out.print("*************** 商品信息 ***************");
        System.out.println("\n目前商品有:");
        for (int i = 0; i < products.size(); i++) {
            System.out.print(products.get(i) + "\t");
        }
        System.out.println("\n第一个商品的名称为:" + products.getFirst());
        System.out.println("最后一个商品的名称为:" + products.getLast());
        products.removeLast(); // 删除最后一个元素
        System.out.println("删除最后的元素,目前商品有:");
        for (int i = 0; i < products.size(); i++) {
            System.out.print(products.get(i) + "\t");
        }
    }

在这里插入图片描述


HashSet 类 – Set接口

经常使用

HashSet 类是按照哈希算法来存储集合中的元素,使用哈希算法可以提高集合元素的存储速度,当向 Set 集合中添加一个元素时,HashSet 会调用该元素的 hashCode() 方法,获取其哈希码,然后根据这个哈希码计算出该元素在集合中的存储位置。

在 HashSet 类中实现了 Collection 接口中的所有方法。HashSet 类的常用构造方法重载形式如下。

HashSet():构造一个新的空的 Set 集合。
HashSet(Collection<? extends E>c):构造一个包含指定 Collection 集合元素的新 Set 集合。其中,“< >”中的 extends 表示 HashSet 的父类,即指明该 Set 集合中存放的集合元素类型。c 表示其中的元素将被存放在此 Set 集合中。

不可重复,底层hash

下面的代码演示了创建两种不同形式的 HashSet 对象。

 public static void main(String[] args) {

        HashSet<String> bookSet = new HashSet<String>(); // 创建一个空的 Set 集合
        String book1 = new String("第一本书");
        String book2 = new String("第二本书");
        String book3 = new String("第三本书");
        String book4 = new String("第四本书");
        String book5 = new String("第四本书");
        bookSet.add(book1); // 将 book1 存储到 Set 集合中
        bookSet.add(book2); // 将 book2 存储到 Set 集合中
        bookSet.add(book3); // 将 book3 存储到 Set 集合中
        bookSet.add(book4); // 将 book4 存储到 Set 集合中
        bookSet.add(book5); // 将 book5 存储到 Set 集合中
        System.out.println("新进图书有:");
        Iterator<String> it = bookSet.iterator();
        while (it.hasNext()) {
            System.out.println("《" + (String) it.next() + "》"); // 输出 Set 集合中的元素
        }
        System.out.println("共采购 " + bookSet.size() + " 本图书!");


        }

在这里插入图片描述


TreeSet 类–Set接口

不经常使用

TreeSet 类同时实现了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以实现对集合进行自然排序,因此使用 TreeSet 类实现的 Set 接口默认情况下是自然排序的,这里的自然排序指的是升序排序。

TreeSet 只能对实现了 Comparable 接口的类对象进行排序,因为 Comparable 接口中有一个 compareTo(Object o) 方法用于比较两个对象的大小。例如 a.compareTo(b),如果 a 和 b 相等,则该方法返回 0;如果 a 大于 b,则该方法返回大于 0 的值;如果 a 小于 b,则该方法返回小于 0 的值。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值