Java类集框架(一)

news2024/12/23 4:30:49

目录

1.Collection集合接口

2.List 接口 (常用子类 ArrayList ,LinkedList,Vector)

3.Set 集合 接口(常用子类 HashSet  LinkedHashSet,TreeSet)

4.集合输出(iterator , Enumeration)


1.Collection集合接口

Collection是集合中最大父接口,在接口中定义了核心的一些操作。

Collection接口定义的核心方法:

方法名描述方法修饰符参数返回值类型
add(E element)将指定元素添加到集合中publicelement: 要添加的元素boolean
remove(Object o)从集合中移除指定元素publico: 要移除的元素boolean
get(int index)获取集合中指定位置的元素publicindex: 元素的索引E
clear()清空集合中的所有元素public
size()返回集合中的元素数量publicint
toArray()将集合转换为数组publicObject[]
iterator()返回集合的迭代器publicIterator<E>
contains(Object o)检查集合是否包含指定元素publico: 要检查的元素boolean

 

2.List 接口 (常用子类 ArrayList ,LinkedList,Vector)

List实现了Collection接口,但是自己也扩充了一些方法:

List扩充的方法:

方法名描述
get(int index)获取列表中指定位置的元素
set(int index, E element)用指定元素替换列表中指定位置的元素
ListIterator()返回列表的列表迭代器
foreach(Consumer<? super E> action)对列表中的每个元素执行指定操作

1.ArrayList 线性表

作为一个线性标其存储方式是数组模式,以下是一个ArrayList的案例代码

实现ArrayList存放字符串类型的火车

package Example1801;

import java.util.ArrayList;
import java.util.List;

public class javaDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("火车头");
        list.add("车厢1");
        list.add("车厢2");
        list.add("车厢3");
//        获取基础信息
        System.out.println("集合是否为空?"+list.isEmpty()+" 集合内容的个数"+list.size());
//        调用方法判断是否存在字符串
        System.out.println(list.contains("火车头"));
//        获取下标为0的内容
        System.out.println("下标为0的内容是"+list.get(0));
//        移除数据
        list.remove("车厢3");
//        非标准输出,了解即可,标准输出接口是Iterator
        list.forEach(str->{
            System.out.println(str);
        });
//       清空集合内的数据
        list.clear();
        System.out.println(list.isEmpty());
    }
}

2.LinkedList 链表

作为链表,其实现的方法与火车类似,定义一个空间(车厢)再接在火车最后一列车厢上。由于LinkedList都是遵循了

案例代码:

package Example1804;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class javaDemo {
    public static void main(String[] args) {
        // 创建链表并插入数据
        List<String> linkedList = new LinkedList<String>();
        linkedList.add("火车头");
        linkedList.add("火车车厢1");
        linkedList.add("火车车厢2");
        linkedList.add("火车车厢3");
        linkedList.add("火车车尾");

        System.out.println(linkedList);
    }

}

 

数组和链表的最大区别:

1.链表相比于数组不需要频繁的创造新的空间,但是两者的查找效率(get)并不相同,数组的时间复杂度为O(1)而链表的时间复杂度是O(n)

3.Vector

Vector作为原始的程序类由于其应用的广泛性,所以将其保存下来了

案例代码:

package Example1805;

import java.util.List;
import java.util.Vector;

public class javaDemo {
    public static void main(String[] args) {
//        泛型<包装类>
        List<Integer> all = new Vector<Integer>();
        for (int i = 1;i<=10;i++){
            all.add(i);
        }
        if (!all.isEmpty()){
            System.out.println(all);
        }
        
    }
}

ArrayList与Vector的区别

ArrayList与Vector首先两者虽然外部调用方法看起来一样,但是二者的源码(内部机制)并不一样,Vector的源码中操作方法中加入了synochronized同步的操作,这就意味着多线程访问二者时候,Vector就会比较安全,但是相应的Vector的效率就会比较低


 

3.Set 集合 接口(常用子类 HashSet  LinkedHashSet,TreeSet)

 Set与List最大的不同就是,作为一个集合,有互斥性,即不能放同样的数据,或者是同样的数据会被自动覆盖掉,比如做一个统计,统计某个学校学生最喜欢的科目,100个学生但是不可能有100个科目,所以如果有学生是喜欢同样的科目就会自动覆盖。

1.Set的子类HashSet(散列集合)

注意该集合的特点是无序性,以下案例代码就可以看得出其中特性

案例代码:

package Example1806;

import java.util.HashSet;
import java.util.Set;

