【JavaSE】集合框架

目录

  • 程序场景
    • 分析
  • Java集合框架包含的内容
    • List接口
      • ArrayList
      • LinkedList
      • List接口的常用方法
        • ArrayList
          • 案例背景
          • 分析
          • 代码示例
          • 扩展以下功能
          • 代码示例
        • LinkedList
          • 案例背景
          • 分析
          • 代码示例
          • LinkedList的特殊方法
      • ArrayList与LinkedList对比
    • Set接口
      • HashSet 集合的特点
      • 常用方法
      • 案例背景
        • 分析
        • 代码示例
        • 遍历Set集合
          • 迭代器
          • 增强型for循环
            • 语法
            • 代码示例
    • Map接口
      • HashMap类的特点
      • 常用方法
      • 代码示例
    • 集合在存取值时的类型转换问题
      • 泛型
    • Collections算法类
      • 常用方法
        • 排序
          • 案例:
          • 代码示例
          • 新写法,学生类不需要实现接口

程序场景

  • 问题1:程序中存储一个班的学员信息,假定一个班容纳20名学员?
    答:Student[] student = new Student[20];
  • 问题2:程序中如何存储每天的新闻信息?
    News[] news = new News[?];

分析

  1. 分析以上问题,发现数组在存储对象数据时存在一些明显的缺陷:
  • 数组长度固定不变,不能很好地适应元素数量动态变化的情况。
  • 通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。
  • 数组采用在内存中分配连续空间的方式存储,根据元素信息查找时效率比较低,需要多次比较。
  1. 针对数组的缺陷,Java提供了比数组更灵活、更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同的应用场合。
  2. 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java的集合框架

——可以使用Java的集合框架

Java集合框架包含的内容

在这里插入图片描述

List接口

在这里插入图片描述

ArrayList

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
在这里插入图片描述打个比方:大家买票都排好队了,突然有个人要插队,插到前面去,那么后面所有的人都要向后退;同样中途有一个人走了,那么后面的人都要往前进,因此插入和删除的操作比较麻烦,但是查询比较简单,每人都有对应的一个号(索引),寻找的时候直接叫号就可以了。

LinkedList

LinkedList采用链表存储方式。插入、删除元素时效率比较高
在这里插入图片描述这个跟自行车链条长了或者短了进行截断和添加是一样的原理,比较方便,但是找其中某一个结就麻烦了。

List接口的常用方法

在这里插入图片描述

ArrayList
案例背景

在电子宠物系统中如何存储多条狗子信息,获取狗子总数,逐条打印出各条狗子信息

分析
  1. 确定存储方式
  • ArrayList类是List接口的一个具体实现类
  • ArrayList对象实现了可变大小的数组
  • 随机访问和遍历元素时,它提供更好的性能
  1. 确定存储对象
  • 创建类型:狗狗类
  • 包含属性: 昵称、健康值、亲密度、品种
代码示例
 //创建四个狗子对象	
 … …	
 List<Dog> dogs = new ArrayList<>();
 dogs.add(ououDog);
 dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog);           // 添加feifeiDog到指定位置		
System.out.println("共计有" + dogs.size() + "条狗子。");
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
	Dog dog = dogs.get(i);
	… …
}
扩展以下功能

删除指定位置的狗狗,如第一个狗狗
删除指定的狗狗,如删除feifeiDog对象
判断集合中是否包含指定狗狗

代码示例
… 	
 dogs.remove(0);
 dogs.remove(feifeiDog);
…
 if(dogs.contains(meimeiDog)){
	System.out.println("集合中包含美美的信息");
} else
	System.out.println("集合中不包含美美的信息");
}
LinkedList
案例背景

在电子宠物系统中,如何在任何位置(头部、中间、尾部)添加、获取、删除狗狗对象

分析
  1. 确定存储方式
  • LinkedList类是List接口的一个具体实现类
  • LinkedList 类用于创建链表数据结构
  • 插入或者删除元素时,它提供更好的性能
  1. 确定存储对象
  • 创建类型:狗狗类
  • 包含属性: 昵称、健康值、亲密度、品种
代码示例
 // 创建多个狗狗对象
 … …
 LinkedList<Dog> dogs = new LinkedList<>();
 dogs.add(ououDog);
 dogs.add(yayaDog);
 dogs.addLast(meimeiDog);
 dogs.addFirst(feifeiDog);
		
 Dog dogFirst= (Dog)dogs.getFirst();
 System.out.println("第一条狗狗昵称是"+dogFirst.getName() );
		
 Dog dogLast= (Dog)dogs.getLast();
 System.out.println("最后一条狗狗昵称是"+dogLast.getName());
				
 dogs.removeFirst();
 dogs.removeLast();		
