第十三章 集合

一、集合的概念

集合:将若干用途、性质相同或相近的“数据”组合而成的一个整体

Java集合中只能保存引用类型的数据,不能保存基本类型数据

数组的缺点:长度不可变

Java中常用集合:

1.Set(集):集合中的对象不按特定方式排序,并且没有重复对象

2.List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许按索引位置索引对象

3.Map(映射):集合中的每个元素包含一个键对象和值对象,集合中没有重复的键对象,值对象可以重复

二、Collection接口

public class CollectionTest {public static void main(String[] args) {//Collection是接口,需要用实现类创建对象Collection c = new ArrayList();//集合中保存多少长度System.out.println("获取集合的长度"+c.size());//如果没有数据返回true,有数据返回falseSystem.out.println("判断集合是否为空"+c.isEmpty());//往集合中添加数据用add方法c.add("张三");//集合中是不能保存基本数据类型的,只能保存对象类型//而基本数据类型可以保存的原因是jdk1.5之后基本数据类型会跟包装类类型进行默认转换c.add(123);c.add(true);c.add('a');c.add(99.5);//集合重写了Object的toString方法,所以打印显示的内容不是地址System.out.println(c);System.out.println(c.size());//删除集合中的数组c.remove(123);System.out.println(c);//删除数据之后集合的长度会发生改变,但是数组的长度不会System.out.println(c.size());//将集合转换为数组的方法Object []objects = c.toArray();for(Object o :objects){System.out.println(o + " ");}}
}

三、Iterator接口

Iterator接口的作用:遍历容器中的元素

Iterator接口的方法:

boolean hasNext()

Object next()

void remove()

public class IteratorTest {public static void main(String[] args) {//Collection是接口,需要用实现类创建对象Collection c = new ArrayList();c.add(123);c.add(true);c.add('a');c.add(99.5);//使用迭代器遍历集合Iterator it = c.iterator();//hasNext方法用于判断后面是否还有数据,如果有则返回true,如果没有数组则返回falsewhile(it.hasNext()){//next方法用于获取集合中的数据System.out.println(it.next());}}
}

四、Set

1.Set接口未提供额外的方法

2.Set的实现类:HashSet、TreeSet

3.HashSet类:按照哈希算法存取集合中的对象

(1)哈希算法判断集合中的元素是否重复,先判断对象的hashcode,然后使用equals()方法

(2)为了使HashSet正常工作,类重写equals()方法时必须重写hashcode()方法,以保证两个引用同一对象的两个变量的hashcode也一致

4.TreeSet:能够对集合中的对象进行自动排序

(1)集合中的对象必须可以比较

(2)自然排序:集合中的对象进行比较,然后进行升序排列

                集合中对象的类必须实现java.lang.Comparable接口,使用compareTo()方法进行比较

                Java类库中实现Comparable接口的常用类

(3)自定义排序

如果希望TreeSet类的对象按着自定义方式排序,需要让集合中对象的类实现java.util.Comparator接口

5.set集合不可以重复的不仅仅是同一个对象不能保存进set集合,不同对象,内容相同的也不能保存进集合中说到比较首先想到的是equals但是set集合为了提交比较效率会先进行hash比较,hash值是对象的内容经过一系列hash计算,得到的一个整数。如果两个对象的hash值不同,则表示不是同一个对象,如果hash值相同,则证明这两个对象可能是同一个对象,要进行equals比较,方法出现hash值相同,但是内容不同的情况偶然发生。

public class SetTest {public static void main(String[] args) {//set集合特点,无序(指添加到集合中的顺序和显示集合的顺序不一致+)不可以重复Set set = new HashSet();set.add(123);set.add(true);set.add('a');set.add(99.5);//set集合无序不可以重复,不仅仅是同一个对象不能重复,不同对象内容重复也不能保存到set集合里String s1 = "world";String s2 = new String("world");set.add(s1);set.add(s2);System.out.println(set);}
}
public class Test {public static void main(String[] args) {Set set = new HashSet();Student s1 = new Student(1001,'l',18);Student s2 = new Student(1001,'l',18);Student s3 = new Student(1001,'s',20);set.add(s1);set.add(s2);set.add(s3);System.out.println(set);}
}
class Student{int no;char name;int age;public Student (int no,char name,int age){this.age = age;this.name = name;this.no = no;}//要想让自己写的类在set集合中正常保存,就需要重写equals的同时重写hashCode方法//正常保存指的是同一个对象不能保存进集合中,不同对象内容相同也不能保存进集合中@Overridepublic boolean equals(Object o) {if(this == o ){return true;}//判断o对象是不是有Student创建的if(o instanceof Student){Student s = (Student)o;//在逐一比较每个属性的值是否相同if (age == s.age&&name ==s.name&&no==s.no){return true;}}return false;}@Overridepublic int hashCode() {return age*5+name*5+no*5;}
}

五、List

1.List元素都对应一个整数类型的序号记录其在集合中的位置,可以根据序号存取集合中的元素

2.List的实现类:ArrayList、LinkedList等

3.Arrays补充方法:List asList(数组类型 a)

4.ArrayList:

(1)代表长度可变的数组

(2)查询速度较快、增删改速度较慢

5.LinkedList:

