集合详解-迭代器遍历-增强for-List集合-List五种遍历方式-Set集合-排序规则Comparable-双列集合

news/发布时间2024/5/15 6:36:24

Collection集合

数组和集合的区别

  • 相同点

    都是容器,可以存储多个数据

  • 不同点

    • 数组的长度是不可变的,集合的长度是可变的

    • 数组可以存基本数据类型和引用数据类型

      集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
       

Collection 集合概述和使用

Collection集合概述

  • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

  • JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现

创建Collection集合的对象

  • 多态的方式

  • 具体的实现类ArrayList

Collection集合常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
boolean removeIf(Object o)根据条件进行移除
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

Collection集合的遍历

迭代器遍历

迭代器介绍

  • 迭代器,集合的专用遍历方式

  • Iterator中的常用方法

    boolean hasNext(): 判断当前位置是否有元素可以被取出 ​ E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置

  • Collection集合的遍历

Iterator<String> it = list.iterator();
boolean flag = it.hasNext(); //判断当前位置是否有元素,有true无false
String str = it.next(); //获取当前元素并把指针移向下一位
public class IteratorDemo {public static void main(String[] args) {//创建集合对象Collection<String> c = new ArrayList<>();//添加元素c.add("hello");c.add("world");c.add("java");c.add("javaee");//Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到Iterator<String> it = c.iterator();//用while循环改进元素的判断和获取while (it.hasNext()) {String s = it.next();System.out.println(s);}}}
增强for

介绍

  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

  • 实现Iterable接口的类才可以使用迭代器和增强for

  • 简化数组和Collection集合的遍历

格式

for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {

// 已经将当前遍历到的元素封装到变量中了,直接使用变量即可

}

代码

public class EnhanceForTest {public static void main(String[] args) {//创建集合并添加元素Collection<String> coll = new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//注意点:s 其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据//修改增强for中的变量,不会改变集合中原来的数据for(String s : coll){System.out.println(s);}}
}

List集合

List集合的概述和特点

  • List集合的概述

    • 有序集合,这里的有序指的是存取顺序

    • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素

    • 与Set集合不同,列表通常允许重复的元素

  • List集合的特点

    • 存取有序

    • 可以重复

    • 有索引

List集合的特有方法【应用】

方法介绍

方法名描述
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
public class ListTest1 {public static void main(String[] args) {//创建一个集合List<String> list = new ArrayList<>();//添加元素list.add("aaa");list.add("bbb");list.add("ccc");//增强for遍历list.add(1, "QQQ");for (String s : list) {System.out.println(s);}//迭代器遍历Iterator<String> it = list.iterator();while (it.hasNext()) {String s = it.next();System.out.println(s);}String remove = list.remove(0);System.out.println(remove);//aaa [QQQ, bbb, ccc]String result = list.set(0, "QQQ");//QQQ [QQQ, bbb, ccc]System.out.println(result);String s = list.get(2);System.out.println(s);//ccc [QQQ, bbb, ccc]//打印集合System.out.println(list);}
}

2.3List集合的五种遍历方式【应用】

  1. 迭代器

  2. 列表迭代器

  3. 增强for

  4. Lambda表达式

  5. 普通for循环

代码示例:

public class ListTest2 {public static void main(String[] args) {//创建集合并添加元素List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");//1.迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String str = iterator.next();System.out.println(str);}//增强forfor (String s : list) {System.out.println(s);}//Lambda表达式list.forEach(s -> System.out.println(s));//普通for循环for (int i = 0; i < list.size(); i++) {//i:依次表示集合中的每一个索引String s = list.get(i);System.out.println(s);}//列表迭代器//获取一个列表迭代器的对象,里面的指针默认也是指向0索引//额外添加了一个方法,在遍历的过程中,可以添加元素ListIterator<String> it = list.listIterator();while (it.hasNext()) {String str = it.next();if ("bbb".equals(str)) {it.add("fff");}}System.out.println(list);}
}

Set集合

不可以存储重复元素

没有索引,不能使用普通for循环遍历

代码

public class SetTest {public static void main(String[] args) {//创建集合对象Set<String> set = new TreeSet<>();//添加元素set.add("ccc");set.add("aaa");set.add("aaa");set.add("bbb");/*  for(int i = 0; i < set.size(); i++){//Set集合是没有索引的,所以不能使用通过索引获取元素的方法}*///遍历集合Iterator<String> it = set.iterator();while (it.hasNext()) {String s = it.next();System.out.println(s);}System.out.println("-----------------------------------");for (String s : set) {System.out.println(s);}}
}

HashSet