public class javaDemo {
    public static void main(String[] args) {
        Set<String> all = new HashSet<String>();
        all.add("火车头");
        all.add("车厢1");
//        重复数据
        all.add("车尾");
        all.add("车尾");
        System.out.println(all);
    }
}

 

 如果想要让HashSet要按照我们顺序输入实现顺序的话就需要用到另一个兄弟类LinkedHashSet以保证其输入的有序性

2.LinkedHashSet

案例代码:

package Example1807;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Set;

public class javaDemo {
    public static void main(String[] args) {
        Set<String> all = new LinkedHashSet<String>();
        all.add("火车头");
        for (int i =1;i<=10;i++){
            all.add("火车车厢"+i);
        }
        all.add("火车车尾");
        if (!all.isEmpty()){
            System.out.println(all);
        }
        all.clear();
    }
}

 

3.有序集合 TreeSet

有序集合可能会跟刚才的LinkedHashSet联想在一起,实际上并不一样,其中所谓的有序指的是元素的有序性,比如集合中传入一个班级一次考试的成绩,有很大可能并不是按照考试的成绩顺序输入,那么想要实现集合内部自动排好成绩的高低。此时就需要用到TreeSet(有序集合)

案例代码1:

package Example1808;

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class javaDemo {
    public static void main(String[] args) {

        System.out.println("欢迎使用成绩等级系统");
        Set<Integer> all = new TreeSet<Integer>();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入需要添加的成绩(输入0时候退出系统)");
        while (true){
            if (scanner.hasNextInt()){
                int temp = scanner.nextInt();
//                当输入的成绩位0时候退出系统
                if (temp == 0){
                    break;
                }
                all.add(temp);
                System.out.println("加入成绩成功");
            }else {
                System.out.println("您输入的成绩有问题,请重新输入");
            }
        }
        System.out.println(all);
    }
}

 

该代码实现了输出一个班同学所有人考试得到的成绩, 然后从低到高输出大家取到过的成绩

4.重复元素消除

问题引出:看如下代码:

package Example1809;

import java.util.HashSet;
import java.util.Set;

class Member{
    private String name;
    private int age;
    private int id;
    Member(String name,int age,int id){
        this.age = age;
        this.name = name;
        this.id = id;
    }
    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}
public class javaDemo {
    public static void main(String[] args) {
        Set<Member> all = new HashSet<Member>();
//        重复对象
        all.add(new Member("赵五",20,001));
        all.add(new Member("赵五",20,001));
        System.out.println(all);
    }
}

 

问:按理来说,add的两个对象其实都是同一个人,如果定义集合Set就应该剔除重复对象,为什么没有剔除呢?

        虽然添加了两个具有相同数据的Member对象,但它们在内存中的地址不同,因此HashSet无法识别它们是相同的对象,也就无法将其视为重复元素进行删除。

        要使HashSet正确识别重复的Member对象,需要在Member类中重写hashCode()和equals()方法,以便根据实际的业务逻辑来判断对象是否重复。例如,可以根据name、age和id属性来判断两个Member对象是否相同。重写这两个方法后,HashSet就能正确地剔除重复对象。

 重复元素消除实现案例代码;

package Example1809;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class Member{
    private String name;
    private int age;
    private int id;
    Member(String name,int age,int id){
        this.age = age;
        this.name = name;
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
//        如果存放的内存地址一样。那么自然就是一样的
        if (this == o){
            return true;
        };
//        检查类型是否相同
        if (o instanceof Member){
            Member other = (Member) o;
//            判断所有值是否相同
            return Objects.equals(this.name,other.name)&&this.age == other.age&&this.id == other.id;
        }
        return false;
    }

    @Override
    public int hashCode() {
//        根据name,age,id计算哈希值
        return Objects.hash(name, age, id);
    }

    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}
public class javaDemo {
    public static void main(String[] args) {
        Set<Member> all = new HashSet<Member>();
//        重复对象
        all.add(new Member("赵五",20,001));
        all.add(new Member("赵五",20,001));
        System.out.println(all);
    }
}

可以看到同样的对象消失了,这样就算实现了重复元素的消除


 

4.集合输出(迭代器Iterator , Enumeration )

1.迭代器iterator(集合的标准输出)

在前面的Collection中定义的方法

iterator()返回集合的迭代器publicIterator<E>

这一段说明实现集合都可以通过迭代器iterator输出,其创建的实例方法流程是

Iterator iterator = 某个集合.iterator

Iterator接口的常用方法

方法名描述方法修饰符参数返回类型
hasNext()检查迭代器是否还有下一个元素。如果有,则返回true;否则返回false。publicboolean
next()返回迭代器的下一个元素,并将迭代器的位置指向下一个元素。publicE
remove()从迭代器所在的集合中移除迭代器返回的最后一个元素(可选操作)。publicvoid