 (1)采用链表数据结构,对顺序访问进行优化

 (2)增删改速度较快,查询速度较慢

注意:一定要实际问题实际分析,规律可能会发生变化

public class ListTest {public static void main(String[] args) {//list集合有序可以重复,可以通过索引获取对应位置的数据List list = new LinkedList();list.add(123);list.add("hello");list.add(false);list.add(true);list.add(98.2);list.add('l');System.out.println(list);//get方法,通过索引获取对应位置的数据System.out.println("获取索引为2,第三个位置的数据"+list.get(2));//set方法,修改指定位置的数据的值list.set(1,"hello world");System.out.println(list);//在指定索引位置添加数据list.add(1,"hello");System.out.println(list);//删除指定索引位置的数据list.remove(1);System.out.println(list);//将数组转换为集合,那么数组保存数据类型必须是对象类型,基本数据类型要使用包装类Integer[] a = {1,2,3,4,5,6,7,8,9};List list1 = Arrays.asList(a);System.out.println(list1);//List集合的便利形式//第一种转换数组在遍历Object[] object = list1.toArray();for (Object o: object){System.out.print(o + " ");}System.out.println();//第二中使用迭代器遍历Iterator it = list1.iterator();while (it.hasNext()){System.out.print(it.next()+" ");}System.out.println();//第三种,直接遍历使用get方法获取数据for (int i=0;i<list1.size();i++){System.out.print(list1.get(i)+" ");}System.out.println();//第四种使用foreach循环遍历for(Object o:list1){System.out.print(o + " ");}}}

六、Map

1.Map中存储的元素通常都是由key来表示,所以同一Map中key值不能重复,value值无要求

2.Map的实现类:HashMap、TreeMap

3.Map接口的属性:Entry——映射项(键-值对)

public class MapTest {public static void main(String[] args) {Map map = new HashMap();//Map集合以键值对的形式保存数据,键不能重复,值可以重复//put方法往Map集合中保存数据map.put("a","123");map.put(1,false);map.put('a',95.5);map.put(true,100);System.out.println(map);//map集合保存数据要求key不能重复,但是如果重复了也不会报错//会用心地value值将之前的数据覆盖掉map.put(true,200);System.out.println(map);//get方法,根据key值获取对应的value值System.out.println(map.get(true));//根据key值删除map集合中的数据map.remove('a');//当要删除的key不存在的时候,代码书写执行不会报错,就是没有删除而已map.remove(false);System.out.println(map);System.out.println("获取map集合中的元素个数" + map.size());//clear清空集合//map.clear()//遍历map集合//1.通用遍历形式 最通用Set set = map.entrySet();Iterator it = set.iterator();while (it.hasNext()){Map.Entry entry = (Map.Entry) it.next();System.out.println("保存数据时候的key值" + entry.getKey());System.out.println("保存数据时候的value值" + entry.getValue());System.out.println();}//2.特殊形式的遍历Map map1 = new HashMap();//当key值都是有规律的,且不同的是一段连续的数字,那么就可以通过get方法来获取//数据,从而遍历集合map1.put("item0","123");map1.put("item1","true");map1.put("item2",'k');map1.put("item3","k");map1.put("item4",1000);for (int i = 0;i<map1.size();i++){System.out.println(map1.get("item"+i));}}}

七、Collections类

java.util.Collections类:提供一系列的基于集合操作的常用静态方法

public class CollectionsTest {//Collection类是专门操作集合的类public static void main(String[] args) {List list = new ArrayList();list.add("hello");list.add("zhangsan");list.add("zhao");list.add("wangwu");list.add("liuxuiang");list.add("zhaoliu");//排序Collections.sort(list);System.out.println(list);//倒序Collections.reverse(list);System.out.println(list);//乱序Collections.shuffle(list);System.out.println(list);}
}
public class Demo {public static void main(String[] args) {List list = new ArrayList();Teacher t1 = new Teacher(1001,"张三",18);Teacher t2 = new Teacher(1002,"张四",19);Teacher t3 = new Teacher(1003,"张五",20);list.add(t1);list.add(t2);list.add(t3);Collections.sort(list);System.out.println(list);}
}
class Teacher implements Comparable{int no;String name;int age;public Teacher (int no,String name,int age){this.no = no;this.name = name;this.age = age;}@Overridepublic String toString() {return "Teacher{" +"no=" + no +", name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Object o) {if (o instanceof Teacher){Teacher t = (Teacher) o;//this 表示的是前一个数, o表示的是数组中的后一个数·//-1表示不需要交换,正数表示需要交换返回正数就行if (t.age>this.age){return -1;} else if(t.age<this.age){return 1;}}return 0;}
}

八、泛型

1.为何使用泛型?

进入集合的对象都当作Object类型,从而失去了自己的类型;取出后也是Object类型,使用前通常要进行强制转换容易出现ClassCastException异常

2.原因:装入集合的时候无法指定装入的元素是何种类型

3.泛型:

(1)装入集合的时候指定元素的具体的类型

(2)增强程序的稳定性与可读性

4.集合中使用泛型

5.定义泛型类

(1)使用<T>用来声明一个型态持有者名称T(可以替换其它标示符)

(2)在定义泛型类时,可以声明多个泛型类型