LinkedList的特殊方法

在这里插入图片描述

ArrayList与LinkedList对比

在这里插入图片描述

Set接口

Set 接口存储一组唯一,无序的对象,Set 接口常用的实现类:HashSet

HashSet 集合的特点

  1. 集合内的元素是无序排列且不允许重复。
  2. HashSet集合的查找效率高。
  3. 允许集合元素值为null。

常用方法

在这里插入图片描述

案例背景

电子宠物系统中,使用HashSet存储狗狗信息

分析
  • 创建HashSet对象,并添加数据。
  • 获取狗狗对象的总数。
  • 判断集合中是否包含指定的对象。
  • 移除指定对象。
  • 判断集合是否为空。
  • 遍历集合
代码示例
        // 1、创建四个狗狗对象
		Dog ououDog = new Dog("欧欧", "雪娜瑞");
		Dog yayaDog = new Dog("亚亚", "拉布拉多");
		Dog meimeiDog = new Dog("美美", "雪娜瑞");
		Dog feifeiDog = new Dog("菲菲", "拉布拉多");
		// 2、创建HashSet集合对象并把四个狗狗对象放入其中
		Set<Dog> dogs = new HashSet<>();
		dogs.add(ououDog);
		dogs.add(yayaDog);
		dogs.add(meimeiDog);
		dogs.add(feifeiDog);
		// 3、输出集合中狗狗的数量
		System.out.println("共计有" + dogs.size() + "条狗狗");
		System.out.println("美美是否存在:"+dogs.contains(meimeiDog));
		dogs.remove(meimeiDog);
		System.out.println("美美对象已经删除");
		System.out.println("删除后,还有" + dogs.size() + "条狗狗");
		System.out.println("集合是否为空:" + dogs.isEmpty());	
遍历Set集合
迭代器
        // 1、创建四个狗狗对象
        //  省略创建狗狗对象的代码
	    // 2、创建HashSet集合对象并把四个狗狗对象放入其中
		Set<Dog> dogs = new HashSet<>();
		dogs.add(ououDog);
		dogs.add(yayaDog);
		dogs.add(meimeiDog);
		dogs.add(feifeiDog);
		// 3、使用iterator()获取Iterator对象
		Iterator<Dog> iterator = dogs.iterator();
		// 4、使用Iterator遍历集合
		while (iterator.hasNext()) {
			Dog dog = iterator.next();
		    System.out.println(dog.getName() + "\t" + dog.getStrain());
		}

增强型for循环
语法

for(元素类型t 元素变量x : 数组或集合对象){
    引用了x的java语句
}

代码示例
        // 1、创建四个狗狗对象
		Dog ououDog = new Dog("欧欧", "雪娜瑞");
		Dog yayaDog = new Dog("亚亚", "拉布拉多");
		Dog meimeiDog = new Dog("美美", "雪娜瑞");
		Dog feifeiDog = new Dog("菲菲", "拉布拉多");
		// 2、创建HashSet集合对象并把四个狗狗对象放入其中
		Set<Dog> dogs = new HashSet<>();
		dogs.add(ououDog);
		dogs.add(yayaDog);
		dogs.add(meimeiDog);
		dogs.add(feifeiDog);
		// 3、使用for增强语法遍历HashSet
		for (Dog dog: dogs) {
			System.out.println(dog.getName()+"\t"+dog.getStrain());
		}

Map接口

Map接口存储一组键值对象,提供key到value的映射,Map接口常用的实现类HashMap

HashMap类的特点

  • 不保证映射的顺序,特别是不保证顺序恒久不变
  • 数据添加到HashMap集合后,所有数据的数据类型将转换为Object类型,所以从其中获取数据时需要进行强制类型转换

常用方法

在这里插入图片描述

代码示例

public class Animal {
    public static void main(String[] args) {
        Map<String,String> pet= new HashMap<>();
        pet.put("丫丫","Q妹");
        pet.put("菲菲","Q妹");
        pet.put("欧欧","Q仔");
        pet.put("美美","Q妹");
 
        // 使用增强型for循环遍历Map
        System.out.println("使用增强型for循环遍历,所有企鹅的昵称和品种分别是:");
        for (Map.Entry<String,String> entry : pet.entrySet()) {
            System.out.println(entry.getKey() + "\t\t" + entry.getValue() );
        }
        System.out.println("----------------------------------------------------");
 
        // 使用Lambda表达式遍历Map
        System.out.println("使用Lambda表达式遍历,所有企鹅的昵称和品种分别是:");
        pet.forEach( (k, v) -> {
            System.out.println(k + "\t\t" + v);
        });
        System.out.println("----------------------------------------------------");
 
        //使用迭代器遍历Map
        System.out.println("使用迭代器遍历,所有企鹅的昵称和品种分别是:");
        Set<String> keys = pet.keySet();        //获取map集合中所有的key
        Iterator<String> iterator = keys.iterator();
        while (iterator.hasNext()){
            System.out.println(pet.get(iterator.next()));
        }
    }
}

