Java 集合框架与泛型实战指南

news2024/9/20 14:20:58

Collection:

Collection 不唯一,无序

List 不唯一,有序

Set 唯一,无序

ArrayList:内部使用长度可变的数组,遍历查询效率高

LinkedList:采用双向链表实现,增删改效率比较高

ArrayList:

常用方法:

ArrayList方法实例:

  public static void main(String[] args) {
        List list = new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("马六");
        System.out.println("大小为"+list.size());

        //指定位置插入,后面的会往后走
        list.add(3,"陈梦雨");
        System.out.println(list);

        //循环打印集合信息
        for(Object obj:list){
            System.out.println("循环打印"+obj);
        }

        //根据下标获取集合中的元素
        Object aa = list.get(1);
        System.out.println(aa);

        String bb = (String) list.get(2);
        System.out.println(bb);

        System.out.println("第三个"+list.get(3));

        //查找集合中是否存在指定元素
        boolean ccc = list.contains("马六");
        System.out.println(ccc);

        //根据下标删除
        list.remove(2);
        //根据元素删除,删除后,后面的会自动补过来
        list.remove("张三");

        //清空所有内容
        list.clear();
        System.out.println("清空后集合长度:"+list.size());

        //判断是否为空
        System.out.println("判断集合是否为空:"+list.isEmpty());
    }

LinkedList类:

LinkedList:采用双向链表实现,增删改效率比较高

常用方法:

链表本身不具备下标功能,但 LinkedList 类提供了下标访问方法以便于与 List 接口兼容。 所以LinkedList可以使用get()方法用来获取特定值。


 

Set接口:

Set接口存储一组唯一,无序的对象

Set接口不存在get()方法,因为没有下标

set接口下有两个实现类分别是HashSet和TreeSet

HashSet:
  • 底层结构:基于哈希表(HashMap),不保持元素的顺序。
  • 性能:提供常数时间复杂度的 add, remove, 和 contains 操作,适用于快速访问。
  • 特点:不保证元素的顺序,元素顺序可能会改变。对于需要不重复元素且对顺序无关的情况,HashSet 非常合适。

TreeSet:
  • 底层结构:基于红黑树(自平衡的二叉搜索树),保持元素的排序。
  • 性能:提供对 add, remove, 和 contains 操作的对数时间复杂度,适用于需要排序或范围查询的场景。
  • 特点:自动对元素进行排序(自然顺序或通过提供的 Comparator),使得可以遍历元素时按升序排列。

迭代器Iterator:

通过迭代器Iterator实现遍历

1.通过Set接口创建迭代器

2. hasNext(): 判断是否存在另一个可访问的元素

3.next(): 返回要访问的下一个元素

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");

Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

方法2:增强型for循环

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");

for (String item : set) {
    System.out.println(item);
}

Set接口如何判断加入对象是否已经存在呢?

采用对象的equals()方法比较两个对象是否相等,因为存放的是对象引用(地址

HashSet是Set接口常用的实现类
Set newsTitleSet = new HashSet();

Map:

Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作

最常用的实现类是HashMap

Map集合中的键具有唯一性,当向集合中添加已存在的键值元素时,会覆盖之前已存在的键值元素

Map接口常用方法:

put() 方法。如果键存在则覆盖值。如果键不存在,它会插入一个新的键值对。


        Map<String, String> map = new HashMap<>();
//增加集合元素
        map.put("CN","中华人民共和国");
        map.put("US","美利坚合众国");
        map.put("RU","俄罗斯联邦");
        map.put("SB","日本");
//通过key获取对应的值
        System.out.println("CN对应的国家是:"+map.get("CN"));
//获取集合大小
        System.out.println("Map中共有"+map.size()+"组数据");
//判断是否存在这个key
        System.out.println("Map中包含FR的key吗?"+map.containsKey("FR"));
//打印map
        System.out.println("Map集合打印"+map);

 // 删除指定键对象映射的键值对元素
             map.remove("SB");
//再增加一遍相同的键,值会覆盖
     map.put("SB","日本");

//返回键的集合
       Set Allkeys  =  map.keySet();
//返回值的集合
       Set Allvalues = map.values();

//通过Set来获得迭代器
//先把所有的key都放进Set集合中
        Set keys = map.keySet();
        Iterator it = keys.iterator();
        while(it.hasNext()){
            Object next = it.next();
            System.out.println(next+"对应的值是"+map.get(next));
        }
//清空Map中的数据
        map.clear();
    }
}