              一般形式:class 类名称 <T1,T2> 

(3)声明及配置对象时不一定指定型态,默认会使用Object型态,编译时编译程序会提出警告

(4)可以使用泛型机制来声明一个数组(可以用数组代理T)

(5)不可以使用泛型来建立数组的实例(不能new T[])

6.限制泛型的可用类型

一般形式:class 类名称 <T extends anyClass>

anyClass为类或接口,此类中的泛型必须是实现或继承了anyClass

7.使用类型通配符

一般形式:泛型名称<? extends anyClass>(设定上限)

一般形式:泛型名称<? super anyClass>(设定下限)

public class GenericTest {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("123");list.add("hello");//添加泛型之后,在想往集合中和保存其它类型的数据就会报错//list.add(123)System.out.println(list);//泛型不会让保存到集合中的数据丢失自己本身的类型,所以取值的时候就不需要进行类型转换了Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();System.out.println(s);}//集合中只能保存对象类型,所以在写泛型的时候只能写包装类型不能写基本数据类型Map<String,Integer> map = new HashMap();map.put("a",5);}}

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

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

相关文章

工具模块及项目整体模块框架

文章目录 工具模块logger.hpphelper.hppthreadpool.hpp 核心概念核心API交换机类型持久化⽹络通信消息应答持久化数据管理中心模块虚拟机管理模块交换路由模块消费者管理模块信道管理模块连接管理模块Broker服务器模块消费者管理信道请求模块通信连接模块项⽬模块关系图 工具模…

ScrapeGraphAI 大模型增强的网络爬虫

在数据驱动的动态领域&#xff0c;从在线资源中提取有价值的见解至关重要。从市场分析到学术研究&#xff0c;对特定数据的需求推动了对强大的网络抓取工具的需求。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线…

电脑出现msvcp140.dll丢失的解决方法,总结6种解决方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中最常见的就是“msvcp140.dll丢失”的错误。这个错误提示通常出现在运行某个程序时&#xff0c;它意味着计算机无法找到所需的msvcp140.dll文件。那么&#xff0c;msvcp140.dll丢失是怎么回事呢&#…

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征&#xff0c;例如 word2vec 或语言模型这种非深度学习…

银河麒麟V10如何关闭定期锁屏功能?

银河麒麟V10如何关闭定期锁屏功能? 1. 打开终端2. 执行命令3. 验证设置 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟高级服务器操作系统V10中&#xff0c;关闭定期锁屏功能很简单。使用场景&#xff1a;比如&#xff0c;当你…

大模型~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/11566566 # 深度模型融合&#xff08;LLM/基础模型/联邦学习/微调等&#xff09; 23年9月国防科大、京东和北理工的论文“Deep Model Fusion: A Survey”。 深度模型融合/合并是一种新兴技术&#xff0c;它将多个深度学习模…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时

CMU 10423 Generative AI:lec14(Vision Language Model:CLIP、VQ-VAE)

文章目录 1 概述2 CLIP (Used in GPT-V)3 VQ-VAE (Used in Gemini)**VQ-VAE 详细笔记****VQ-VAE 的模块组成与数据流** **1. 输入数据****2. 编码器&#xff08;Encoder&#xff09;****2.1 编码器的作用****2.2 数据流与维度变化****2.3 编码器输出** **3. 量化器&#xff08;…

手机使用指南:如何在没有备份的情况下从 Android 设备恢复已删除的联系人

在本指南中&#xff0c;您将了解如何从 Android 手机内存中恢复已删除的联系人。Android 诞生、见证并征服了 80% 的智能手机行业。有些人可能将此称为“非常大胆的宣言”&#xff0c;但最近的统计数据完全支持我们的说法。灵活性、高度改进的可用性和快速性是 Android 操作系统…

Qt QWidget控件

目录 一、概述 二、Qwidget常用属性及函数介绍 2.1 enable 2.2 geometry 2.3 windowTitle 2.4 windowIcon 2.5 cursor 2.6 font 设置字体样式 2.7 toolTip 2.8 focusPolicy焦点策略 2.9 styleSheet 一、概述 widget翻译而来就是小控件&#xff0c;小部件。…

10.3作业

基于TCP的快查云词典 仿照有道云词典功能&#xff0c;实现一个自己的云词典功能&#xff0c;可以查询单词和发音。 服务器描述&#xff1a;服务器启动后&#xff0c;等待客户端连接&#xff0c;完成以下操作&#xff1a; 1.创建用户表、单词表、历史表 2.注册&#xff1a;接…

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…

mysql-索引笔记

索引 1、什么是索引 索引是对数据库中数据的一种结构化表示。它像一本书的目录&#xff0c;能够快速定位信息&#xff0c;而无需逐行扫描所有数据。 索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样。 2、索引的常见模型 2.1.哈希表 用一个哈希函…

828华为云征文|华为云 Flexus X 实例初体验

一直想有自己的一款的服务器&#xff0c;为了更好的进行家庭娱乐&#xff0c;甚至偶尔可以满足个人搭建开发环境的需求&#xff0c;直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…

每日论文5—06TCAS2锁相环电流匹配的gain-boosting电荷泵

《Gain-Boosting Charge Pump for Current Matching in Phase-Locked Loop》 06TCAS2 本质上和cascode来增加输出电阻&#xff0c;从而减小电流变化的思路是一样的。这里用了放大器来增加输出电阻。具体做法如下图&#xff1a; 如图1(a)&#xff0c;A3把Vb和Vx拉平&#xff0…

vscode安装及c++配置编译

1、VScode下载 VS Code官网下载地址&#xff1a;Visual Studio Code - Code Editing. Redefined。 2、安装中文插件 搜索chinese&#xff0c;点击install下载安装中文插件。 3、VS Code配置C/C开发环境 3.1、MinGW-w64下载 VS Code是一个高级的编辑器&#xff0c;只能用来写代…

基础算法--枚举

枚举算法是一种简单而有效的算法&#xff0c;它通过枚举所有可能的情况来解决问题。它通常用于解决问题规模比较小的问题&#xff0c;因为它的时间复杂度很高&#xff0c;随着问题的规模增加&#xff0c;算法的效率会急剧下降。 枚举算法的基本思路是通过循环遍历所有可能的情…

Rust和Go谁会更胜一筹

在国内&#xff0c;我认为Go语言会成为未来的主流&#xff0c;因为国内程序员号称码农&#xff0c;比较适合搬砖&#xff0c;而Rust对心智要求太高了&#xff0c;不适合搬砖。 就个人经验来看&#xff0c;Go语言简单&#xff0c;下限低&#xff0c;没有什么心智成本&#xff0c…

使用MTVerseXR SDK实现VR串流

1、概述​ MTVerseXR SDK 是摩尔线程GPU加速的虚拟现实&#xff08;VR&#xff09;流媒体平台&#xff0c;专门用于从远程服务器流式传输基于标准OpenXR的应用程序。MTVerseXR可以通过Wi-Fi和USB流式将VR内容从Windows服务器流式传输到XR客户端设备, 使相对性能低的VR客户端可…

【CSS in Depth 2 精译_043】6.5 CSS 中的粘性定位技术 + 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…