集合体系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.hqwc.cn/news/619387.html

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

相关文章

排序算法-基数排序

基数排序是一种非比较排序算法&#xff0c;它将待排序的数字按照位数进行排序。基数排序的思想是先按照个位数进行排序&#xff0c;然后按照十位数进行排序&#xff0c;接着按照百位数进行排序&#xff0c;以此类推&#xff0c;直到最高位排序完成。 基数排序的步骤如下&#x…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

分享一些有趣的 Linux 命令

1、sl 会显示一辆火车穿过你的终端屏幕 2、cmatrix 在终端中显示类似于《黑客帝国》电影中的绿色数字雨效果 3、fortune 显示一个随机的名人名言或者笑话 4、cowsay 让一头牛说出你输入的话 5、toilet 在终端中将输入的文本以艺术字体的形式呈现 6、figlet 类似于 toile…

linux进阶篇:使用Apache搭建文件服务器目录

Linux服务搭建篇&#xff1a;使用Apache搭建文件服务器目录 一、关于文件服务器 ​ 在一个项目中&#xff0c;如果想把公共软件或者资料共享给项目组成员&#xff0c;可以搭建一个简易的文件服务器来实现&#xff0c;只要是在局域网内的成员都可以通过浏览器或者wget命令来下…

微软搭建零售新媒体创意工作室大举抢占数字营销广告市场

“微软新零售创意工作室新平台利用生成式人工智能&#xff0c;在几秒钟内轻松定制横幅广告。零售媒体预计到2026年将成为一个价值1000亿美元的行业。” 零售媒体在过去几年中发展迅速。根据eMarketerOpens在新窗口的数据&#xff0c;预计到2024年&#xff0c;仅美国的零售媒体…

负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单变量时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境ma…

基于springboot实现购物推荐网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现购物推荐网站系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了东大每日推购物推荐网站的开发全过程。通过分析企业对于东大每日推购物推荐网站的需求&#xff0c;创建了一个计算机管…

【数据工具】ArcGIS批量出图工具箱

工具下载链接&#xff1a;数据下载链接 我们在使用Arcgis制图的过程中&#xff0c;经常会遇到需要大量出图的情况&#xff0c;如何将做好的图批量导出jpg是一件令人头疼的问题。 今天小编就给大家分享俩个ArcGIS批量出图的工具箱&#xff0c;一个可以批量导出图层为jpg&#…

基于springboot实现中小型医院网站管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现中小型医院网站管理系统演示 摘要 本基于Spring Boot的中小型医院网站设计目标是实现用户网络预约挂号的功能&#xff0c;同时提高医院管理效率&#xff0c;更好的为广大用户服务。 本文重点阐述了中小型医院网站的开发过程&#xff0c;以实际运用为开发背…

C语言100道练习题打卡(1)

1 有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff0c;都是多少 #include<stdio.h> //有1&#xff0c;2&#xff0c;3&#xff0c;4四个数字&#xff0c;能组成多少个互不相同且不重复的三位数&#xff…

Paper Reading: MixTeacher:半监督目标检测中利用混合尺度教师挖掘有前景的标签

目录 简介目标/动机工作重点方法训练 实验总结 简介 题目&#xff1a;《MixTeacher: Mining Promising Labels with Mixed Scale Teacher for Semi-Supervised Object Detection》&#xff0c; CVPR 2023 日期&#xff1a;2023.3.16 单位&#xff1a;腾讯&#xff0c;上海交…

从零开始学GeoServer源码十四(GeoServer Cloud微服务版本初体验)

目录 快速导航前言1.GeoServer Cloud 介绍2.环境准备3.Win10 Win11安装Docker、JDK、IDEA4.安装GeoServer Cloud4.1 获取docker-compose.yml4.2 拉取镜像4.3 启动4.4 访问 5.注意事项5.1 JDK冲突问题5.2 GeoServer Cloud Config 版本问题5.3 GeoServer Cloud WebUI 404问题 6.总…