集合在存取值时的类型转换问题

如何解决以下强制类型转换时容易出现的异常问题

  • List的get(int index)方法获取元素
  • Map的get(Object key)方法获取元素
  • Iterator的next()方法获取元素

泛型

  • 泛型是JDK1.5的新特性。
  • 泛型的本质是参数化类型:将所操作的数据类型指定为一个参数,使代码可以应用于多种类型。
  • 泛型的定义:将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。
  • 优点
      所有强制转换都是自动和隐式进行的,安全简单。
      提高了代码的重用率
      在集合中存储数据时进行严格类型审查,确保只有合适类型的对象才能存储在集合中。
      从集合中检索对象时,减少了强制类型转换

Collections算法类

  • Collections类是Java提供的一个集合操作工具类。
  • Collections类定义了一系列用于操作集合的静态方法,用于实现对集合元素的排序、查找和替换等操作。
  • Collections和Collection是不同的,前者是集合的操作类,后者是集合接口

常用方法

sort():排序
binarySearch():查找
max()\min():查找最大\最小值

排序

实现一个类的对象之间比较大小,该类要实现Comparable接口

  • 重写 public int compareTo(T o)方法。
  • 如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
案例:

学生类Student实现了Comparable接口,重写 compareTo(Student o)方法,通过比较学号实现对象之间的大小比较

代码示例

学生类实现接口

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    private int high;
... 省略setter/getter、toString和构造方法
    @Override
    public int compareTo(Student o) {
        int result;
        if(this.age == o.age){
            result = o.high - this.high;
        }else {
            result = this.age - o.age;
        }
        return result;
    }
}

测试

