集合体系java

Collection:单列集合:每个元素只包含一个值

Collection集合存储的是地址

Collection的三种遍历方法如下

//迭代器是用来遍历集合的专用方式(数组没有迭代器),在java中迭代器的代表是Iterator
//boolean hasNext():询问当前位置是否有元素存在
//E next():获取当前位置的元素,并同时将迭代器指向下一个元素处
public class CollectionTest3 {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("java1");c.add("java2");c.add("java3");//从集合对象获取迭代器对象Iterator<String> iterator = c.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}//增强For循环:可以遍历数组或集合,本质就是迭代器遍历集合的简便写法/*for(元素的数据类型 变量名:数组或者集合)*/for(String s:c){System.out.println(s);}//使用Lambda表达式遍历c.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});c.forEach((String s) -> {System.out.println(s);});c.forEach( s -> {System.out.println(s);});c.forEach( s -> System.out.println(s));c.forEach(System.out::println);}
}

1. List系列集合:添加的元素是有序,可重复,有索引。

List集合存储的是内容

四种遍历方式如下

public class ListTest1 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("java1");list.add("java2");list.add("java2");//        System.out.println(list);//for循环遍历for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//迭代器遍历Iterator<String> iterator = list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}//增强for循环for (String s : list) {System.out.println(s);}//Lambda表达式遍历list.forEach( System.out::println);}
}
a. ArrayList:有序,可重复,有索引( 基于数组实现 )

查询快,增删慢

  • 查询速度快(是根据索引查询数据快)
  • 删除效率低:可能需要把后边很多数据进行前移
  • 添加数据效率极低:可能需要把后边很多数据后移,再添加元素;或者也可能进行数组的扩容

底层原理:(1)利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组

(2)添加第一个元素时,底层会创建一个新的长度为10的数组

(3)存满时,会扩容1.5倍

(4)如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准

b. LinkedList:有序,可重复,有索引(基于双向链表实现)

适合用作 队列,栈

  • 查询慢,增删相对较快,但对首尾进行增删改查的速度是极快的

(API中有 在头部增加删除元素,在尾部增加删除元素 方法)

2. Set系列集合:添加的元素是无序,不重复,无索引.

a. HashSet : 无序,不重复,无索引(基于哈希表实现,底层基于Map实现的,只是只要键数据,不要值数据)

增删改查性能都较好

哈希值:java中每个对象都有一个哈希值,是一个int类型的数据

哈希表:数组+链表+红黑树

底层原理:(1)创建一个默认长度16的数组,默认加载因子为0.75,数组名为table

(2)使用元素的哈希值对数组长度求余计算出应存入的位置

(3)判断当前位置是否为null,如果是null直接存入

(4)如果不为null,表示有元素,则调用equals方法比较

相等,则不存;不相等,则存入数组

(数组占满后,扩容16*0.75=12个)

JDK8之前,新元素存入数组,占老元素位置,老元素挂在下面(链表)

JDK8之后,新元素挂在老元素下面(链表),当链表长度超过8,且数组长度
>=64时,自动将链表转成红黑树

如果Set集合认为两个内容一样的对象是重复的,必须重写对象的HashCode()方法和equals()方法

b. LinkedHashSet : 有序,不重复,无索引(基于哈希表实现,底层基于LinkedHashMap实现)

每个元素都额外多了一个双链表的机制记录它前后元素的位置

c. TreeSet : 按照大小默认升序排序,不重复,无索引(基于红黑树实现)

存储自定义的对象时,必须制定规则排序,支持如下两种方法(见 对象排序的两种方法)

Map:双列集合,每个元素包含两个值(键值对)

键不可以重复,值可以重复

在做购物车时,商品与购买数量是一对数据等等

把Map集合变成Set集合(把一个键值对看成一个元素)

Set<Map.Entry<String, Integer>> entries = map.entrySet();