案例代码;

package Example1803;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

class Person{
    private String name;
    private int age;
    Person(String name,int age){
        this.age =age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
}
public class javaDemo {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("黄小龙",87));
        personList.add(new Person("陈非凡",20));
        personList.add(new Person("陈俊",20));
//        直接输出会输出类的地址
        System.out.println(personList);
//        通过迭代器遍历输出对象的名称和age
        Iterator<Person> iterator = personList.iterator();
        while (iterator.hasNext()){
//            需要有对象接收不能直接输出iterator.next.getName()+iterator.next.getAge
//            这样会出现错误,因为iterator接收数据后立刻就往下走
            Person person = iterator.next();
            System.out.println(person.getName()+"的年龄是"+person.getAge());
        }
    }
}

 

 熟悉集合类型与Iterator的实现

package Example1810;

import java.util.*;

public class javaDemo {
    public static void main(String[] args) {
//        链表
        List<String> list1 = new LinkedList<String>();
        list1.add("和平号高铁车头");
        list1.add("和平号高铁车厢");
        list1.add("和平号高铁车尾");
        Iterator<String> iterator1 = list1.iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
//        散列集合
        Set<String> set1 = new HashSet<String>();
        set1.add("绿皮火车车头");
        set1.add("绿皮火车车厢");
        set1.add("绿皮火车车尾");
        Iterator<String> iterator2 = set1.iterator();
        while (iterator2.hasNext()){
            System.out.println(iterator2.next());
        }
//        有序集合
        Set<Integer> set2 = new TreeSet<Integer>();
        set2.add(1);
        set2.add(2);
        set2.add(3);
        Iterator<Integer> iterator3 = set2.iterator();
        while (iterator3.hasNext()){
            System.out.println(iterator3.next());
        }
    }
}

2.Enumeration

Enumeration该接口与Vector都是原始接口都是在jdk很早前就定义了,该接口主要是用于对Vector的数据输出,在JDK1.5后对其进使用了泛型重新修改

该接口有两个比较常用的方法:

方法名描述
hasMoreElements()检查枚举对象是否有更多的元素可供迭代。如果有,则返回true;否则返回false。
nextElement()返回枚举对象的下一个元素,并将枚举对象的位置指向下一个元素。如果没有更多元素,则会抛出NoSuchElementException异常

案例代码:

package Example1811;

import java.util.Enumeration;
import java.util.Vector;

public class javaDemo {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("测试1");
        vector.add("测试2");
        vector.add("测试3");
//        通过vector的elements实例化
        Enumeration<String> enumeration = vector.elements();
        while (enumeration.hasMoreElements()){
            System.out.println(enumeration.nextElement());
        }
    }
}

 

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

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

相关文章

SolidWorks二次开发系列入门100篇之97-极点坐标

什么是极点 一个模型中的极点是指在某个方向上的最高或最低点。在三维模型中&#xff0c;通常有三个方向&#xff1a;x轴、y轴和z轴。因此&#xff0c;在x轴&#xff0c;y轴和z轴的正方向和负方向上&#xff0c;每个模型可能都有两个极点。极点通常是一些锐角或骨刺&#xff0…

攻防世界zorropub题解与subprocess模块

目录 题目分析&#xff1a; subprocess模块&#xff1a; subprocess.Popen()函数&#xff1a; subprocess.run()函数&#xff1a; 题目脚本&#xff1a; 在攻防世界做到一个题目感觉还挺有意思&#xff0c;记录一下 这个放链接也只是攻防世界的页面&#xff0c;所以直接说…

docker数据持久化

在Docker中若要想实现容器数据的持久化&#xff08;所谓的数据持久化即数据不随着Container的结束而销毁&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 &#xff08;1&#xff09;Volumes&#xff1a;…

【C#学习笔记】值类型(1)

虽然拥有编程基础的人可以很快地上手C#&#xff0c;但是依然需要学习C#的特性和基础。本系列是本人学习C#的笔记&#xff0c;完全按照微软官方文档编写&#xff0c;但是不适合没有编程基础的人。 文章目录 .NET 体系结构Hello&#xff0c;World类型和变量&#xff08;重要&…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)

本篇主要说明&#xff1a; 1. 因为这个mysql版本是8.0&#xff0c;所以当其中一台mysql节点挂掉之后&#xff0c;主从同步&#xff0c;甚至双向数据同步都失效了&#xff0c;所以本篇主要记录下当其中的节点挂掉之后如何再次生效。另外推荐大家使用mysql5.7的版本&#xff0c;这…

3-ASCII-座位渲染-二维码

