集合体系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.mzph.cn/news/817067.shtml

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

相关文章

Java中队列

队列是一种常见的数据结构&#xff0c;它按照先进先出&#xff08;FIFO&#xff09;的原则管理元素。在 Java 中&#xff0c;队列通常是通过链表或数组实现的&#xff0c;不同的实现类在内部数据结构和操作上可能有所不同。 1.原理 1.数据结构&#xff1a;队列的基本数据结构…

【python图形界面问题解决】wxPython创建图形界面程序,在代码编译器中正常运行,但是打包后却不能运行解决办法

一、问题 使用wxPython创建一个图形界面&#xff0c;在VSCODE中正常运行&#xff0c;但是打包后&#xff0c;却不能运行&#xff0c;只出现一个一闪而过的窗口&#xff0c;这时最需要看看这窗口到底显示了什么内容。这里可以使用录屏软件录制屏幕&#xff0c;这里使用LICEcap小…

美国卖家需知!儿童玩具CPC认证ASTMF-23标准更新

2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了最新版本的玩具安全标准ASTM F963-23。这一标准的修订涵盖了声学、电池可及性、充气材料、弹射玩具等技术方面的要求。同时&#xff0c;它还为邻苯二甲酸盐和重金属在玩具基材中的使用提供了豁…

Towards IP Geolocation Using Delay and TopologyMeasurements(TBG)(2006年)

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:492 Katz-Bassett E, John J P, Krishnamurthy A, et al. Towards IP geolocation using delay and topology …

通讯录的实现(单链表版本)

我们首先要知道通讯录的实现是基于单链表的基础上的&#xff0c;所以我们首先要搞懂单链表。&#xff08;注意&#xff1a;今天的代码量较多&#xff09;&#xff0c;但这不是阻挡我们前进的脚步&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01; 单链表的简要概述 我们…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

微服务架构使用和docker部署方法(若依)

这里以若依官方网站开源的微服务框架为例子记录使用方法过程。 开源地址&#xff1a;RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 下载后&#xff0c;用IDEA社区版开发工具打…

GNU Radio Radar Toolbox编译及安装

文章目录 前言一、GNU Radio Radar Toolbox 介绍二、gr-radar 安装三、具体使用四、OFDM 雷达仿真 前言 GNU Radio Radar Toolbox&#xff08;gr-radar&#xff09;是一个开放源码的工具箱&#xff0c;用于 GNU Radio 生态系统&#xff0c;主要目的是为雷达信号处理提供必要的…

vue源码解析——diff算法/双端比对/patchFlag/最长递增子序列

虚拟dom——virtual dom&#xff0c;提供一种简单js对象去代替复杂的 dom 对象&#xff0c;从而优化 dom 操作。virtual dom 是“解决过多的操作 dom 影响性能”的一种解决方案。virtual dom 很多时候都不是最优的操作&#xff0c;但它具有普适性&#xff0c;在效率、可维护性之…

木马免杀代码之python反序列化分离免杀

本篇文章主要用到python来对CobaltStrike生成的Shellcode进行分离免杀处理, 因此要求读者要有一定的python基础, 下面我会介绍pyhon反序列化免杀所需用到的相关函数和库 exec函数 exec函数是python的内置函数, 其功能与eval()函数相同, 但不同的是exec函数支持多行python代码…

我国新戊二醇产能逐渐增长 市场集中度有望进一步提升

我国新戊二醇产能逐渐增长 市场集中度有望进一步提升 新戊二醇&#xff08;NPG&#xff09;又称为2,2-二甲基-1,3-丙二醇&#xff0c;化学式为C5H12O2&#xff0c;熔点为124-130℃。新戊二醇多表现为一种无特殊气味的白色结晶固体&#xff0c;易溶于水及醇、醚等溶液。新戊二醇…

为什么看到这么多人不推荐C++?

前几天逛知乎的时候&#xff0c;看到一个问题&#xff1a; 看到这个问题我倒是想吐槽几句了。 C一直没找到自己的定位&#xff01; C语言&#xff1a;我是搞系统编程开发的&#xff0c;操作系统、数据库、编译器、网络协议栈全是我写的。 PHP&#xff1a;我是搞后端业务开发…

一年期SSL证书怎么申请?

申请SSL证书三步走 JoySSL_JoySSL SSL证书_JoySSL https证书-JoySSL 一、选证书类型 根据网站性质与安全需求&#xff0c;选定合适的SSL证书&#xff1a; - 域名验证证书&#xff08;DV&#xff09;&#xff1a;快速验证域名所有权&#xff0c;适用于个人网站、博客&#xff…

ReentrantLock源码阅读

1. 概述 lock锁, 基于队列同步器AQS, 实现公平锁、非公平锁 队列同步器AQS可以阅读我这篇文章&#xff1a; 点击传送 实现了Lock接口: public class ReentrantLock implements Lock// 加锁 获取不到锁一直等待 void lock(); // 加锁 获取不到锁一直等待 等待过程可以被中断…

【攻防世界】php_rce (ThinkPHP5)

进入题目环境&#xff0c;查看页面信息&#xff1a; 页面提示 ThinkPHP V5&#xff0c;猜测存在ThinkPHP5 版本框架的漏洞&#xff0c;于是查找 ThinkPHP5 的攻击POC。 构造 payload: http://61.147.171.105:50126/?sindex/think\app/invokefunction&functioncall_user_f…

【Go语言快速上手(一)】 初识Go语言

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; Go快速上手 1. 前言2. Go语言简介(为…

模拟Android系统Zygote启动流程

版权声明&#xff1a;本文为梦想全栈程序猿原创文章&#xff0c;转载请附上原文出处链接和本声明 前言&#xff1a; 转眼时间过去了10年了&#xff0c;回顾整个10年的工作历程&#xff0c;做了3年的手机&#xff0c;4年左右的Android指纹相关的工作&#xff0c;3年左右的跟传感…

亚马逊CloudFront使用体验

前言 首先在体验CloudFront之前&#xff0c;先介绍一下什么是CDN&#xff0c;以及CDN的基本原理。 CDN是Content Delivery Network&#xff08;内容分发网络&#xff09;的缩写&#xff0c;是一种利用分布式节点技术&#xff0c;在全球部署服务器&#xff0c;即时地将网站、应…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.6 年初操作:科目余额结转

2.6.6 年初操作&#xff1a;科目余额结转 在使用事务代码 FAGLB03 查询科目余额时&#xff0c;可以看到按期间的发生额清单。其中&#xff0c;第一行称为“余额结转”&#xff0c;该行的累计余额代表上年度遗留下来的余额&#xff0c;也就是年初余额。对于资产负债表科目而言&a…

七大设计原则

在软件开发的领域中&#xff0c;随着技术的不断进步和市场需求的不断变化&#xff0c;软件系统的设计和维护变得越来越重要。为了确保软件系统能够长期有效地运行&#xff0c;并且能够在未来的发展中适应新的需求和技术变化&#xff0c;提高软件系统的可维护性和可复用性成为了…