【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("集合中包含美美的信息");
} elseSystem.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增强语法遍历HashSetfor (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循环遍历MapSystem.out.println("使用增强型for循环遍历,所有企鹅的昵称和品种分别是:");for (Map.Entry<String,String> entry : pet.entrySet()) {System.out.println(entry.getKey() + "\t\t" + entry.getValue() );}System.out.println("----------------------------------------------------");// 使用Lambda表达式遍历MapSystem.out.println("使用Lambda表达式遍历,所有企鹅的昵称和品种分别是:");pet.forEach( (k, v) -> {System.out.println(k + "\t\t" + v);});System.out.println("----------------------------------------------------");//使用迭代器遍历MapSystem.out.println("使用迭代器遍历,所有企鹅的昵称和品种分别是:");Set<String> keys = pet.keySet();        //获取map集合中所有的keyIterator<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和构造方法@Overridepublic 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>(){@Overridepublic 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);}
}

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

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

相关文章

[c 语言] 大端,小端;网络序,主机序

在网络编程中&#xff0c;特别是底层网卡驱动开发时&#xff0c;常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序&#xff0c;高位保存在低地址还是高地址&#xff0c;以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性&#xff0c;常见…

Vulhub 靶场训练 DC-9解析

一、搭建环境 kali的IP地址是&#xff1a;192.168.200.14 DC-9的IP地址暂时未知 二、信息收集 1、探索同网段下存活的主机 arp-scan -l #2、探索开放的端口 开启端口有&#xff1a;80和22端口 3、目录扫描 访问80 端口显示的主页面 分别点击其他几个页面 可以看到是用户…

SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制

文章目录 前言10.5 声明式事务的传播行为控制10.5.1 修改测试代码&#xff08;1&#xff09;新建一个Service类&#xff0c;并引用UserService&#xff08;2&#xff09;修改主启动类 10.5.2 PROPAGATION_REQUIRED10.5.2.1 tm.getTransaction&#xff08;1&#xff09;获取事务…

用于自监督视觉预训练的屏蔽特征预测

Masked Feature Prediction for Self-Supervised Visual Pre-Training 一、摘要 提出了用于视频模型自监督预训练的掩模特征预测&#xff08;MaskFeat&#xff09;。首先随机屏蔽输入序列的一部分&#xff0c;然后预测屏蔽区域的特征。研究了五种不同类型的特征&#xff0c;发…

遥感、航拍、影像等用于深度学习的数据集集合

遥感图像的纹理特征异常繁杂&#xff0c;地貌类型多变&#xff0c;人工提取往往存在特征提取困难和特征提取不准确的问题&#xff0c;同时&#xff0c;在这个过程中还会耗费海量的人力物力。随着计算力的突破、数据洪流的暴发和算法的不断创新&#xff0c;在具有鲜明“大数据”…

ffmpeg的pcm、yuv小知识点

ffmpeg的pcm、yuv小知识点 pcm、yuv保存调用&#xff0c;写个通用工具方法&#xff0c;平时快速保存&#xff0c;和调用方便查看自己bug ffmpeg的AVFrame存储 yuv 调用方法 保存方法 void save_yuv420p_file(unsigned char *y_buf , unsigned char *u_buf,unsigned char *…

git commit 后,本地远端都没有记录,消失不见

今天git commit 之后发现远端没有记录&#xff0c;本地没有最新代码记录 git commit 后&#xff0c;提交记录会消失不见的原因可能是&#xff1a; git只git commit了&#xff0c;没有push到远程分支&#xff0c;切换到其他分支时丢失。而且看不到提交记录&#xff0c;和找不到…

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…

Spring Boot application.properties和application.yml文件的配置

在Spring Boot中&#xff0c;application.properties 和 application.yml 文件用于配置应用程序的各个方面&#xff0c;如服务器端口、数据库连接、日志级别等。这两个文件是Spring Boot的配置文件&#xff0c;位于 src/main/resources 目录下。 application.properties 示例 …

vue中动态表格中文校验,但是中文的参数无法获取

场景&#xff1a; 解决方案&#xff1a; 因为上述的正则表达式后&#xff0c;使用搜狗输入法没有问题&#xff0c;但采用微软自带输入法后&#xff0c;会存在输入数字及英文时为正常&#xff0c;切换为汉字后&#xff0c;会存在吞并当前光标前的字符。具体吞并个数和输入法中有…

Unity发布webgl获取浏览器的URL

Unity发布webgl获取浏览器的URL Unity发布webgl之后获取浏览器的url 在unity中创建文件夹Plugins&#xff0c;然后添加添加文件UnityGetBrowserURL.jslib var GetUrlFunc {//获取地址栏的URLStringReturnValueFunction: function () {var returnStr window.top.location.hre…

SpringBoot3整合Swagger3,访问出现404错误问题(未解决)

秉承着能用就用新的的理念&#xff0c;在JDK、SpringBoot、SpringCloud版本的兼容性下&#xff0c;选择了Java17、SpringBoot3.0.2整合Swagger3。 代码编译一切正常&#xff0c;Swagger的Bean也能加载&#xff0c;到了最后访问前端页面swagger-ui的时候出现404。 根据网上资料…

Oracle ADG相关介绍

文章目录 一、ADG原理1、ADG介绍2、ADG搭建流程 二、ADG相关参数三、增量修复 一、ADG原理 1、ADG介绍 Oracle ADG&#xff08;Advanced Data Guard&#xff09;是Oracle数据库的一项高可用和灾难恢复技术&#xff0c;它通过将数据保持在物理备库中来提供数据保护和容灾能力。…

StringBuffer StringBuilder

String 为什么StringBuilder是线程不安全的&#xff1f;StringBuffer是线程安全的&#xff1f; - Jacian - 博客园 (cnblogs.com) StringBuilder 线程安全的可变字符学序列 速度快 StringBuffer 线程不安全的可变字符序列 创建StringBuilder对象 new StringBuilder&…

c++面试一

1.#include使用 在C/C中&#xff0c;#include 预处理指令用于包含头文件&#xff0c;这些头文件通常包含了函数声明、宏定义以及其他的声明和定义。#include 指令后面跟着的文件名可以使用双引号 "" 或尖括号 <> 来指定&#xff0c;它们之间有一些区别。 双引…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构

文章目录 前言实战演示写在最后 前言 相信很多人都使用过LinkedHashMap&#xff0c;LinkedHashMap中的removeEldestEntry可以删除老旧的元素&#xff0c;我们可以以此来实现一个LRU缓存结构&#xff0c;并结合java中JUC包中的各种多线程锁机制来保证多线程安全。 以下是我遇见…

【前端素材】推荐优质后台管理系统Dashmin平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种具有多层次结构的软件系统&#xf…

邀请函 | 2024年数据技术嘉年华集结号已吹响,期待您参会!

龙腾四海内&#xff0c;风云际会时&#xff0c;2024年中国数据嘉年华如约而至。从起初小范围的网友聚会&#xff0c;到如今面向全国各地从业者、爱好者的年度集会&#xff0c;纵使岁月更迭&#xff0c;我们初心依旧。我们在各自最好的年华里共同见证了中国数据库行业的蓬勃发展…

Linux下的IO多路复用

文章目录 一. IO的概念和分类1. IO操作的原理&#xff1a;二. I/O多路复用使用场景和作用1. 问题&#xff1a; 一台网络服务器需要接收100台客户端的连接和数据通信&#xff0c;应该如何设计和实现&#xff1f;2. I/O多路复用机制&#xff1a; 三. Select poll epollselectpoll…