map集合三种遍历方式如下

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;public class MapTest1 {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();map.put("张三",20);map.put("张三",21);map.put("李四",19);map.put("王五",20);System.out.println(map);//键找值//获取map集合的全部键Set<String> keys = map.keySet();System.out.println(keys);//遍历全部的键,获得值for (String key : keys) {Integer i = map.get(key);System.out.println(key+"==>"+i);}//把键值对看成一个整体进行遍历//1.调用map集合提供的entrySet方法,把map集合转换成键值对类型的set集合Set<Map.Entry<String, Integer>> entries = map.entrySet();//entires = {(张三=21),(李四=19),(王五=20)}for (Map.Entry<String, Integer> entry:entries) {String key = entry.getKey();Integer value = entry.getValue();System.out.println(key+"==>"+value);}//lambda表达式遍历map.forEach((k,v) -> {System.out.println(k+"==>"+v);});//即map.forEach(new BiConsumer<String, Integer>() {@Overridepublic void accept(String k, Integer i) {System.out.println(k+"==>"+i);}});}
}

1.HashMap(由键决定特点):无序,不重复,无索引(基于哈希表实现)

键相同时,后边的内容会覆盖前边的

public class MapTest1 {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();map.put("手表",2);map.put("手表",15);map.put("手机",5);map.put(null,null);System.out.println(map);//{null=null, 手表=15, 手机=5}}
}
  • HashMap集合是一种增删改查数据,性能都较好的集合
  • 但是他是无序的,不能重复,没有索引支持的(由键决定的特点)
  • HashMap的键依赖HashCode方法和equals方法保证键的唯一
  • 如果存储的是自定义类型的对象,可以通过重写通过 HashCode方法和equals方法,这样可以保证多

个对象内容一样时,HashMap集合就能认为是重复的

a.LinkedHashMap:有序,不重复,无索引

底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)

2.TreeMap:按照大小默认升序排序,不重复,无索引

集合的并发修改异常

  • 使用迭代器遍历时,又同时在删除集合中的数据,程序就会出现并发修改异常
  • 使用 增强for循环,lambda表达式 遍历集合并删除数据,没有办法解决bug

解决办法

  List<String> list = new ArrayList<>();list.add("java1");list.add("java2");list.add("java2");list.add("java21");list.add("java3");list.add("java11");//迭代器遍历Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String name = iterator.next();if (name.contains("1")){
//                list.remove(name);//会出现并发错误,会漏删iterator.remove();//删除迭代器当前遍历到的数据,每删除一个数据后,相当于在底层做了i--}}//for循环遍历for (int i = 0; i < list.size(); i++) {String name = list.get(i);if (name.contains("1")){list.remove(name);i--;}}

可变参数

  • 就是一种特殊形参,定义在方法,构造器的形参列表里,格式是:数据类型,参数名称
特点和好处
  • 好处:可以不传数据给他;可以同时传一个或者同时传多个数据给他;也可以传一个数组给她
  • 好处:常常用来灵活的接收数据
注意:
  • 一个形参列表中,只能有一个可变参数
  • 可变参数必须放到形参列表的最后边
public class ParamTest {public static void main(String[] args) {test();test(1);test(1,2);test(new int[]{1,2,3});}//一个形参列表中,只能有一个可变参数//可变参数必须放到形参列表的最后边public static void test(int...nums){//可变参数在方法内部,本质就是一个数组System.out.println(nums.length);System.out.println(Arrays.toString(nums));System.out.println("----------------");}
}

Collections是一个用来操作集合的工具类

集合的嵌套:集合中的元素又是另外一个集合

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

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

相关文章

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求&#xff0c;其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

甘特图:项目管理者的必备神器,如何提高工作效率?

甘特图是什么&#xff1f;项目管理者大多都熟悉甘特图&#xff0c;它是一种直观展示项目计划执行过程的工具。通过条形图来显示项目、任务的时间安排&#xff0c;以及实际进度与计划进度的对比情况。 在我个人的项目管理实践中&#xff0c;甘特图确实帮助我提高了工作效率&am…

goproxy 简单介绍 及一键安装脚本

