Java集合框架和泛型

1.Java集合框架

架构图:在这里插入图片描述
Java的集合框架是一组用于存储和操作数据的类和接口。它提供了各种数据结构,如列表、集合、映射等,以及用于操作这些数据结构的算法和工具。Java集合框架位于Java.util包中,并且是Java编程中常用的核心组件之一。

Java集合框架主要包括以下接口和类:

Collection接口:它是集合框架中最基本的接口,定义了一组操作集合的方法,如添加、删除、迭代、查询等。

List接口:继承自Collection接口, List接口存储一组不唯一,有序(插入顺序)的对象。List的实现类有ArrayList、LinkedList。

Set接口:继承自Collection接口,Set接口存储一组唯一,无序的对象。常见的实现类有HashSet、TreeSet。

Map接口:存储一组键值对像,提供key到value的映射。常见的实现类有HashMap、TreeMap和LinkedHashMap。

2.Collection接口

接口是Java集合框架中的顶层接口之一,它表示一组对象的集合。它是一个通用的接口,可以用来存储任意类型的对象。

Collection接口定义了一些基本的方法,用于添加、删除、查询和遍历集合中的元素。它提供了一种统一的方式来操作集合,无论具体的实现类是什么。
常用方法:

boolean add(a)向当前集合中添加元素a,成功添加返回true
boolean addAll(Collection<? extends E> collection)向当前集合中添加指定集合中的所有元素,成功添加返回true
boolean remove(Object e)从当前集合中删除指定的元素
boolean removeAll(Collection<?> collection)删除当前集合中与指定集合中相同的元素。
boolean retainAll(Collection<?> collection)保留当前集合中与指定集合中相同的元素,删除其他元素。
void clear()清空集合中的所有元素。
boolean contains(Object element)判断集合中是否包含指定的元素。
boolean containsAll(Collection<?> collection)判断当前集合是否包含指定集合中的所有元素。
boolean isEmpty()判断集合是否为空。
int size()返回集合中元素的个数。
Object[] toArray()将集合转换为数组。
Iterator<E> iterator()返回一个迭代器,用于遍历集合中的元素。

3.list接口里的ArrayList实现类和LinkedList实现类

ArrayList实现类实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问的效率比较高。

LinkedList实现类采用链表存储方式,插入、删除元素时效率比较高。

ArrayList集合类

相比于LinkedList我们经常使用ArrayList

Array有三种遍历方式,都在下面代码里。
常用方法(方法名里的第一个是返回值,第二个才是方法名)

方法名作用
boolean add (Ocbject o)在列表的末尾添加元素,起始位置从0开始
void add(int index,Object o)在指定的索引位置添加元素。索引必须介于0和列表中元素个数之间
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)判断列表中是否存在指定元素
Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始
boolean clear()清空列表中的所有元素,返回true
boolean isEmpty()判断列表是否为空,如果为空则返回true
Iterator<E> iterator()返回一个迭代器,用于遍历列表中的元素
Object[] toArray()将列表中的元素以数组形式返回

补充:retainAll()
lista.retainAll(listb)
retainAll()方法是List接口的一个方法,用于保留两个列表中相同的元素。换句话说,它从lista中删除所有不包含在listb中的元素。
Iterator这个E是泛型,后面介绍

List list = new ArrayList();
        Animal a = new Animal("小猫", 13);
        Animal b = new Animal("小狗", 15);
        Animal c = new Animal("小猪", 10);
        //添加
        list.add(a);
        list.add(1, b);
        list.add(2, c);

        //删除
        list.remove(1);
        list.remove("小猪");
        //list.clear();清空

        //修改
        list.set(1, new Animal("小鹅", 16));

        //插入
        list.add(1, new Animal("小羊", 6));

        //查询
        System.out.println("ArrayList里有" + list.size() + "只动物");
        Animal animale = (Animal) list.get(0);
        System.out.println("第一个动物是" + animale.getName());
        if (list.contains(a)) {
            System.out.println("ArrayList里有小猫");
        }
        System.out.println("--------------");

        //遍历
        //for循环遍历
        for (int i = 0; i < list.size(); i++) {
            Animal animal = (Animal) list.get(i);
            System.out.println(animal.getName() + " " + animal.getAge());
        }
        System.out.println("--------------");

        //加强for循环遍历
        for (Object animals : list) {
            Animal animal = (Animal) animals;
            System.out.println(animal.getName() + " " + animal.getAge());
        }
        System.out.println("--------------");

        //迭代器
        Iterator<Animal> it = list.iterator();
        while (it.hasNext()) {
            Animal animal = (Animal) it.next();
            System.out.println(animal.getName() + " " + animal.getAge());
        }
        System.out.println("--------------");

        //判断是否为空
        System.out.println(list.isEmpty());

        //类型转换
        list.toArray();

List接口类的LinkedList实现类

插入或删除元素时比ArrrayList快

方法名作用
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表中的第一个元素
Object getLast()返回列表中的最后一个元素
Object removeFirst()删除并返回列表中的最后一个元素
Object removeLast()删除并返回列表中的最后一个元素
 LinkedList list = new LinkedList();
        Animal a = new Animal("小猫", 13);
        Animal b = new Animal("小狗", 15);
        Animal c = new Animal("小猪", 10);
        //增加
        list.add(a);
        list.addFirst(b);
        list.addLast(c);

        //获取
        Animal li = (Animal) list.getFirst();
        System.out.println(li.getName());
        Animal li2 = (Animal) list.getLast();
        System.out.println(li2.getName());
        Animal li3 = (Animal) list.get(2);
        System.out.println(li3.getName());


        //删除
        list.remove(0);
        list.remove("小猪");
        list.removeLast();
        list.removeFirst();
        list.clear();
        list.removeAll(list);

        //迭代器遍历
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Animal animal = (Animal) it.next();
            System.out.println(animal.getName() + " " + animal.getAge());
        }
        
        //for循环遍历
        for (int i = 0; i < list.size(); i++) {
            Animal animal = (Animal) list.get(i);
            System.out.println(animal.getName()+" "+animal.getAge());
        }
        
        //增强for循环遍历
        for(Object animal: list){
            Animal animal1 = (Animal) animal;
            System.out.println(animal1.getName()+" "+animal1.getAge());

浅浅分析一下ArrayList和LinkedList有什么异同
相同点:都是Java集合框架Collection接口下List接口的两个实现类,都是存放
一组不唯一,有序的对象。
不同点:存放方式不同,
ArrayList使用一个可变大小的数组来存储元素。它支持快速随机访问和按索引访问元素,因为它可以根据索引直接计算出元素的位置。但是,在删除或插入元素时,需要对后续元素进行移动,因为数组的大小是固定的。这可能会导致性能下降,特别是当操作集合中的大量元素时。

LinkedList使用**双向链表来存储元素。**在插入或删除元素时,只需要更改相邻节点的引用,而不需要移动其他元素。这使得插入和删除操作更快。然而,访问元素的速度较慢,因为需要遍历链表来找到特定索引的元素。

所以,ArrayList遍历元素和随机访问元素的效率比较高,LinkedList插入 、删除元素时效率比较高。

4.Set接口

Set接口存放一组唯一、无序的对象,Set存放的是对象的引用,Set接口里的元素是通过equals方法比较确定是否唯一的,HashSet是Set接口常用的实现类。

注意Set接口里不存在get()方法

public class TestSetequals {
    public static void main(String[] args) {
        Set set = new HashSet();
        String s1 = new String("java");
        String s2 = s1;
        System.out.println(s1 == s2);
        String s3 = new String("java");
        System.out.println(s1 == s3);
        System.out.println(s1.equals(s3));//String类重写了Object类的equals方法,set比较元素是通过equals的方法。
        set.add(s1);
        set.add(s2);
        set.add(s3);
        System.out.println(set.size());//Set接口存储一组唯一,无序的对象
    }
}

###HashSet实现类
HashSet是Java中的一种集合实现类,它基于哈希表实现。HashSet中的元素是无序的,不允许重复,并且允许使用null元素。
常用方法:

方法名作用
add(element)将指定的元素添加到集合中,如果元素已经存在,则不会进行任何操作。
addAll(collection)将指定集合中的所有元素添加到集合中。
remove(element)从集合中移除指定的元素,如果元素不存在,则不会进行任何操作。
removeAll(collection)从集合中移除指定集合中包含的所有元素。
contains(element)判断集合中是否包含指定的元素。
isEmpty()判断集合是否为空。
size()返回集合中元素的个数。
clear()清空集合中的所有元素。
iterator()返回一个迭代器,用于遍历集合中的元素
 public static void main(String[] args) {
        Set list = new HashSet();
        Animal a = new Animal("小猫", 13);
        Animal b = new Animal("小狗", 15);
        Animal c = new Animal("小猪", 10);
        //增加
        list.add(a);
        list.add(b);
        list.add(c);
        //获取元素个数
        System.out.println(list.size());

        //删除

        list.remove(a);
//        list.clear();
//        list.removeAll(list);
        //遍历:
        Iterator it = list.iterator();//迭代器遍历
        while (it.hasNext()) {
        	Animal animal =(Animal) it.next();
            System.out.println(animal.getName());
        }
        System.out.println("--------------");
        for (Object s : list) {//增强for循环遍历
            Animal animal = (Animal) s;
            System.out.println(animal.getName());
        }

因为没有Set接口没有get()方法,所以只有增强for循环和迭代器循环两种!

5.迭代器循环的逻辑:

1.创建一个Iterator的实例。
2.在for循环里用boolean hasNext()方法判断是否存在另一个可访问的元素,然后用Object next返回要访问的元素。

        Iterator it = list.iterator();
        while (it.hasNext()) {
            Animal animal = (Animal) it.next();
            System.out.println(animal.getName() + " " + animal.getAge());
        }

6.泛型

泛型是一种约束,泛型的本质是参数化类型,也就是说将要操作的数据类型指定为一个参数,用泛型约束数据。

 ArrayList<String> list = new ArrayList<String>();
        List list2 = new ArrayList();
        list2.add("张三");
        list2.add("李四");
        list2.add(1, "王五");
        System.out.println(list2.size());
        for (int i = 0; i < list2.size(); i++) {
//            String name = (String) list2.get(i);泛型将其约束为String
            System.out.println(list2.get(i));
        }
        for (Object s : list2) {
            System.out.println(s);
        }
        System.out.println("--------------");
        Iterator it = list2.iterator(); //用while循环
        while (it.hasNext()) {
//            String name = (String) it.next();
            System.out.println(it.next());
        }
        System.out.println("--------------");
        System.out.println("是否包含王五:" + list2.contains("王五"));
        list2.remove(1);
        list2.remove("张三");

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

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

相关文章

软件质效领航者!ONES 获中国信通院「软件质效技术创新」优秀案例奖

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会联合主办的 2023 系统稳定性与精益软件工程大会-AI 赋能软件质效专场暨云上软件工程社区年会在北京召开&#xff0c;会上正式公布了第二届「软件质效领航者」优秀案例的评选结果。 凭借产品及服务的成熟度、典范性和…

thinkcmf 配置移动端模板

1.找到tinkcmf/data/config/template.php 文件 cmf_moblie_default_theme > cffff_m, 2. 找到thinkcmf/vendor/thinkcmf/src/common.php // $theme config(template.cmf_default_theme);if (cmf_is_mobile()) {$theme config(template.cmf_moblie_default_theme);} el…

python股票分析挖掘预测技术指标知识之均线指标详解(6)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

【springboot+mybatis实现CURD模版项目-Jesus】

springbootmybatis实现CURD模版项目-Jesus STEP 1 项目创建 1.1 新建Spring Initializr项目   1.2 选择需要的依赖 springboot有2.7.2直接选272STEP 2 配置更改 2.1更改maven配置   2.2 检查项目配置jdk、sdk、jre版本一致   2.3 检查pom文件&#xff0c;Maven-Reload pr…

鸿蒙OpenHarmony技术—消息机制实现

用户态应用发送消息到驱动 用户态主要代码 struct HdfIoService *serv HdfIoServiceBind(SAMPLE_SERVICE_NAME);......ret serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply); if (ret ! HDF_SUCCESS) {HDF_LOGE("fail to sen…

通往人工智能的 Go 之路

Agency 该库旨在为那些希望通过清晰、高效且符合 Go 语言惯例的方法来探索大型语言模型&#xff08;LLMs&#xff09;和其他生成式人工智能的开发人员而设计。 特点 纯 Go 语言&#xff1a;快速、轻量级&#xff0c;静态类型&#xff0c;无需涉及 Python 或 JavaScript编写清晰…

人工智能趋势报告解读:ai野蛮式生长的背后是机遇还是危机?

近期&#xff0c;Enterprise WordPress发布了生成式人工智能在营销中的应用程度的报告&#xff0c;这是一个人工智能迅猛发展的时代&#xff0c;目前人工智能已经广泛运用到内容创作等领域&#xff0c;可以预见的是人工智能及其扩展应用还将延伸到我们工作与生活中的方方面面。…

gradle --腾讯国内镜像源

distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip 1.进入到自己工程目录下的wrapper文件夹。 2.编辑gradle-wrapper文件 使用https://mirrors.cloud.tencent.com/gradle/gradle-4.6-all.zip来代替原来的 https\://services.gradle.org/distri…

高精度、大电流、低压差电压调整器芯片 D2632,可以用于电池供电设备等产品上

D2632是一款高精度、大电流、低压差电压调整器。主要作为电源装置提供高效的电压调整。 最大输出电流可达3A&#xff0c;并且外接器件少&#xff0c;拥有输出电压(ADJ) 可调特点。 主要特点&#xff1a; 1. 低压差(满载350mV); 2. 地电流小; …

Oracle导出CSV文件

利用spool spool基本格式&#xff1a; spool 路径文件名 select col1||,||col2||,||col3||,||col4 from tablename; spool off spool常用的设置&#xff1a; set colsep ;    //域输出分隔符 set echo off;    //显示start启动的脚本中的每个sql命令&#xff0c;缺…

利用Embedding优化搜索功能

我们继续用Gemini学习LLM编程之旅。 Embedding是一种自然语言处理 (NLP) 技术&#xff0c;可将文本转换为数值向量。Embedding捕获语义含义和上下文&#xff0c;从而导致具有相似含义的文本具有更接近的Embedding。例如&#xff0c;句子“我带我的狗去看兽医”和“我带我的猫去…

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…

MAC 签名证书替换

1.概述 在用开发者签名过期后导致签名失效&#xff0c;需要更新证书 当过期时&#xff0c;点击证书时显示“此证书无效” 2.证书分类 3.登录 首先登陆Apple Developer官网开发者账号登陆。登录网址Apple Developer点击Account输入账号登录 4.需要的证书 本司现阶段只在MacO…

客服智能管理系统是如何应用的

客服系统有很多种类&#xff0c;针对不同场景的客服使用的客服系统也不同&#xff0c;如有网店里的在线客服、实体店里的电话客服、网站上的在线客服、公共服务型的热线客服、售后服务客服等等。所谓客服智能管理系统就是一种可以把多个客服场景都管理起来的系统&#xff0c;提…

全面解析vcruntime140_1.dll无法继续执行代码问题

在使用电脑的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;如“找不到vcruntime140_1.dll无法继续执行代码”。vcruntime140_1.dll是Visual C Runtime Library&#xff08;视觉C运行时库&#xff09;的一个组件&#xff0c;主要用于支持应用程序的运行。这个文件包含了…

服务器磁盘挂载及格式化

一边学习,一边总结,一边分享! 写在前面 最近一直折腾组装的电脑,来回折腾了很久关于我花费六千多组了台window+Linux主机,目前基本是可以使用了。对于Windows主机配置基本是没问题,一直在使用,以及桌面化软件,都可以自己安装,只是说这台主机有些软件可能一时半会安装…

爆火小游戏敲木鱼流量主小程序源码系统+完整的代码包以及安装搭建教程

随着移动互联网的快速发展&#xff0c;小程序已成为一种新的应用形态&#xff0c;深入到人们生活的方方面面。其中&#xff0c;小游戏由于其简单、有趣的特点&#xff0c;吸引了大量用户&#xff0c;也成为了许多开发者的首选。敲木鱼小游戏&#xff0c;以其独特的玩法和轻松的…

Transformer从菜鸟到新手(二)

引言 这是Transformer的第二篇文章&#xff0c;上篇文章中我们了解了分词算法BPE&#xff0c;本文我们继续了解Transformer中的位置编码和核心模块——多头注意力。 位置编码 我们首先根据BPE算法得到文本切分后的子词标记&#xff0c;然后经过输入嵌入层将每个标记转换为对…

摆烂式学习ssh

摆烂式学习ssh ssh工作原理ssh基本使用sshd配置文件密钥登录1.客户端2.服务器3.注意事项4.使用密钥登录测试 ssh高级使用技巧1.在非正规端口启动2.rsync 命令3.透过 ssh 通道加密原本无加密的服务4.以ssh信道配合x server 传递图形接口5.ssh配合virtualbox虚拟机使用技巧 ssh工…
最新文章