集合概述和分类_集合的概念

集合概述和分类_集合的概念

目录

一、集合的概述和分类

1.1集合的分类

 1.2Collection集合的常用方法

二、Collection遍历方式

2.1迭代器遍历集合

2.2、增强for循环

2.3forEach遍历集合

三、List系列集合

3.1List集合的常用方法

3.3ArrayList底层的原理

3.4LinkedList底层原理

 3.5LinkedList集合的应用场景


一、集合的概述和分类

1.1集合的分类

Collection :单列集合,每个素(数据)只包含一个值

Map:代表双列集合,每个素包含老哥值(键值对),key :value

集合概述和分类_集合的概念

 List系列集合:添加素是有序、可重复、有索引。

  • ArrayList、LinekdList:有序、可重复、有索引

Set系列集合:添加素是无序、不重复、无索引。

  •  HashSet:无序、不重复、无索引;
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:按照大小默认升序排序、不重复、无索引。

 1.2Collection集合的常用方法

集合概述和分类_集合的概念

Collection<String> c = new ArrayList<>(); //1.public boolean add(E e): 添加素到集合 c.add("java1"); c.add("java1"); c.add("java2"); c.add("java2"); c.add("java3"); System.out.println(c); //打印: [java1, java1, java2, java2, java3] //2.public int size(): 获取集合的大小 System.out.println(c.size()); //5 //3.public boolean contains(Object obj): 判断集合中是否包含某个素 System.out.println(c.contains("java1")); //true System.out.println(c.contains("Java1")); //false //4.pubilc boolean remove(E e): 删除某个素,如果有多个重复素只能删除第一个 System.out.println(c.remove("java1")); //true System.out.println(c); //打印: [java1,java2, java2, java3] //5.public void clear(): 清空集合的素 c.clear(); System.out.println(c); //打印:[] //6.public boolean isEmpty(): 判断集合是否为空 是空返回true 反之返回false System.out.println(c.isEmpty()); //true //7.public Object[] toArray(): 把集合转换为数组 Object[] array = c.toArray(); System.out.println(Arrays.toString(array)); //[java1,java2, java2, java3] //8.如果想把集合转换为指定类型的数组,可以使用下面的代码 String[] array1 = c.toArray(new String[c.size()]); System.out.println(Arrays.toString(array1)); //[java1,java2, java2, java3] //9.还可以把一个集合中的素,添加到另一个集合中 Collection<String> c1 = new ArrayList<>(); c1.add("java1"); c1.add("java2"); Collection<String> c2 = new ArrayList<>(); c2.add("java3"); c2.add("java4"); c1.addAll(c2); //把c2集合中的全部素,添加到c1集合中去 System.out.println(c1); //[java1, java2, java3, java4]

二、Collection遍历方式

2.1迭代器遍历集合

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); System.out.println(c); //[赵敏, 小昭, 素素, 灭绝] //第一步:先获取迭代器对象 //解释:Iterator就是迭代器对象,用于遍历集合的工具) Iterator<String> it = c.iterator(); //第二步:用于判断当前位置是否有素可以获取 //解释:hasNext()方法返回true,说明有素可以获取;反之没有 while(it.hasNext()){ //第三步:获取当前位置的素,然后自动指向下一个素. String e = it.next(); System.out.println(s); }

迭代器代码的原理如下:

  • 当调用iterator()方法获取迭代器时,当前指向第一个素

  • hasNext()方法则判断这个位置是否有素,如果有则返回true,进入循环

  • 调用next()方法获取素,并将当月素指向下一个位置,

  • 等下次循环时,则获取下一个素,依此内推

 使用迭代器遍历集合用到的方法

方法名称 说明

Iterator<E> iterator()

返回集合中的迭代器对象

boolean hasNext()

询问当前位置是否有素存在,存在返回true,反之false
E next() 获取当前位置的素,并同时将迭代器对象指向下一素

2.2、增强for循环

格式:

for(素数据类型  变量名:数组或集合){

}

 需要注意的是,增强for不光可以遍历集合,还可以遍历数组。接下来我们用代码演示一em.o下:

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); //1.使用增强for遍历集合 for(String s: c){ System.out.println(s); } //2.再尝试使用增强for遍历数组 String[] arr = {"迪丽热巴", "古力娜扎", "稀奇哈哈"}; for(String name: arr){ System.out.println(name); }

2.3forEach遍历集合

在JDK8版本以后还提供了一个forEach方法也可以遍历集合,如果下图所示:

集合概述和分类_集合的概念

 我们发现forEach方法的参数是一个Consumer接口,而Consumer是一个函数式接口,所以可以传递Lambda表达式

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); //调用forEach方法 //由于参数是一个Consumer接口,所以可以传递匿名内部类 c.forEach(new Consumer<String>{ @Override public void accept(String s){ System.out.println(s); } }); //也可以使用lambda表达式对匿名内部类进行简化 c.forEach(s->System.out.println(s)); //[赵敏, 小昭, 素素, 灭绝]

