当前位置: 首页 > news >正文

Java类集框架(一)

目录

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");
//        非标准输出,了解即可,标准输出接口是Iteratorlist.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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic int hashCode() {
//        根据name,age,id计算哈希值return Objects.hash(name, age, id);}@Overridepublic 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);
//        通过迭代器遍历输出对象的名称和ageIterator<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());}}
}

 

相关文章:

Java类集框架(一)

目录 1.Collection集合接口 2.List 接口 (常用子类 ArrayList ,LinkedList,Vector) 3.Set 集合 接口(常用子类 HashSet LinkedHashSet,TreeSet) 4.集合输出(iterator , Enumeration) 1.Collection集合接口 Collection是集合中最大父接口&#xff0c;在接口中定义了核心的…...

Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程

由jspssh&#xff08;springstruts2mysql&#xff09;实现的企业物资信息管理系统&#xff0c;系统功能比较简单&#xff0c;实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…...

【Spring】深究SpringBoot自动装配原理

文章目录 前言1、main入口2、SpringBootApplication3、EnableAutoConfiguration4、AutoConfigurationImportSelector4.1、selectImports()4.2、getAutoConfigurationEntry()4.3、getCandidateConfigurations()4.4、loadFactoryNames() 5、META-INF/spring.factories6、总结 前言…...

阿里云负载均衡SLB网络型NLB负载均衡架构性能详解

阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡&#xff0c;支持超高性能和自动弹性能力&#xff0c;单实例可以达到1亿并发连接&#xff0c;帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…...

JavaScript学习 -- SM4算法应用实例

SM4算法&#xff0c;也被称为国密算法&#xff0c;是中国公布的一种高效且安全的对称加密算法。在JavaScript中&#xff0c;我们可以通过使用CryptoJS库来实现SM4算法的加密和解密。本篇博客将为您介绍如何在JavaScript中使用SM4算法&#xff0c;并提供一个实际的案例。 首先&…...

【JVM】什么是双亲委派机制

文章目录 1、类加载机制2、双亲委派模型2.1、介绍2.2、为什么需要双亲委派2.3、源码解析 3、破坏双亲委派3.1、介绍3.2、破坏实现3.3、破坏双亲委派的例子 4、线程上下文类加载器 1、类加载机制 类加载阶段分为加载、连接、初始化三个阶段&#xff0c;而加载阶段需要通过类的全…...

网络安全 Day24-select高级用法和多表连接

select高级用法和多表连接 1. select 多子句单表高级实践1.1 select 多子句高级语法1.2 聚合函数1.3 group by 实践1.4 having 筛选1.5 order by 排序1.6 limit 2. 多表连接 1. select 多子句单表高级实践 1.1 select 多子句高级语法 where 和 having 区别是后者是分组后进行…...

JUC并发编程之volatile详解

目录 1. volatile 1.1 volatile关键字的作用 1.1.1 变量可见性 1.1.2 禁止指令重排序 1.2 volatile可见性案例 1.3 volatile非原子性案例 1.4 volatile 禁止重排序 1.5 volatile 日常使用场景 送书活动 1. volatile 在并发编程中&#xff0c;多线程操作共享的变量时&a…...

swing布局详解

1. 布局管理器接口 &#xff08;1&#xff09;说明 布局管理器接口为LayoutManager和LayoutManager2&#xff0c;LayoutManager2是LayoutManager的子类。 &#xff08;2&#xff09;常用方法 方法描述LayoutManageraddLayoutComponent(String name, Component comp) removeL…...

el-table某一列嵌套使用el-popover,使用click触发,导致页面下拉框组件无法触发弹框关闭(解决办法)

在弹框触发的方法里加上document.body.click() 即可 尝试了很多其他的方法都没用&#xff0c;只有这个解决了 完整代码&#xff1a; <el-select change"sourceChange" clearable ><el-optionv-for"option in list1":key"option.code":…...

正泰电力携手图扑:VR 变电站事故追忆反演

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…...

报错 -bash: wget: command not found

1、报错 -bash: wget: command not found 可以重装 wget 工具&#xff1a; 卸载 wget 工具 yum remove wget下载 wget 工具 yum -y install wget最后尝试 wget “url” 又OK了&#xff0c;一般是原来的wget初始化有文件损坏造成的。...

HashMap扩容和Redis中Dict 扩容

扩容时机&#xff1a; Hash Map&#xff1a;要在某个临界点进行扩容处理&#xff0c;该临界点就是HashMap中元素的数量在数值上等于threshold&#xff08;table数组长度*加载因子&#xff09; Dict&#xff1a; 当每次新增键值对的时 , 会检测 负载因子(LoadFactor) , 判断以…...

【Redis】内存数据库Redis进阶(Redis持久化)

目录 分布式缓存 Redis 四大问题Redis 持久化RDB (Redis DataBase)RDB执行时机RDB启动方式——save指令save指令相关配置save指令工作原理save配置自动执行 RDB启动方式——bgsave指令bgsave指令相关配置bgsave指令工作原理 RDB三种启动方式对比RDB特殊启动形式RDB优点与缺点 A…...

在PHP8中检测数据类型-PHP8知识详解

在PHP 8中&#xff0c;可以使用多种方法来检测数据类型。以下是常用的四种方法&#xff1a;使用 gettype() 函数、使用 is_* 系列函数、使用 get_debug_type() 函数、使用 get_class() 函数。 一、使用 gettype() 函数 gettype() 函数返回给定变量的数据类型。例如&#xff1a…...

​​​amoeba实现MySQL读写分离

​​​amoeba实现MySQL读写分离 准备环境&#xff1a;主机A和主机B作主从配置&#xff0c;IP地址为192.168.131.129和192.168.131.130&#xff0c;主机C作为中间件&#xff0c;也就是作为代理服务器&#xff0c;IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为…...

angr学习-入门篇

前言&#xff1a; 资源链接&#xff1a;GitHub - jakespringer/angr_ctf&#xff08;题库仓库&#xff0c;里面有个讲解angr的PPT&#xff0c;里面有官方的题解很详细&#xff09; GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf 安装&#xff1a; 关于angr…...

基于java SpringBoot和HTML的博客系统

随着网络技术渗透到社会生活的各个方面&#xff0c;传统的交流方式也面临着变化。互联网是一个非常重要的方向。基于Web技术的网络考试系统可以在全球范围内使用互联网&#xff0c;可以在本地或异地进行通信&#xff0c;大大提高了通信和交换的灵活性。在当今高速发展的互联网时…...

动态sql以及常用的标签

什么是动态sql&#xff1a; 指根据不同的条件生成不同的sql 搭建环境&#xff1a; 建表&#xff1a; create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…...

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...