  • 底层数据结构是哈希表

  • 存取无序

  • 不可以存储重复元素

  • 没有索引,不能使用普通for循环遍历

哈希表结构

JDK8之前: 数组+链表

JDK8开始: 数组+链表+红黑树

  • 节点个数少于等于8个

    数组 + 链表

  • 节点个数多于8个

    数组 + 红黑树

哈希值

  • 哈希值简介

    是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

  • 如何获取哈希值

    Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的

    • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

LinkedHashSet

底层原理

TreeSet

不重复,无索引,可排序

可排序:按照元素的默认规则(从小到大)排序

TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都很好

存储Integer类型的整数并遍历

public class TreeSetTest {public static void main(String[] args) {TreeSet<Integer> ts = new TreeSet<>();ts.add(5);ts.add(4);ts.add(3);ts.add(2);ts.add(1);//[1, 2, 3, 4, 5]//System.out.println(ts);//迭代器Iterator<Integer> iterator = ts.iterator();while(iterator.hasNext()){int i = iterator.next();System.out.println(i);}System.out.println("------------");System.out.println();//增强forfor(int t : ts){System.out.println(t);}System.out.println("----------------");System.out.println();ts.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer i) {System.out.println(i);}});System.out.println("----------------");ts.forEach(i -> System.out.println(i));}
}
自然排序Comparable

案例需求

  • 存储学生对象并遍历,创建TreeSet集合使用无参构造方法

  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

实现步骤

  1. 使用空参构造创建TreeSet集合

    用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  2. 自定义的Student类实现Comparable接口

    自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法
  3. 重写接口中的compareTo方法

    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

代码实现

学生类

public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {//按照对象的年龄进行排序//主要判断条件: 按照年龄从小到大排序int result = this.age - o.age;//次要判断条件: 年龄相同时,按照姓名的字母顺序排序result = result == 0 ? this.name.compareTo(o.getName()) : result;return result;}
}

测试类

public class MyTreeSet2 {public static void main(String[] args) {//创建集合对象TreeSet<Student> ts = new TreeSet<>();//创建学生对象Student s1 = new Student("zhangsan",28);Student s2 = new Student("lisi",27);Student s3 = new Student("wangwu",29);Student s4 = new Student("zhaoliu",28);Student s5 = new Student("qianqi",30);//把学生添加到集合ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);//遍历集合for (Student student : ts) {System.out.println(student);}}
}
比较器排序Comparator

代码

学生

public class Student2 implements Comparable<Student2>{private String name;private int age;private int chinese;private int math;private int english;public Student2() {}public Student2(String name, int age, int chinese, int math, int english) {this.name = name;this.age = age;this.chinese = chinese;this.math = math;this.english = english;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getChinese() {return chinese;}public void setChinese(int chinese) {this.chinese = chinese;}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}@Overridepublic String toString() {return "Student2{" +"name='" + name + '\'' +", age=" + age +", chinese=" + chinese +", math=" + math +", english=" + english +'}';}@Overridepublic int compareTo(Student2 o) {int sum1 = this.getChinese() + this.getMath() + this.getEnglish();int sum2 = o.getChinese() + o.getMath() + o.getEnglish();int i = sum1 - sum2;i = i == 0 ? this.getChinese() - o.getChinese() : i;i = i == 0 ? this.getEnglish() - o.getEnglish() : i;i = i == 0 ? this.getMath() - o.getMath() : i;i = i == 0 ? this.getAge() - o.getAge() : i;i = i == 0 ? this.getName().compareTo(o.getName()) : i;return i;}
}

测试类

public class Test {public static void main(String[] args) {Student2 s1 = new Student2("zhangsan",23,99,55,65);Student2 s2 = new Student2("lisi",24,65,67,46);Student2 s3 = new Student2("wangwu",25,42,35,46);Student2 s4 = new Student2("zhaoliu",26,86,55,86);TreeSet<Student2> ts = new TreeSet<>();ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);int sum = 0;for(Student2 t : ts){sum = t.getChinese()+t.getMath()+t.getEnglish();System.out.print(t);System.out.print(sum);System.out.println();}}}

总结

如果想要集合中的元素可重复

ArrayList集合,基于数组的

如果想要集合中的元素可重复,而且当前的增删操作明显多于查询

LinkedList集合,基于链表的

如果想对集合中的元素去重

HashSet集合,基于哈希表的

如果想对集合总的元素去重,而且保存存取顺序

用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet

如果想对集合中的元素进行排序

用TreeSet集合,基于红黑树,后续

用List集合实现排序

双列集合

特点