goproxy 官网 https://goproxy.cn/ GoProxy 是一项用于 Go 模块的高性能代理服务&#xff0c;旨在为 Go 开发人员提供更快速、更可靠的模块下载体验。它提供以下主要功能&#xff1a; 全球分布式代理服务器: GoProxy 在全球多个地区部署了代理服务器&#xff0c;例如拉斯维加…

威纶通触摸屏与S7-1200进行标签通信(符号寻址)的具体方法示例

威纶通与S7-1200进行标签通信(符号寻址)的具体方法示例 前面和大家分享了威纶通与S7-1200通过绝对地址进行以太网通信的具体方法,具体内容可参考以下链接中的内容: 威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细) 如下图所示,打开博途软件,新建一个项目,…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路&#xff0c;这个电路里面必须要的东西&#xff08;如人需要喝水吃饭温度等情况&#xff0c;才能或者&#xff09; 现在我们要解决这三个问题 这里V开头的&#xff0c;都是电源管脚 这里解释一下&#xff1a; 这里要注意哪些是电路电压&#xff0c;哪…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day 16

Day 16 deep Learning – 鱼与熊掌兼得 最近在减重&#xff0c; 昨天跑了个一公里&#xff0c;然后今天上午又打了个篮球&#xff0c;真是老胳膊老腿了&#xff0c;运动完给我困得不行 Review 见前面的笔记 这里说dl 会提供一个足够大的模型&#xff0c; 来使得Dall loss 足够小…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

设计模式胡咧咧之策略工厂实现导入导出

策略模式&#xff08;Strategy Pattern&#xff09; 定义&#xff1a; 定义了一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互换。 本质: 分离算法&#xff0c;选择实现 应用场景 何时使用 一个系统有许多类&#xff0c;而区分他们的只是他们直接…

动手学大模型应用开发--Chapter 01 大模型概念

文章目录 前言一、学习知识点概要1.1 LLM1.3 ChatGPT1.3 RAG1.3.1 RAG解决的问题1.3.2 RAG的主要流程&#xff1a; 1.4 LangChain 前言 本学习笔记为datawhale动手学大模型应用开发的学习内容&#xff0c;学习链接为&#xff1a; https://datawhalechina.github.io/llm-univer…

计算机视觉实验五——图像分割

计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作&#xff0c;实现用户交互式分割&#xff0c;通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域&#xff0c;实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现…

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

小型CNC数控机床深受到韩国客户青睐

随着公司的快速发展&#xff0c;育菁科研成果的不断突破和自主创新能力的提高&#xff0c;育菁小型CNC机床迎合了国际化大市场的需求&#xff0c;吸引了众多国外客户的眼球&#xff0c;近日&#xff0c;韩国客户工程师和CEO到我司进行实地考察交流 在胡经理和外贸同事陪同下&am…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

哪个品牌蓝牙耳机好?掌握六大选购逻辑,选准不选贵!

​随着科技的不断进步&#xff0c;蓝牙耳机已经成为了我们生活中不可或缺的一部分。它不仅摆脱了有线的束缚&#xff0c;还提供了极大的自由度。然而&#xff0c;面对市场上琳琅满目的蓝牙耳机&#xff0c;挑选一款性价比高的产品确实需要一些技巧。作为一名资深的耳机用户&…

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日&#xff0c;为推进采购阳光化、数字化和智能化&#xff0c;提升管理效率与质量&#xff0c;企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司&#xff08;以下简称“健力宝”&#xff09;成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式&#xff0c;例如“金鱼”或“卫生纸”&#xff0c;但它们将被转换为离散标签&#xff0c;只是为了简化交叉熵损失的计算&#xff0c;从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和 . 分别代表…

Java垃圾回收2

垃圾回收的算法有哪些 通过可达性分析算法&#xff0c;我们已经可以找到需要回收的对象。现在需要通过垃圾回收算法&#xff0c;把垃圾回收&#xff0c;释放内存。 1.标记清除算法(使用较少) 标记清除算法&#xff0c;是将垃圾回收分为2个阶段&#xff0c;分别是标记和清除。…

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数&#xff08;在FreeConfig.h&#xff09;文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次&#xff08;程序…