Map的遍历:

  1. HashMap 本身没有实现 Iterable 接口,因此不能直接通过 iterator() 方法进行迭代。 keySet()values()entrySet(),这些集合实现了 Iterable 接口,因此可以获取相应的 Iterator 进行迭代。
  2. 因为Map有键和值,所以不能用for增强循环,
  3. 在没定义泛型之前,map中的对象都可以放Object类型

方法1:通过迭代器Iterator实现遍历

       //通过Set来获得迭代器
        //先把所有的key都放进Set集合中
        Set keys = map.keySet();
        Iterator it = keys.iterator();
        while(it.hasNext()){
            Object next = it.next();
            System.out.println(next+"对应的值是"+map.get(next));
        }

方法2:增强型for循环

因为map集合中有键和值,所以不能用for增强循环遍历

  for (Object obj:map){
            

        }

Iterator接口:

Iterator接口是Java集合框架中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

专门实现集合的遍历的,可以用于List和Set集合,不能用于HashMap

主要的两个方法:

hasNext()

判断是否存在下一个可访问的元素,是则返回true

next()

返回要访问的下一个元素

使用Iterator遍历Arraylist集合:

首先通过调用ArrayList集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

  ArrayList list = new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        Iterator it= list.iterator();
        while (it.hasNext()){
            String name = (String) it.next();//这个是Object类,要转为String类
            System.out.println(name);
        }

    }

在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext()方法返回false,表示到达了集合的末尾终止对元素的遍历。

remove方法:

list.remove();直接这样就可以,不需要在remove中再添加其他的

 while (it.hasNext()){
           String aa=it.next();
           if (!sets.add(aa)){
               //添加失败
               list.remove();
           }
        }

在 LinkedList 的 Iterator 中调用 remove() 方法时,不需要传递要删除的元素,因为 Iterator 已经持有当前遍历到的元素。在 Iterator 的 remove() 方法调用时,它会删除当前 Iterator 位置的元素。

泛型集合:

集合中可以存储任意类型的对象元素,但是当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就统一变成了Object类型。换句话说,在程序中无法确定一个集合中的元素到底是什么类型,那么在取出元素时,如果进行强制类型转换就很容易出错。

所以就可以限制在集合中存储的对象

把数据类型当作参数进行传递

格式:
ArrayList<参数化类型> list = new ArrayList<参数化类型>();

传递的数据类型必须是引用数据类型。基本数据类型报错,不过可以使用基本数据类型的包装类。

Collections算法类:

Collections和Collection不同,前者是集合的操作类,后者是集合接口

Collections提供的常用静态方法,所以可以直接用Collections调用

  • sort():排序,升序
  • max():查找最大值
  • min():查找最小值
  • reverse():降序
  • binarySearch(集合 , 内容):查询指定内容是否存在

    List<Integer> list = new LinkedList<>();
        list.add(77);
        list.add(88);
        list.add(99);
        list.add(11);
        list.add(66);

        //获得集合中最大的值
        int max = Collections.max(list);
        System.out.println("max:"+max);

        //获得集合中最小的值
        int min = Collections.min(list);
        System.out.println("min:"+min);

        //升序
        Collections.sort(list);
        System.out.println(list);

        //降序
        Collections.reverse(list);
        System.out.println("降序"+list);

        //查询指定内容是否存在
        int i = Collections.binarySearch(list, 77);
        System.out.println("i===="+i);

重写ComparaTo方法:

让当前对象重写compareTo方法

负数放左边

正数放右边

等于0按照默认排序

通过sort方法调用comparaTo方法:

重写 compareTo 方法后,Collections.sort 调用它是因为 sort 方法需要一个排序规则。compareTo 方法提供了对象的自然排序顺序,sort 方法通过调用 compareTo 来比较对象,从而决定它们在排序中的顺序。这使得 Collections.sort 能够按 compareTo 方法定义的逻辑对对象进行排序。

 Collections.sort(lists);