public class UserComparto {
    static List studentList = new ArrayList<>();
    static{
        Student wanghao = new Student("王浩",24,175);
       ...创建多个对象

        studentList.add(wanghao);
        ...添加多个
    }
    public static void main(String[] args) {
        Collections.sort(studentList);
        studentList.forEach(System.out::println);
    }
}
新写法,学生类不需要实现接口
public class UserComparto {
    static List<Student> studentList = new ArrayList<>();
    static{
        Student wanghao = new Student("王浩",24,175);
        ...

        studentList.add(wanghao);
        ...
    }
    public static void main(String[] args) {
        Collections.sort(studentList,new Comparator<Student>(){
            @Override
            public int compare(Student o1, Student o2) {
                int result;
                if(o1.getAge() == o2.getAge()){//优先按年龄排序,年龄相等就按身高
                    result = o2.getHigh() - o1.getHigh();
                }else {
                    result = o1.getAge() - o2.getAge();
                }
                return result;
            }
        });
        studentList.forEach(System.out::println);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)

前面的文章中我们讲述了日志系统项目的前置知识点&#xff0c;再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统&#xff0c;主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置&#xff0c;且支持同步与异…

成都直播基地作为产业重要载体,引领直播行业健康、多元发展

近年来&#xff0c;我国网络直播行业呈现出井喷式的发展态势。众多直播平台如雨后春笋般涌现&#xff0c;直播内容丰富多样&#xff0c;涵盖游戏、电竞、美食、旅游、教育等多个领域。同时&#xff0c;成都直播产业园规模持续扩大&#xff0c;产业不断完善&#xff0c;整体呈现…

常见的音频与视频格式

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

蓝桥杯算法 一.

分析&#xff1a; 本题记录&#xff1a;m个数&#xff0c;异或运算和为0&#xff0c;则相加为偶数&#xff0c;后手获胜。 分析&#xff1a; 369*99<36500&#xff0c;369*100>36500。 注意&#xff1a;前缀和和后缀和问题

TABR: TABULAR DEEP LEARNING MEETS NEAREST NEIGHBORS IN 2023 阅读笔记

TABR: TABULAR DEEP LEARNING MEETS NEAREST NEIGHBORS IN 2023 论文地址&#xff1a;https://arxiv.org/abs/2307.14338 源代码&#xff1a;https://github.com/yandex-research/tabular-dl-tabr 摘要 针对表格数据问题&#xff08;例如分类、回归&#xff09;的深度学习&a…

利用项目管理软件规划的成功之路

项目开发对于任何类型的项目都是一个有用的过程。软件开发项目、建筑项目、运输项目和变更管理项目都可以从这种方法提供的结构、指导和策略中获益。 项目开发涉及规划项目时间表、投资资源以及安排团队成员的时间。与项目管理一样&#xff0c;项目开发贯穿项目始终&#xff0…

【前沿热点视觉算法】-用于RGB-D显著对象检测等领域的三维卷积神经网络

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。 1 论文题目 用于RGB-D显著对象检测等领域的三维卷积神经网络 2 论文摘要 RGB-deph&#xff08;RGB-D&#xff09;显著目标检测&#xff08;SOD&#xff09;近年来引起了越来越多的研究兴…

家装服务管理:Java技术的创新应用

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Python 鼠标模拟

鼠标模拟即&#xff1a;通过python 进行模拟鼠标操作 引入类库 示例如下&#xff1a; import win32api import win32con import time 设置鼠标位置 设置鼠标位置为窗口中的回收站。 示例如下&#xff1a; # 设置鼠标的位置 win32api.SetCursorPos([30, 40]) 双击图标 设置…

揭秘工业以太网交换机的冗余与备份技术:如何保障网络稳定与数据安全

在工业自动化和智能制造领域&#xff0c;网络通信的稳定性和可靠性堪称业务连续性的命脉。网络一旦出现故障&#xff0c;将可能直接导致生产中断&#xff0c;甚至造成重大经济损失。鉴于此&#xff0c;工业以太网交换机——作为工业网络的核心组件&#xff0c;其冗余技术与备份…

从Unity到Three.js(outline 模型描边功能)

指定模型高亮功能&#xff0c;附带设置背景颜色&#xff0c;获取随机数方法。 百度查看说是gltf格式的模型可以携带PBR材质信息&#xff0c;如果可以这样&#xff0c;那就完全可以在blender中配置好材质导出了&#xff0c;也就不需要像在unity中调整参数了。 import * as THRE…

微信小程序02: 使用微信快速验证组件code获取手机号

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 微信小程序获取手机号2.1 业务场景(使用与充值)2.2 准备工作2.3 具体代码使用与注释如下2.3.1 代码解释(一)[无需复制]2.3.2 代码解释(二)[无需复制] 2.4 最后一步 获取手机号信息2.4.1 两行代…

Java设计模式 | 七大原则之依赖倒转原则

依赖倒转原则&#xff08;Dependence Inversion Principle&#xff09; 基本介绍 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff08;接口/抽象类&#xff09;抽象不应该依赖细节&#xff0c;细节应该依赖抽象依赖倒转&#xff08;倒置&#xff09;的…

React基础-webpack+creact-react-app创建项目

学习视频&#xff1a;学习视频 2节&#xff1a;webpack工程化创建项目 2.1.webpack工程化工具&#xff1a;vite/rollup/turbopak; 实现组件的合并、压缩、打包等&#xff1b; 代码编译、兼容、校验等&#xff1b; 2.2.React工程化/组件开发 我们可以基于webpack自己去搭建…

React歌词滚动效果(跟随音乐播放时间滚动)

首先给audio绑定更新时间事件 const updateTime e > {console.log(e.target.currentTime)setCurrentTime(e.target.currentTime);};<audiosrc{currentSong.url}ref{audio}onCanPlay{ready}onEnded{end}onTimeUpdate{updateTime}></audio>当歌曲播放时间改变的时…

【力扣 - 有效的括号】

题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同…

免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案

网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂&#xff0c;选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台&#xff0c;它不仅具备高效的安全防护能力&#xff0c;还让网站安…

Uniapp + VUE3.0 实现双向滑块视频裁剪效果

效果图 <template><view v-if"info" class"all"><video:src"info.videoUrl"class"video" id"video" :controls"true" object-fit"fill" :show-fullscreen-btn"false"play-btn…

linux服务器vi文件中文乱码

服务器vi编辑中文乱码 cat 文本是中文 可以编辑 vi /etc/environment 文件修改为utf8中文字符集 LANGzh_CN.UTF-8 LANGUAGEen_US:en LC_CTYPE"zh_CN.UTF-8" LC_NUMERIC"zh_CN.UTF-8" LC_TIME"zh_CN.UTF-8" LC_COLLATE"zh_CN.UTF-8"…

springboot219基于SpringBoot的网络海鲜市场系统的设计与实现

网络海鲜市场系统的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…