  • 双列集合一次需要存一对数据,分别为键和值

  • 键不能重复,值可以重复

  • 键和值是一一对应的,每一个键只能找到自己对应的值

  • 键+值这个整体,我们称之为"键值对"或者"键值对对象",在java中叫做"Entry对象"

Map集合

Map集合概述

interface Map<K,V>  K:键的类型;V:值的类型

使用示例

public class MapTest {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();//V put(K key, V value) 将指定的值与该映射中的指定键相关联map.put("1","zhangsan");map.put("2","lisi");map.put("2","wangwu");map.put("3","zhaoliu");//输出集合对象System.out.println(map);//{1=zhangsan, 2=wangwu, 3=zhaoliu}}
}
Map集合的基本功能

方法介绍

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
Map集合的遍历
方式一
  • 遍历思路

    • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

      • 把所有的丈夫给集中起来

      • 遍历丈夫的集合,获取到每一个丈夫

      • 根据丈夫去找对应的妻子

  • 步骤分析

    • 获取所有键的集合。用keySet()方法实现

    • 遍历键的集合,获取到每一个键。用增强for实现

    • 根据键去找值。用get(Object key)方法实现

  • 代码实现

public class MapTest2 {public static void main(String[] args) {//Map集合的第一个遍历方式//1.创建Map集合的对象Map<String, String> map = new HashMap<>();//添加元素map.put("张无忌", "赵敏");map.put("郭靖", "黄蓉");map.put("杨过", "小龙女");//3.1获取所有的键,把这些键放在一个单列集合中Set<String> keys = map.keySet();//3.2遍历单列集合,得到每一个键for (String key : keys) {//3.3利用map集合中的键获取对应的值 getString value = map.get(key);}//迭代器遍历Iterator<String> it = keys.iterator();while (it.hasNext()) {String key = it.next();String value = map.get(key);System.out.println(key + "=" + value);}//增强for遍历keys.forEach(new Consumer<String>() {@Overridepublic void accept(String key) {String value = map.get(key);System.out.println(key + " = " + value);}});keys.forEach(key -> {String value = map.get(key);System.out.println(key + "=" + value);});}
}

LinkedHashMap

  • 由键决定:有序,不重复,无索引
  • 这里的有序指的是保证存储和取出的元素顺序一致

原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序

TreeMap集合

  • TreeMap底层是红黑树结构

  • 依赖自然排序或者比较器排序,对键进行排序

  • 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

  • 由键决定特性:不重复,无索引,可排序