Collections排序:

Collections类可以对集合进行排序、查找和替换操作实现一个类的对象之间比较大小,该类要实现Comparable接口重写compareTo()方法

  @Override
    public int compareTo(Student stu) {
        if (this.score> stu.getScore()){
            return 0;//不换
        } else if (this.score< stu.getScore()) {
            return 1;//换

        }else {
                return  -1;//都相同就不换
            }
        }

this延申:

this.的意思是new一个对象,但是不能老是new对象,但是新的对象不能老是变,所以就用this,然后这个this就是指成员变量,也是默认对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【智能排班系统】Hibernate Validator 参数校验

&#x1f3af;导读&#xff1a;本文档介绍了参数校验的重要性及其在软件开发中的作用&#xff0c;强调了数据完整性、安全性、用户体验、系统稳定性及开发效率等方面的关键价值。文档详细阐述了Hibernate Validator这一流行的Java验证框架的使用方法&#xff0c;展示了如何利用…

适马相机cf卡剪切的数据还能恢复吗?可尝试这几种方法

“本想把适马相机CF卡里的珍贵数据剪切到电脑上&#xff0c;‌以备不时之需&#xff0c;‌但是不知道怎么回事&#xff0c;剪切后数据既不在电脑上&#xff0c;‌CF卡里也没了&#xff0c;这可真是让我心急如焚&#xff01;‌求大神指点迷津&#xff0c;‌帮我找回那些重要的文…

Vue 选项式api和组合式api 路由嵌套

选项式api和组合式api是两种不同的语法习惯&#xff0c;<template>标签内还是该怎么写就怎么写&#xff0c;不一样的只是<script>里面的语法改变了。 目录 选项式api&#xff1a; 组合式api&#xff1a; 1)省略各种关键字&#xff1a; 省略前&#xff1a; 省略后…

【Qt】菜单栏

目录 菜单栏 例子&#xff1a;创建菜单栏、菜单、菜单项 例子&#xff1a;给菜单设置快捷键 例子&#xff1a;给菜单项设置快捷键 例子&#xff1a;添加子菜单 例子&#xff1a;添加分隔线 例子&#xff1a;添加图标 菜单栏 Qt中的菜单栏是通过QMenuBar这个类实现的&…

LeetCode --- 412周赛

题目列表 3264. K 次乘运算后的最终数组 I 3266. K 次乘运算后的最终数组 II 3265. 统计近似相等数对 I 3267. 统计近似相等数对 II 一、K次乘预算后的最终数组 I & II I 数据范围比较小&#xff0c;可以暴力模拟&#xff0c;代码如下 class Solution { public:vecto…

Day52 | dijkstra(堆优化版)Bellman_ford 算法

dijkstra&#xff08;堆优化版&#xff09; 题目 47. 参加科学大会 47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。 小明的起点是第一个车站&a…

vscode 未定义标识符 “uint16_t“C/C++(20) 但是可以顺利编译

这是没有指定编译器的原因 解决方法&#xff1a; 打开 或c_cpp_properties.json&#xff0c;添加编译器

★ 算法OJ题 ★ 力扣611 - 有效三角形的个数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;椎名日和将和大家一起做一道双指针算法题--有效三角形的个数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 二 算法解析 给三个数&#xff0c;判断是否能构成三角形的条件&#xff1a;两个较小的数相加大于…

机器学习数学公式推导之高斯分布

文章目录 1、介绍引入1.1 频率派的观点1.2 贝叶斯派的观点1.3 小结 2、数学基础2.1 二阶中心矩2.2 样本方差2.3 高斯分布2.3.1 一维情况 MLE2.3.2 多维情况 本文参考 B站UP: shuhuai008 跳转 &#x1f339;&#x1f339; 1、介绍引入 在统计学和概率论中&#xff0c; P ( x ∣ …

史上最全的MybatisPlus学习教程从入门到精通

一、MybatisPlus是什么 1.1 MyBatis-Plus简介 MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;它在MyBatis的基础上进行了增强&#xff0c;但并没有改变原有的MyBatis框架。MyBatis-Plus的主要目标是简化开发和提高开发效率。它提供了诸如分…

源码阅读-SpirngBoot Mybatis 自动配置