三、List系列集合

3.1List集合的常用方法

List集合是索引的,所以多了一些有索引操作的方法,如下图所示:

集合概述和分类_集合的概念接下来,我们用代码演示一下这几个方法的效果

//1.创建一个ArrayList集合对象(有序、有索引、可以重复) List<String> list = new ArrayList<>(); list.add("蜘蛛精"); list.add("至尊宝"); list.add("至尊宝"); list.add("牛夫人"); System.out.println(list); //[蜘蛛精, 至尊宝, 至尊宝, 牛夫人] //2.public void add(int index, E element): 在某个索引位置插入素 list.add(2, "紫霞仙子"); System.out.println(list); //[蜘蛛精, 至尊宝, 紫霞仙子, 至尊宝, 牛夫人] //3.public E remove(int index): 根据索引删除素, 返回被删除的素 System.out.println(list.remove(2)); //紫霞仙子 System.out.println(list);//[蜘蛛精, 至尊宝, 至尊宝, 牛夫人] //4.public E get(int index): 返回集合中指定位置的素 System.out.println(list.get(3)); //5.public E set(int index, E e): 修改索引位置处的素,修改后,会返回原数据 System.out.println(list.set(3,"牛魔王")); //牛夫人 System.out.println(list); //[蜘蛛精, 至尊宝, 至尊宝, 牛魔王]

3.2List集合的遍历方式

List集合相比于前面的Collection多了一种可以通过索引遍历的方式,所以List集合遍历方式一共有四种:

  • 普通for循环(只因为List有索引)

  • 迭代器

  • 增强for

  • Lambda表达式

List<String> list = new ArrayList<>(); list.add("蜘蛛精"); list.add("至尊宝"); list.add("糖宝宝"); //1.普通for循环 for(int i = 0; i< list.size(); i++){ //i = 0, 1, 2 String e = list.get(i); System.out.println(e); } //2.增强for遍历 for(String s : list){ System.out.println(s); } //3.迭代器遍历 Iterator<String> it = list.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } //4.lambda表达式遍历 list.forEach(s->System.out.println(s));

3.3ArrayList底层的原理

ArrayList集合底层是基于数组结构实现的,也就是说当你往集合容器中存储素时,底层本质上是往数组中存储素。 特点如下:

集合概述和分类_集合的概念

 我们知道数组的长度是固定的,但是集合的长度是可变的,这是怎么做到的呢?原理如下:

集合概述和分类_集合的概念

 数组扩容,并不是在原数组上扩容(原数组是不可以扩容的),底层是创建一个新数组,然后把原数组中的素全部复制到新数组中去。

3.4LinkedList底层原理

LinkedList底层是链表结构,链表结构是由一个一个的节点组成,一个节点由数据值、下一个素的地址组成。如下图所示

集合概述和分类_集合的概念

 假如,现在要在B节点和D节点中间插入一个素,只需要把B节点指向D节点的地址断掉,重新指向新的节点地址就可以了。如下图所示:

集合概述和分类_集合的概念

 假如,现在想要把D节点删除,只需要让C节点指向E节点的地址,然后把D节点指向E节点的地址断掉。此时D节点就会变成垃圾,会把垃圾回收器清理掉。

集合概述和分类_集合的概念

 上面的链表是单向链表,它的方向是从头节点指向尾节点的,只能从左往右查找素,这样查询效率比较慢;还有一种链表叫做双向链表,不光可以从做往右找,还可以从右往左找。如下图所示:

集合概述和分类_集合的概念

 LinkedList集合是基于双向链表实现了,所以相对于ArrayList新增了一些可以针对头尾进行操作的方法,如下图示所示:

集合概述和分类_集合的概念

 3.5LinkedList集合的应用场景

那么LInkedList集合有什么用呢?可以用它来设计栈结构、队列结构。

入队列可以调用LinkedList集合的addLast方法,出队列可以调用removeFirst()方法.

//1.创建一个队列:先进先出、后进后出 LinkedList<String> queue = new LinkedList<>(); //入对列 queue.addLast("第1号人"); queue.addLast("第2号人"); queue.addLast("第3号人"); queue.addLast("第4号人"); System.out.println(queue); //出队列 System.out.println(queue.removeFirst()); //第4号人 System.out.println(queue.removeFirst()); //第3号人 System.out.println(queue.removeFirst()); //第2号人 System.out.println(queue.removeFirst()); //第1号人

接下来,我们再用LinkedList集合来模拟一下栈结构的效果。还是先来认识一下栈结构长什么样。栈结构可以看做是一个上端开头,下端闭口的水杯的形状。