一 ASCII码 1 概念 ascii码是一种计算机信息交换标准,在这个表里面制定了 128个数字跟128个字符的对应关系 我们只关注字母跟数字的对应关系 2 ASCII码转字符 let str String.fromCharCode(数字)二 js对象跟查询字符串互转 a js对象转查询字符串 //创建一个对象 let obj …

新SDK平台下载开源全志D1-H/D1s的SDK

获取SDK SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…

【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

目录 前言 安装 pip安装 安装包安装 柱状图 主要方法 参数说明 示例代码 效果图 解决中文显示问题 修改后的图片 饼状图 主要方法 示例代码 效果图 动态图 主要方法 动态图官方使用介绍 示例代码 颜色设置 内建颜色 字体设置 资料获取方法 前言 众所周…

WPF上位机6——文件操作、多线程、线程锁、Task异步编程

文件操作 文件夹操作 创建文件夹 磁盘信息 文件的读写 文件流 Thread多线程 带参数创建线程 Task多线程 创建方式1 第一种 第二种 第三种&#xff1a;线程池的方式 前台与后台线程 线程锁 Task异步编程 task任务取消 task返回值 async await异步 并行库Parallel

CEC2014:CEC2014测试函数及多种智能优化算法求解CEC2014对比

目录 一、CEC2014测试函数 二、多种智能优化算法求解CEC2014 2.1 本文参与求解CEC2014的智能优化算法 2.2 部分测试函数运行结果与收敛曲线 三、曲线标记代码(获得代码后可自行更改&#xff09; 一、CEC2014测试函数 CEC2014测试集共有30个单目标测试函数&#xff0…

linux下docker安装、镜像下载、镜像基础操作、容器基础操作

目录 一、环境准备 1、开启虚拟化 2、关闭防火墙 3、yum仓库获取阿里源&#xff08;清华、京东都可以&#xff09; 4、确保能ping到外网 二、安装docker 1、yum安装docker 2、启动docker并设置开机自启 3、安装docker-ce阿里镜像加速器 三、docker基本操作 1、查看版…

如何在项目需求与技术方案未确定的情况下掌控上线时间?

需求不明确与技术方案未确定的挑战 在任何项目管理过程中&#xff0c;需求和技术方案是两个核心环节。理想情况下&#xff0c;我们希望在项目开始阶段就有清晰明确的需求和经过深思熟虑的技术方案。然而&#xff0c;现实中的项目管理往往并不如此理想。 项目需求的重要性 需求…

2023年全新版Java学习路线,精心整理【文中送书福利 】

小伙伴们大家好&#xff0c;这里是动力节点&#xff0c;我们从2009年开始一直在从事Java培训 到今年已经整14年了&#xff0c;虽然现在不缺培训机构&#xff0c;更不缺Java培训&#xff0c;但是像我们这么多年专注这一件事的应该也不多。我们只希望在“专业”两个字上面不断精…

Vue3 基础知识点汇总 自学笔记,记录难点 和 新知识点

1.vue3 基础 1.1vue3基础及创建 npm init vue@latest1.2.熟悉项目目录及关键文字 1.3 组合式API-setup 1.4.组合式 API reactive 和ref 函数 (都是为了生成响应式数据) 1.5.组合式API-computed 计算属性函数 1.6.watch 函数 1.7.组合式API-生命周期函数 1.8.组合式 API-父子…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功…

Python之pyinstaller打包exe填坑总结

一、起因 编写了一个提取图片中文字的python脚本&#xff0c;想传给同事使用&#xff0c;但是同事电脑上没有任何python环境&#xff0c;更没有安装python库&#xff0c;因此想到通过pyinstaller打包成exe程序传给同事使用&#xff0c;于是开始了不断地挖坑填坑之旅 import p…

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求&#xff0c;消费者客户端默认每次从kafka集群拉取50M数据&#xff0c;放到缓冲队列中&#xff0c;消费者从缓冲队列中每次拉取500条数据进行消费。

Dockerfile构建SSHD镜像

Dockerfile构建SSHD镜像 基于Dockerfile制作镜像时首先需要建立工作目录&#xff0c;作为生成镜像的工作目录&#xff0c;然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。 1、环境配置&#xff1a; [rootdocker ~]# iptables -F [rootdoc…

用python+PyQt5来编写一个定时关机窗口

一、界面展示 二、源码 import sys from PyQt5.QtWidgets import QDesktopWidget,QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QSpinBox import osclass AutoShutdownApp(QWidget):def __init__(self):super().__init__()self.setWindowTitle("自动关机应…

Aop监控所有Controller,包括void类型的response中的出参(工具类)

一、主要坐标 <!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifa…