15集合的应用

news2024/11/24 13:06:57

集合的概念

集合是一个容器,可以容纳其他类型的数据,前面所讲的数组就是一个集合。
所有的集合相关的类和接口都在java.util包下

特点

  • 集合不能直接存储基本数据类型(但是代码上不需要体现,因为Java中有自动装箱)
  • 另外集合不能直接存储Java对象,而是存储其内存地址也叫做引用
  • 不同集合,底层对应不同的数据结构
  • 数据结构就是数据存储的结构,常见的结构有:数组、二叉树、连败哦、哈希表等。

分类

Java中的集合分为两类
一类是以当个方式存储元素:java.util.Collection
集合的继承结构图
另一类是以键值对的方式存储元素:java.util.Map
Map集合的继承结构图
图中已经展现出各个集合的特点。

总结常用集合

集合存储结构
ArrayList数组
LinkedList双向链表
HashSet底层是HashMap,其存储的元素等于HashMap的key
TreeSet底层是TreeMap,其存储的元素等于TreeMap的key
HashMap哈希表
Properties线程安全,key和value只能存储String类型,常用做配置类
TreeMap二叉树,key可以自动按大小排序

Collection

Collection集合没有泛型时,可以存储Object的所有子类
但是存在泛型之后,只能存储泛型的类型

注意:不能存放基本数据类型和对象本身,只能存储封装类或对象的内存地址。

常用的方法

常用方法说明
boolean add(E e)向集合中添加一个元素,添加成功返回true
boolean remove(Object o)删除某个元素,底层会调用equals方法进行对比,成功返回true
int size()返回集合中元素的个数
boolean contains(Object o)判断集合中是否包含改元素,底层调用equeals(),包含返回ture
boolean isEmpty()判断集合是否为空,为空返回true
void clear()清空改集合
Object[] toArray()将集合转换为数组

演示:

public class Test{
	public static void main(String[] args){
	//多态,夫类型引用指向子类型对象
	Collection c = new ArrayList();
	
	//向集合中添加一个元素1
	/*注意Java在中存在自动装箱机制,实际上是:
	Integer i = new Integer(1);
	*/
	c.add(1);
	
	//获取当前集合的元素个数,当前为1
	int size = c.size();
	//判断当前集合中是否包含1,结果是ture
	boolean isContains = c.contains(1);
	//清空集合
	c.clear();
	//判断集合是否为空,结果为ture
	boolean isEmpty = c.isEmpty();
	}
}

Iterator 迭代器

只有Collection集合才能被迭代器迭代,Map集合不可以使用

常用方法说明
boolean hasNext()判断当前指向的元素后是否还存在元素
E next()返回当前指向的元素,并且指向下一个元素
remove()删除迭代器当前指向的元素

使用方法:

main(){
	//首先需要准备一个Conllection的集合
	Collection collections = new ArrayList();
	collections.add("元素1");
	...
	collections.add("元素n");
	
	//获取迭代器对象,改方法继承自Iterator接口
	Iterator<String> it = collections.iterator();
	
	//判断当前元素后是否还有元素
	while (iterator.hasNext()) {
		//使用一个变量接收该元素后,并指向下一个元素
	    String element = iterator.next();
	    //打印前面接收的元素
	    System.out.println(element);
	}
}

注意:在迭代的过程中,要删除集合中元素时,请使用迭代器的remove方法。
直接使用Collection中的方法,需要重新获取一个新的迭代器。

List子类

List作为Collection的子类,存在一些特有的方法
这些方法根据该集合的特点而来

方法说明
void add(int index, E element)向指定下标处添加元素
E get(int index)获取指定下标的元素
E set(int index, E elemtnt)修改指定下标的元素
int indexOf(Object o)返回列表中第一次出现指定元素的索引,如果没有返回-1
int lastIndexOf(Object o)返回列表中最后出现的指定元素的索引,如果没有返回-1
E remove(int index)删除指定索引的元素