素永远是上端进,也从上端出,先进入的素会压在最底下,所以栈结构的特点是先进后出,后进先出

集合概述和分类_集合的概念

//1.创建一个栈对象 LinkedList<String> stack = new ArrayList<>(); //压栈(push) 等价于 addFirst() stack.push("第1颗子弹"); stack.push("第2颗子弹"); stack.push("第3颗子弹"); stack.push("第4颗子弹"); System.out.println(stack); //[第4颗子弹, 第3颗子弹, 第2颗子弹,第1颗子弹] //弹栈(pop) 等价于 removeFirst() System.out.println(statck.pop()); //第4颗子弹 System.out.println(statck.pop()); //第3颗子弹 System.out.println(statck.pop()); //第2颗子弹 System.out.println(statck.pop()); //第1颗子弹 //弹栈完了,集合中就没有素了 System.out.println(list); //[]

 

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/162307.html

(0)
上一篇 2024年 7月 5日
下一篇 2024年 7月 5日

相关推荐

  • PhpStorm激活2023.3.6(JetBrains AppCode 2023 for Mac)

    PhpStorm激活2023.3.6(JetBrains AppCode 2023 for Mac)

    2024年 6月 23日
  • DataSpell激活2024.1.1(IntelliJ IDEA 2024 中文激活版 mac/win)

    DataSpell激活2024.1.1(IntelliJ IDEA 2024 中文激活版 mac/win)

    激活谷笔记 2024年 6月 8日
  • l298n驱动直流电机接线方法图_电机驱动模块

    l298n驱动直流电机接线方法图_电机驱动模块本科生毕业设计容易吗?本科生毕业设计一般会挂人吗一般不会挂人,但也不绝对。对于本科生来说,只要工作量够就可以毕业了,也不需要你进行创新。很多同学本科毕业之后就不从事本专业相关的工作了,即使是读研也有相当一部分同学会跨考其他专业,或者在本专业中从事其他专业的事情,如通信转码。因此,本科毕设的目的主

    激活谷笔记 2024年 8月 1日
  • eclipse全局搜索_eclipse怎么查找代码

    eclipse全局搜索_eclipse怎么查找代码怎么调出全局搜索_eclipse全局搜索快捷键是什么【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、i

    激活谷笔记 2024年 5月 11日
  • anaconda怎么选择版本_anaconda安装哪个版本好

    anaconda怎么选择版本_anaconda安装哪个版本好用Anaconda 配置不同版本Python环境本文将介绍 Anaconda 的进阶使用:用 conda 配置虚拟环境、 package(安装包)的管理、以及导入或导出虚拟环境。 一、为什么要配置虚拟环境? 既

    激活谷笔记 2024年 5月 12日
  • 化学a+_a化学怎么读

    化学a+_a化学怎么读【A-Level化学】什么是反应速率?知识点有哪些?在A-Level课程中会涉及很多内容,其中A-Level化学非常重要,在开始介绍之前,我们先来了解一下什么是反应速率,反应速率其实就是浓度的变化率(一般来说是生成物的

    2024年 8月 6日
  • (java)求最大公约数

    (java)求最大公约数

    激活谷笔记 2024年 6月 20日
  • Idea激活2023.1.6(Clion 2023.1.3 激活成功教程版安装教程(附激活码,亲测有效~))

    Idea激活2023.1.6(Clion 2023.1.3 激活成功教程版安装教程(附激活码,亲测有效~))

    2024年 7月 22日
  • c++new与malloc

    c++new与malloc面试官经常问C++内存New与malloc区别(超详细~)一,申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行

    2024年 7月 29日
  • printf输出数值_printf输出数值数组

    printf输出数值_printf输出数值数组c语言如何用printf输出数组,C语言如何用printf打印数组问题C程序设计语言C语言精典版本目 录译者序序第1版序前言第1章 基本概念1.1 入门1.2 变量与算术表达式1.3 for语句1.4 符号常量1.5

    激活谷笔记 2024年 5月 26日
  • 二阶低通滤波器传递函数推导_二阶低通滤波器的传递函数

    二阶低通滤波器传递函数推导_二阶低通滤波器的传递函数二阶低通滤波器IIR的五个参数推导过程最近在研究飞控代码看到了二阶低通滤波器IIR的软件代码,由于之前没有了解过二阶滤波器的原理,对代码十分懵逼,经过学习,特将学习成果发布,有兴趣的小伙伴看看,如果哪里不对,请提出来,一起学习进步哟,

    2024年 6月 22日
  • d2088管脚图_DS18B20工作原理及电路图

    d2088管脚图_DS18B20工作原理及电路图DS18B20数字温度传感器干货一·DS18B20的概述.DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转

    2024年 8月 2日
关注微信