MybatisPlusAutoConfiguration ObjectProvider#getIfAvailable ObjectProvider为我们提供了拓展&#xff0c;我们可以自定义一些插件或者类型转换器&#xff0c;同时也可以定义一些Customizer用来配置SqlSessionFactoryBean,MybatisPlusProperties等。 通过源码我们可以看到最…

Redis从入门到入门(上)

1.Redis概述 文章目录 1.Redis概述1.1 什么是Redis1.2 Redis的应用场景 2.Linux下Redis的安装与使用2.1 Redis下载2.2 Redis的启动2.3 Redis配置2.4 连接Redis 1.1 什么是Redis Redis是用C语言开发的一个开源的高性能键值对&#xff08;key-value&#xff09;数据库&#xff0…

数学建模--K-Means聚类分析

目录 1.聚类分析步骤 1.1简单介绍 1.2两个概念 1.3几种距离 1.4更新质心 1.5终止条件 2.归一化处理 3.肘部法则 4.搭建K-Means分析模型 5.选择最佳K值 6.绘制3D图形 1.聚类分析步骤 1.1简单介绍 K-Means聚类分析是属于聚类分析的一种&#xff0c;这个数据机器学习的…

YOLOv8改进 | Neck篇 | YOLOv8引入Slim-Neck(超轻量)

1. Slim-Neck介绍 摘要:目标检测是计算机视觉中重要的下游任务。 对于车载边缘计算平台来说,巨大的模型很难达到实时检测的要求。 而且,由大量深度可分离卷积层构建的轻量级模型无法达到足够的精度。 我们引入了一种新的轻量级卷积技术 GSConv,以减轻模型重量但保持准确性。…

《软件工程导论》(第6版)第4章 形式化说明技术 复习笔记

第4章 形式化说明技术 一、概述 按照形式化的程度&#xff0c;可以把软件工程使用的方法划分成非形式化、半形式化和形式化3类。用自然语言描述需求规格说明&#xff0c;是典型的非形式化方法。用数据流图或实体联系图建立模型&#xff0c;是典型的半形式化方法。所谓形式化…

idea的springboot里面的resources是什么

在IDEA&#xff08;IntelliJ IDEA&#xff09;中的Spring Boot项目中&#xff0c;resources目录扮演着非常重要的角色。这个目录主要用于存放项目的非代码资源&#xff0c;包括但不限于配置文件、静态资源文件&#xff08;如图片、CSS、JavaScript等&#xff09;、模板文件&…

YOLO缺陷检测学习笔记(2)

YOLO缺陷检测学习笔记&#xff08;2&#xff09; 残差连接1. **YOLO 的残差连接结构**2. **YOLO 使用残差连接的目的**3. **YOLO 中的残差块**4. **YOLOv3 和 YOLOv4 的残差连接架构** YOLO网络架构概述1. 特征提取网络2. 预测头&#xff08;Detection Head&#xff09;3. 后处…

Android CCodec Codec2 (五)C2Param - Ⅲ

这一节我们来看看简单参数的定义方式 1、C2SimpleValueStruct Codec2框架提供了模板类C2SimpleValueStruct来帮助我们定义非灵活数组的简单参数。C2SimpleValueStruct的定义如下&#xff1a; template<typename T> struct C2SimpleValueStruct {T value; ///< simpl…

阿里 “通义灵码” 真的 “灵吗”,全保姆级实操

最近很多朋友&#xff0c;都在关注阿里公测的“通义灵码”&#xff0c;我索性也安装了&#xff0c;准备看看它真的有说的那么“灵吗”&#xff1f; 一、安装 官网&#xff1a;https://tongyi.aliyun.com/lingma/ 安装方式&#xff1a;https://tongyi.aliyun.com/lingma/downl…

Redis 集群:引领企业级 NoSQL 数据库新潮流

一 、关系型数据库和 NoSQL 数据库 在当今的数据库领域&#xff0c;关系型数据库和非关系型数据库都占据着重要的地位。 关系型数据库 关系型数据库是建立在关系模型基础上的数据库&#xff0c;它通过表与表之间的关系来存储和管理数据。 特点 数据结构清晰&#xff1a;以二…