ArrayList

特点:

  • ArrayList不是线程安全的
  • 默认的初始化容量是10
  • 底层先创建一个长度为0的数组,添加第一个元素时长度变为10
  • 集合的底层时一个Object数组

构造方法:

new ArrayList();//默认初始化方式
new ArrayList(20);//指定初始大小
new ArrayList(一个集合);
//比如将HashSet转化为ArrayList

数组的扩容:

  • 增长到原容量的1.5倍

面试题:ArrayList的优缺点

  • ArrayList使用最多,与数组的特点相同
  • 数组检索效率高//以后经常检索
    (由于每个元素占用的空间大小相同,内存地址连续,知道首元素的地址,可根据偏移量计算出目标元素的内存地址)

缺点:

  • 数组无法存储大数据量
  • 随机增删元素效率低
  • 末尾增删不受影响

LinkedList

特点:

  • 底层存储在双向链表中
  • 由三部分组成:上一个节点的内存地址、数据、下一个节点的内存地址
  • 没有初始化容量,firstlast都是null

Vector(使用很少,了解即可)

  • 底层是数组
  • 初始化容量是 10
  • 扩容之后是原容量的二倍 10-20-40-80
  • Vector 都是线程同步/线程安全的,都带有synchronized关键字,使用较少

Set集合中的元素都等同于Map集合的Key

Map

与Collection没有关系
其存储方式以key-value的形式存储(key和value都是引用数据类型)
不能直接存储对象,只能存储对象的内存地址

Map接口中常用的方法

方法说明
V put(K key, V value)向集合中添加键值对
V get(Object key)通过key获取value
V remove(Object key)通过key删除value
Collection< V> values()获取所有的value
Set< K> keySet()返回Map集合中所有的key

Map集合遍历的方式

方式一:先获取所有的key,再通过key来获取value

Iterator<Integer> it = keys.interator();
while(it.hasNext()){
	//取出一个key
	Integer key = it.next();
	//通过key获取value
	String value = map.get(key);
	System.out.println(key+"+"+value);
}

方式二:将Map集合转化为Set集合
效率较高!!适合大数据量

Set<Map.Entry<Integer,String>> set = map.entrySet();
Iterator<Map.Entry<Integer,String>> it2 = map.entrySet();
while(it.hasNext()){
	Map.Entry<Integer,String> node = it2.next();
	Integer key = node.getKey();
	String value = node.getValue();
	System.out.println(key+"="+value);
}

HashMap

特点:

  • 集合的默认初始化容量是16,默认加载因子是0.75
  • 初始化容量必须是2的倍数
  • 扩容是原来的二倍
  • 默认加载因子是HashMap集合容量达到75%时数组开始扩容
  • 非线程安全

HashMap的源代码中有以下属性:

final int hash; //实际上是key的hashCode()
final K key
V value
Node < K,V> next;

HashMap 集合允许key值为 null
但是HashMap集合的key null 值只能有一个

了解内容:
如果hashcode();固定为某个值,会使hashMap变成单项列表
这种情况叫:散列分布不均匀
如果hashcode()全部不一样的,会使hashMap变成一维数组
也是散列分布不均匀
哈希表

散列分布均匀需要重写hascode();有一定的技巧

【最终结论】
放在HashMap key部分的元素和HashSet的元素
需要同时重写equals();和hashcode();

Properties

特点:

  • 继承Hashtable
  • 初始化容量是11,默认加载因子是0.75
  • 扩容是原容量乘以2再加一
  • 线程安全
  • key和value都是字符串,且不能为空
常用方法说明
String getProperty(String key)根据键值,获取属性
Object setProperty(String key, String value)调用 Hashtable 的方法 put

TreeMap

特点:

  • 底层是二叉树
  • 无序不可重复,存入的值会自动按照大小排序(String按字典升序,Integer按大小升序)
  • 对自定义的类进行排序时,需要声明比较规则。如果没有实现 java.lang.Comparable比较接口 JVM会报错

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

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

相关文章

【基于element ui的color选择器】基于element ui的color选择器

技术版本如下&#xff1a; vue 2.6.14 less 3.13.1 element-ui 2.15.6 less-loader 5.0.0需求&#xff1a; 支持RGB、HEX编码、支持吸管吸取颜色、颜色选择器、颜色模板、透明度、色板、线性渐变颜色 效果图&#xff1a; 1.引入选择器的color-all文件 <template><…

代码随想录训练营Day 27|理论基础、力扣 77. 组合

1.理论基础 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 来自代码随想录的网站&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (…

网络基础-SSH协议(思科、华为、华三)

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和安全文件传输的协议。它提供了加密的通信通道&#xff0c;使得用户可以在不安全的网络上安全地远程登录到远程主机&#xff0c;并在远程主机上执行命令、访问文件以及传输文件&#xff0c;本篇主要讲解命令执行…

Java 对象序列化

序列化&#xff1a;把对象转化为可传输的字节序列过程称为序列化。 反序列化&#xff1a;把字节序列还原为对象的过程称为反序列化 序列化的作用是方便存储和传输&#xff0c;细节可参考如下文章&#xff1a; 序列化理解起来很简单 - 知乎序列化的定义 序列化&#xff1a;把对…

上海人工智能实验室浦视团队联培博士(2025)招生正式启动!

上海人工智能实验室浦视团队2025级联培博士招生计划开启啦&#xff01; 上海人工智能实验室作为国内领先的人工智能领域的新型科研机构&#xff0c;不仅致力于攻克重要基础理论难题&#xff0c;更着眼于构建全球领先的 AI 技术人才培养平台。浦视团队是大模型方向的核心科研团…

Sqli-labs第五~八关(布尔盲注)

目录 首先找到他们的闭合方式 操作 总结&#xff1a; 第五关根据页面结果得知是字符型但是和前面四关还是不一样是因为页面虽然有东西。但是只有对于请求对错出现不一样页面其余的就没有了。这个时候我们用联合注入就没有用&#xff0c;因为联合注入是需要页面有回显位。如果…

【工具推荐】好用的电脑文件检索工具 everything

之前每次想要检索一些电脑中的文件&#xff0c;软件什么之类的 只能在“我的电脑”里面&#xff0c;搜索 我去&#xff0c;真的是巨慢无比~&#xff0c;搜好了有些时候又忘记了&#xff0c;然后就得重新搜 直到我发现了…… Everything 他的名字起的确实好&#xff0c;想找…

网络工程师----第二十五天

计算机基础 第二章&#xff1a;物理层 物理层的功能&#xff1a;怎样在连接各种计算机的传输媒体上传输数据比特流&#xff0c;屏蔽不同传输媒体和通信手段的差异。 传输媒体接口的特性&#xff1a; 机械特性&#xff1a;接口所用接线器的形状和尺寸、引脚数目和排列、固定…

【教程向】从零开始创建浏览器插件(一)

第一步&#xff1a;创建一个自己的浏览器插件 在这篇博客中&#xff0c;我们将学习如何创建一个简单的浏览器插件。对于本教程&#xff0c;我们将以创建一个在浏览器中运行的基本插件为例&#xff0c;该插件能够通过点击插件图标来改变当前网页背景色。我们将使用Chrome扩展程…

【APM】在Kubernetes中搭建OpenTelemetry+Loki+Tempo+Grafana链路追踪(一)

文章目录 1、最终效果2、前提准备2、环境信息3、服务集成&#xff08;Opentelemetry ->Tempo&#xff09;3.1 上报链路数据3.1.1 下载opentelemetry-agent3.1.2 启动配置业务app3.1.3 配置opentelemetry输入输出3.1.4 配置grafana datasource3.1.4.1 配置tempo3.1.4.2 配置l…

C++进阶 | [3] 续 | 搜索二叉树的两种模型

摘要&#xff1a;搜索二叉树的效率&#xff0c;搜索二叉树的两种搜索模型及应用举例 前面一片文章学习了并实现了搜索二叉树&#xff0c;这篇将从实际应用的角度进一步介绍搜索二叉树。 1. 搜索二叉树的效率 平衡搜索二叉树 BST的查找效率是 O(N)。 分析&#xff1a;如右图所示…

驾驭多云环境,加速AI创新丨Animbus Cloud 8.3.0 算力调度平台升级发布

大模型开启全球新一轮AI浪潮&#xff0c;伴随算力规模的爆发增长以及计算技术的多元创新&#xff0c;需要更稳定、高效、敏捷的异构计算基础设施&#xff0c;才能充分发挥对算力能力的重要支撑。 作为开放智能云边架构引领者&#xff0c;九州未来凭借多年的技术积累、实践沉淀…

怎么ai拍照搜题?让你的学习之路更平坦!

怎么ai拍照搜题&#xff1f;在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;的广泛应用已经渗透到我们生活的方方面面&#xff0c;其中AI拍照搜题功能更是受到了广大学子的热烈欢迎。这一功能通过拍照上传题目&#xff0c;利用AI技术快速识别并分析题目内容&#…

C语言——模拟实现库函数atoi

1. atoi atoi&#xff1a;将字符串转换为整数。 1. 头文件 <string.h> 2. 声明&#xff1a; 1. 如果字符串开始有空格&#xff0c;直接跳过。 2. - 会影响打印的数字的正负。 3. 只打印数字字符&#xff0c;遇到非数字字符就停止。 4. 如果转换之后的数字大于 …

非预警,这3本TOP期刊,为何走到On Hold这步?

本周投稿推荐 SSCI • 2区社科类&#xff0c;3.0-4.0&#xff08;社科均可&#xff09; EI • 计算机工程类&#xff08;接收广&#xff0c;录用极快&#xff09; SCI&EI • 4区生物医学类&#xff0c;1.5-2.0&#xff08;录用率99%&#xff09; • 1区工程类&#…

高性能计算基础

高性能计算基础 CUDA的线程组织结构 CUDA的存储体系结构&#xff0c;每一种存储的优缺点&#xff0c;该如何合理使用。GPU每一代的新特性有了解过吗&#xff1f;应该从哪里去了解详细信息&#xff1f;CUDA stream的概念&#xff0c;为什么要使用多个stream&#xff1f;GPU和…

html中用frameset对窗口进行划分

html中&#xff0c;一般有<head><body>等部分&#xff0c;在用<frameset>对窗口进行区域划分时&#xff0c;<body>标签对就不再需要了。直接删除就可以了。 请看下面的示例&#xff1a; 由于使用frameset进行窗口划分时&#xff0c;对于电脑屏幕的划分…

鸿蒙开发接口Ability框架:【(AbilityDelegator)】

AbilityDelegator AbilityDelegator提供添加用于监视指定能力的生命周期状态更改的AbilityMonitor对象的能力&#xff0c;包括对AbilityMonitor实例的添加、删除、等待ability到达OnCreate生命周期、设置等待时间等、获取指定ability的生命周期状态、获取当前应用顶部ability、…

美业收银系统源码-App/iPad/PC管理系统常见问题讲解(1)

博弈美业管理系统源码 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、平板iPad的评论内容&#xff0c;是从哪里评论的呢&#xff1f; 顾客在接受服务后&#xff0c;可以到…

从使用教程、实现原理、差异对比全方面带你玩转业务系统中高频使用的过滤器与拦截器

1.概述 在Java Web开发中&#xff0c;**过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;**是两种常见的组件&#xff0c;用于在请求到达目标资源之前或之后执行一些操作&#xff0c;如日志记录、权限控制、字符编码处理等。虽然它们的作用有…