Java集合框架和泛型

news2025/4/8 10:11:31

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.coloradmin.cn/o/1356245.html

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

相关文章

ROS学习笔记(二):话题通信、服务通信的了解和对应节点的搭建(C++)

ROS学习笔记&#xff08;二&#xff09;&#xff1a;话题通信、服务通信的了解和对应节点的搭建&#xff08;C和Python&#xff09; 前言一、Topics话题通信&#xff08;C&#xff09;0、自定义msg消息类型文件1、发布者&#xff08;Publisher&#xff09;2、订阅者&#xff08…

引导和服务

目录 一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 二、系统初始化进程 1、init进程&#xff08;串行启动&#xff09; 2、Systemd&#xff08;并行启动&#xff09; 3、Centos6与Centos7的区别&#xff1a; 4、Systemd单元类型 5、运行级别所…

buuctf 逆向 findkey wp

首先看看怎么个事 点开也就这样了&#xff0c;没有输入的点&#xff0c;感觉和之前的 “刮开有奖” 有一点点相像 winmain长这个样子 看到消息循环了&#xff0c;下一步肯定就是找回调函数了 乍一看还没有&#xff0c;函数一个个点进去看发现sub_401023(hInstance&#xff09…

网站迁移和SEO:损害排名的常见错误

正在规划站点迁移&#xff1f; 迁移是更困难的 - 通常是可怕的 - SEO任务之一。 为了让它发挥作用&#xff0c;你需要避免常见的陷阱&#xff0c;这些陷阱可能会影响你的知名度&#xff0c;并导致流量和收入的损失。 8 月 11 日&#xff0c;我主持了一场赞助的搜索引擎杂志网…

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文&#xff0c;主要涉及图神经网络&#xff0c;大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式&#xff0c;回复&am…

Win32 TEXT()宏学习

之前学习了_T()宏&#xff1b; _T()是MFC的&#xff1b; TEXT()是win32的&#xff1b; _T("")定义于tchar.h&#xff1b; TEXT宏是windows程序设计中经常遇到的宏&#xff0c;定义在 <winnt.h>中&#xff1b; 如果使用UNICODE字符集&#xff0c;则TEXT&…

小兔鲜儿 uniapp - 项目打包

目录 微信小程序端​ 核心步骤​ 步骤图示​ 条件编译​ 条件编译语法​ 打包为 H5 端​ 核心步骤​ 路由基础路径​ 打包为 APP 端​ 微信小程序端​ 把当前 uni-app 项目打包成微信小程序端&#xff0c;并发布上线。 核心步骤​ 运行打包命令 pnpm build:mp-weix…

RK3399平台入门到精通系列讲解(实验篇)IO 多路复用实验之poll实验

🚀返回总目录 文章目录 一、IO 多路复用:poll介绍二、实验源码2.1、Makefile2.2、poll 实验驱动2.3、poll 驱动测试应用程序一、IO 多路复用:poll介绍 IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。 一旦某个文件描述符准备就绪,就通…

三款推荐的 FTP 工具

&#x1f947; 版权: 本文由【墨理学AI】原创、在CSDN首发、各位大佬、敬请查阅&#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 三款推荐的 FTP 工具filezillawinscpFinalShell SSHXftp❤️ 人生苦短&#xff0c; 欢迎…

Excelize 入选“2023开源创新榜”优秀开源项目

近日&#xff0c;由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办&#xff0c;CSDN 承办的 2023 开源创新榜专家评审会在国家科技传播中心成功举办。Excelize 电子表格文档开源基础库入选“2023开源创新榜”优秀开源项目。 评审委员…

Javaweb之Mybatis的基础操作之删除的详细解析

1.3 删除 1.3.1 功能实现 页面原型&#xff1a; 当我们点击后面的"删除"按钮时&#xff0c;前端页面会给服务端传递一个参数&#xff0c;也就是该行数据的ID。 我们接收到ID后&#xff0c;根据ID删除数据即可。 功能&#xff1a;根据主键删除数据 SQL语句 -- 删除…

java每日一题——输出星星塔(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;请编写输出如下图的星星塔 编程思路&#xff1a;1&#xff0c;计算要输入几行&#xff1b;2&#xff0c;计算每行的⭐数量&#xff0c;及空格的数量&#xff1b;计算相应的关系&#xff1b; 如图&#xff1a;假…

SpringBoot项目处理 多数据源问题(把本地库数据 推送 到另外一个平台的库)

一、需求梳理 把我方数据库的表中数据 ----------> 推送到第三方的数据库 相当于库对库的数据插入, 但是需要的是用代码的方式实现; 二、解决思维 (1) 首先,平台与平台之间的数据库对接; 处理点1: 字段转换 (库表之间的数据字段不一致问题) 解决方式: 挨个字段的对应,如…

软件测试基础理论学习-软件测试方法论

软件测试方法论 软件测试的方法应该建立在不同的软件测试类型上&#xff0c;不同的测试类型会存在不同的方法。本文以软件测试中常见的黑盒测试为例&#xff0c;简述常见软件测试方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、因果图法、判定表驱动法、正交试…

(NeRF学习)NeRF复现 win11

目录 一、获取源码二、环境三、准备数据集方法一&#xff1a;官方命令方法二&#xff1a;官网下载数据集 四、开始训练1.更改迭代次数2.开始训练方法一&#xff1a;方法二&#xff1a; 3.使用预训练模型 五、NeRF源码学习 一、获取源码 git clone https://github.com/bmild/ne…

LeetCode-141环形链表 LeetCode-142环形链表二

一、前言 本篇文章在我之前讲完的链表、链表与递归的基础上进行讲解&#xff0c;本次我们以leetcode为例&#xff0c;讲解链表的其他题型&#xff0c;今天我们先了解一下环形链表&#xff0c;这里我们以leetCode141和leetCode142为例。 二、LeetCode141 首先关于这道题&#…

【MongoDB】关于MongoDB更新文档update的操作,十分详细,建议收藏!!!

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;MongoDB数据库学习 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继…

IPv6邻居发现协议(NDP)---路由发现

IPv6路由发现(前缀公告) 邻居发现 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻…

60.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告功能的逆向分析与测试

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;文字资源读取类的C还原-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;878db7708de09b448010ef54526fe…