  • 可排序:对键进行排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/NKVk/8956.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

TikTok云手机可以运营多少个账号

在社交媒体平台上&#xff0c;尤其是像TikTok这样的热门应用中&#xff0c;账号运营已经成为了许多人的日常工作。而利用云手机技术&#xff0c;一台手机能够同时运营多个TikTok账号&#xff0c;为用户带来了更大的便利和灵活性。本文将探讨 TikTok云手机能够运营多少个账号&am…

考研数据结构算法机试训练1

中南大学上机压轴题 测试数据&#xff1a; 3 500 0.6 100 0.8 200 0.7 100 输出 390首先要对输入的折扣进行排序&#xff0c;优先使用比率低的z进行支付。 然后用lowcost记录目前多少钱是打过折的。T-lowcost就是剩余没打折的。 每次循环用上一个人的折扣额度。若所有人折扣额…

无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解

物理建模是四旋翼无人机控制系统建模的基础&#xff0c;主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号&#xff08;如控制电压&#xff09;之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

网络编程学习

思维导图 知识点回顾 1、什么是回调函数 作为其他函数参数的函数。 2、结构体与共用体的区别 结构体的各个成员会占用不同的内存&#xff0c;互相之间没有影响&#xff1b;而共用体的所有成员占用同一段内存&#xff0c;修改一个成员会影响其余所有成员。结构体占用的内存大…

C++重点---STL简介

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、STL简介 STL&#xff08;Standard Template Library&#xff09;是C标准库中的一个重要组成部分&#xff0c;它提供了…

Vue 环境安装以及项目创建

环境安装 nodejs 安装 下载地址&#xff1a;https://nodejs.org/dist/v18.16.1/ 根据系统类型选择对应安装包&#xff0c;选择安装路径那个后一直下一步即可安装完成。 配置npm 代理镜像,设置为淘宝的镜像地址&#xff08;后面按照依赖可以加速下载安装包&#xff09; npm c…

FMM 笔记:FMM(colab上执行)【官方案例解读】

在colab上运行&#xff0c;所以如何在colab上安装fmm&#xff0c;可见FMM 笔记&#xff1a;在colab上执行FMM-CSDN博客 fmm见&#xff1a;论文笔记&#xff1a;Fast map matching, an algorithm integrating hidden Markov model with precomputation_ubodt(upper bounded ori…

tkinterFrame框架+标签框架LabelFrame+Toplevel窗口的使用

1.在tkinter中&#xff0c;Frame是一个容器小部件用于组织和管理其他小部件。它可以作为一个独立的可见区域&#xff0c;也可以作为其他小部件的父容器。 import tkinter as tk import tkinter.ttk as ttk import tkinter.messagebox as mbm tk.Tk() m.title("tkinter L…

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…

Jenkins与服务器时间不一致

问题复现 今天在Jenkins上设置定时部署项目时&#xff0c;发现Jenkins显示的时间与Linux系统显示的时间不一致&#xff0c;这太难过了&#xff0c;必须保持颗粒度一致。 解决办法 ①查看当前服务器上的时区 因为是CentOS系统&#xff0c;直接通过以下命令即可查看时区&#xf…

vue中 input disable后无法触发点击事件

问题&#xff1a;input标签为disabled后&#xff0c;点击事项无效&#xff1b;当点击文字**“请选择”**时无法触发点击事件&#xff0c;其父标签的其余位置均可触发 解决&#xff1a;只需要在input标签中添加 style“pointer-events:none” 即可 pointer-events: none 作用是…

OpenCV实现目标追踪

目录 准备工作 语言&#xff1a; 软件包&#xff1a; 效果演示 代码解读 &#xff08;1&#xff09;导入OpenCV库 &#xff08;2&#xff09;使用 cv2.VideoCapture 打开指定路径的视频文件 &#xff08;3&#xff09;使用 vid.read() 读取视频的第一帧&#xff0c;ret…

RK3568 android11 调试陀螺仪模块 MPU-6500

一&#xff0c;MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器&#xff0c;属于惯性测量设备&#xff08;IMU&#xff09;的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器&#xff08;DMP&#xff09;&#xff0c;能够提供6轴的运动…

导入自定义包仍报错ModuleNotFoundError

第二个框中&#xff0c;已经导入了data_utils和net但仍然报错ModuleNotFoundError&#xff0c;解决方法是&#xff0c;像第一个框那样&#xff0c;添加路径。

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

css实现梯形

<div class"trapezoid"></div> .trapezoid {width: 200px;height: 0;border-bottom: 100px solid red; /* 定义梯形的底边 */border-left: 50px solid transparent; /* 定义梯形的左边 */border-right: 50px solid transparent; /* 定义梯形的右边 */} …

MATLAB中的makeweight函数

W makeweight(dcgain,[freq,mag],hfgain) W makeweight(dcgain,[freq,mag],hfgain,Ts) W makeweight(dcgain,[freq,mag],hfgain,Ts,N) W makeweight(dcgain,wc,hfgain,___) W makeweight(dcgain,wc,hfgain&#xff0c;___)表示增益交叉频率wc。该语法相当于将…

(done) 两个矩阵 “相似” 是什么意思?

参考视频&#xff1a;https://www.bilibili.com/video/BV1zu411673J/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料&#xff1a;https://baike.baidu.com/item/%E7%9B%B8%E4%BC%BC%E7%9F%A9%E9%98%B5/10369874?frge_a…

贪心算法

贪心算法 例题1、股票买卖题目信息思路题解 2、货仓选址题目信息思路题解 3、糖果传递题目信息思路题解 4、雷达设备题目信息思路题解 例题 1、股票买卖 题目信息 思路 相邻两天&#xff0c;后>前&#xff0c;则交易一次 题解 #include <bits/stdc.h> #define en…

【记录】element Plus table设置了height=100%时,当数据为空时,table高会出现无限变大的情况

例如&#xff1a; 当table设置了height100%&#xff0c;而tableData又是空的时候&#xff0c;会出现height无限自动增大。 正常情况是height会固定不变了&#xff0c; 只有tableData为空时才会出现 <div style"height:100%"><el-table :data"table…
推荐文章