集合框架-(Collection/Map)

1.单列集合

1.1基础概要

集合中存储的是对象的地址信息,想要输出对象的信息,需要在具体的类中重写toString()方法
Collection代表单列集合,每个元素数据只包含一个值
在这里插入图片描述
List集合:添加的元素可以是有序、可重复、有索引ArrayList,LinkedList,有序可重复,有索引
Set集合:添加的元素无序,不重复,无索引
HashSet,无序不重复,无索引。
LinkedHashSet,有序不重复,无索引
TreeSet:按照大小默认升序,不重复,无索引
Collection<E>接口的方法能被所有单列集合所调用,详细信息参考java开发文档

Collection<String> list=new ArrayList<>();//多态
Object[] list=list.toArray();将数组集合转为对象数组
#如果想要转换为其他类型的数组
//将数组集合转换为字符串数组,前提是集合里面都是字符串数据
list.toArray(new String[list.size()]);

1.2 Collection的遍历方式

迭代器
Collection集合获取迭代器的方法
Iterator<E> iterator(),返回集合中的迭代器对象,迭代器对象默认指向当前集合的第一个元素

#iterator()
//获取迭代器对象
Collection<String> list=new ArrayList<>();
Iterator<String>=list.iterator();//迭代器对象会存储和集合一样的数据类型
//迭代器遍历集合
#boolean hasNext(),该方法用于返回迭代器中是否还有下一位,用于判断取元素越界
#E next()获取当前位置的元素,同时将迭代器指向下一位元素
while(list.hasNext)
{System.out.print(list.next());
}

实现思路,集合调用iterator()方法获取迭代器对象,然后通过迭代器内置方法,遍历数据

增强for

//可以遍历数组,也可以遍历集合
Collection<String> list=new ArrayList<>();
for(String s:list)
{
System.out.print(s)
}

lambda表达式

Collection<String> list=new ArrayList<>();
list.forEach(s->{System.out.print(s)})

1.3 List集合

特点及方法

`List<String> list=new ArrayList<>();`
`List<String> list=new LinkedList<>();`

在这里插入图片描述
遍历
1.for循环
2.迭代器
3.增强for循环
4.Lambda表达式

ArrayList
基于数组实现
特点:

  • 通过索引查询数据,查询速度较快
  • 删除效率较低,删除某个数据时,需要将数据整体前移
  • 添加效率低,在某个索引位置添加时,需要将数据整体后移,或者需要对数组扩容
  • 利用无参构造创建集合,底层会默认创建一个容量为10的数组用作数组集合,当数据存满10个时,会扩容1.5倍

LinkedList
特点:

  • 链表中的节点是独立的对象,在内存中是不连续的

  • 查询较慢,需要从头开始查找

  • 链表增删相对较快,不需要移动元素位置

  • LinkedList基于双链表实现的,双向链表即分别存储前节点和后节点,对于首尾元素增删改查的速度极快
    双链表的方法
    在这里插入图片描述
    LinkedList的使用场景
    1.设计队列
    队列频繁操作对头和队尾元素,且队列是有序的

    LinkedList<String> queue=new LinkedList<>();
    #进队,队尾进队
    queue.addLast("一号");
    queue.addLast("二号");
    queue.addLast("三号");
    #出队,对头出队
    queue.removeFirst();
    queue.removeFirst();
    

    2.设计栈

    LinkedList<String> stack=new LinkedList<>();
    //进栈
    stack.addFirst("第一颗");
    stack.addFirst("第二颗");
    stack.addFirst("第三颗");
    //出栈
    stack.removeFirst();
    

1.4 Set集合

在这里插入图片描述

hashset
特点:无序,不重复,无索引
哈希值:一个int类型的数值,java中的每个对象都有一个哈希值
哈希值的获取 public int hashCode();返回值就是哈希码,该方法由Objeact类提供
同一个对象调用hashcode方法,获取的哈希值是一样的
不同对象,哈希值一般不同,也有可能相同int数值类型表示的范围-21亿~~+21亿

hashset集合是基于哈希表实现的,哈希表是一种增删改查数据,性能都较好的数据结构

在这里插入图片描述
在这里插入图片描述
实现原理:
1.创建一个长度默认为16的数组,默认加载因子0.75
即当哈希表存储到16*0.75=12时,就需要进行扩容
jdk8之后,当链表的长度>8,数组长度>=64,自动将链表转为红黑树
红黑树
在这里插入图片描述

2.获取具体对象的哈希值
3.对哈希值按数组长度进行取余操作
4.在取余操作后,在数组下标等于余数位进行存值5.如果多个对象在同一个下标位置,则当前下标位存储方式改为链表存储,在存储前,需要对元素逐个进行判断,一样的就不保存

LinkedSet
特点:有序、不重复、无索引

  • 有序的实现是通过使用双链表机制
  • 无序:从下标0开始找,如果某个下标中有链表元素,则就必须先将该链表元素找完后,再找其他下标的元素
  • 引入双链表后,Linkedset集合为有序
    在这里插入图片描述

TreeSet
特点:排序(默认升序),不重复,无索引
排序是基于红黑树实现的

  • 对于Integer\Double类型,默认按照数值本身排序
  • 对于字符串,默认按照首字符的编号排序
  • 对于自定义对象,需要自定义排序,方法如下
    在这里插入图片描述
    总结
  • 有序、有索引、可重复,且频繁的根据索引查找数据—ArrayList,底层基于数组实现
  • 有序、可重复、有索引,且增删首位数据频率较多—LinkedList,底层基于双链表实现
  • 无序、不重复、无索引,增删改查都快—HashSet,底层基于哈希表实现
  • 有序、不重复、无索引,—LinkedHashSet,底层基于双链表实现
  • 排序、不重复、无索引,—TreeSet,底层基于红黑树实现

遍历删除时,发生异常
在这里插入图片描述

#集合遍历,根据条件删除,没有完全删除的解决方案
//for循环
public static void test5(){List<Person> people=new ArrayList<>();//多态people.add(0,new Person("赵立秋",24,"男"));people.add(1,new Person("张立秋",22,"男"));people.add(2,new Person("赵立春",18,"男"));for (int i = people.size()-1; i>=0 ; i--) {Person person = people.get(i);if (person.getName().contains("秋")){people.remove(person);}}System.out.println(people);}
//迭代器遍历Iterator<Person> iterator = people.iterator();while (iterator.hasNext()){Person next = iterator.next();if (next.getName().contains("秋")){iterator.remove(); //底层的逻辑就是i--}}System.out.println(people);}

1.5 Collectoion的其他知识

可变参数
即可选择传参也可选择不传参
特点:
1.一个形参列表中,只能有一个可变参数
2.可变参数必须放在形参列表的最后
3.可变参数在方法内部就是一个数组

public static void test(int age,int...nums)//...nums就是可变形参

Collections
不是Collection集合,而是一种操作集合的工具类
在这里插入图片描述
使用上述中的sort方法,如果参数中的集合是类对象,想要进行排序就必须在该类实现Comparable接口,指定比较规则
在这里插入图片描述

2.双列集合

map代表双列集合,每个元素包含两个值,键值对
map集合中,键不能重复,值可以
应用场景:一 一对应
在这里插入图片描述
Map集合的特点

  • HashMap:无序、不重复(键相同时,后者覆盖前者)、无索引
  • LinkedHashMap:有序(键决定)、不重复、无索引
  • TreeMap:按照大小默认升序排序(键决定),无索引,不重复

map集合的遍历方式
1.entryset的方式,进行遍历

//双列转单列集合,将键值对转换成一个整体对象,通过增强for遍历
Map<String,String> map=new HashMap<>();
Set<Map.Entry<String,String>> entry=map.entrySet();
for(Map.Entry<String,String> en:entry)
{
en.getKey();
en.getValue();
}

2.Lambda表达式遍历map集合(jdk8版本后可用)

map.forEach((k,v)->
{
System.out.print(k+"--->"+v);
}
);

Map集合遍历案例

#Map集合,模拟投票public static void test2(){List<String> list=new ArrayList<>();String [] str={"A风景区","B田园","C公园","D王府井","E万达广场"};Random random=new Random();for (int i =1; i <=35; i++) {int index = random.nextInt(5);list.add(str[index]);}Map<String,Integer> scenery=new HashMap<>();for (String i:list) {if (scenery.containsKey(i)){scenery.put(i,scenery.get(i)+1);}else{scenery.put(i,1);}}System.out.println(scenery);}

HashMap底层原理

  • HashMap和HashSet的底层原理一样,都是基于哈希表完成的
  • JDK8之前,哈希表=数组+链表
  • JDK8之后,哈希表=数组+链表+红黑树
  • 哈希表是一个增删改查数据,性能都比较好的数据结构
  • HashMap的存储原理,是用键的哈希值取余,确定存储位置的

HashMap实现键值唯一:

  • 如果键不是一个自定义类,则函数发现键值重复的时候,后者会覆盖前者
  • 如果键是一个自定义的类,那么就需要在该类中重写equals和hashcode的方法
    在这里插入图片描述

LinkedHashMap底层原理

  • 底层是基于哈希表实现的吗,每个键值对元素采用双链表机制存储
  • 有序、不重复、无索引

TreeMap

  • 排序,不重复,无索引
  • 根据键值排序,如果键值是一个类
    1.通过在该类中实现Comparable接口,重写compareTo()方法
    在这里插入图片描述
    2.在TreeMap的构造方法中,创建比较器
    在这里插入图片描述

集合嵌套

    public static void test4(){List<String> city=new ArrayList<>();Collections.addAll(city,"南充","成都","攀枝花","达州");Map<String,List<String>> map=new HashMap<>();map.put("四川",city);System.out.println(map);//{四川=[南充, 成都, 攀枝花, 达州]}}```

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

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

相关文章

_kbhit() and getch() 在小游戏中用不了。因为控制台函数,仅在控制台程序中可用

太长不看版&#xff1a; _kbhit() and getch() 包含在conio.h中。 conio是Console Input/Output&#xff08;控制台输入输出&#xff09;的简写&#xff0c;其中定义了通过控制台进行数据输入和数据输出的函数&#xff0c;主要是一些用户通过按键盘产生的对应操作&#xff0c…

ZooKeeper技术内幕

文章目录 1、系统模型1.1、数据模型1.2、节点特性1.2.1、节点类型 1.3、版本——保证分布式数据原子性操作1.4、 Watcher——数据变更的通知1.5、ACL——保障数据的安全1.5.1、权限模式&#xff1a;Scheme1.5.2、授权对象&#xff1a;ID1.5.3、权限扩展体系 2、序列化与协议2.1…

【狂神】Spring5笔记(1-9)

目录 首页&#xff1a; 1.Spring 1.1 简介 1.2 优点 2.IOC理论推导 3.IOC本质 4.HelloSpring ERROR 5.IOC创建对象方式 5.1、无参构造 这个是默认的 5.2、有参构造 6.Spring配置说明 6.1、别名 6.2、Bean的配置 6.3、import 7.DL依赖注入环境 7.1 构造器注入 …

Pydantic 学习随笔

这里是零散的记录一些学习过程中随机的理解&#xff0c;因此这里的记录不成体系。如果是想学习 Pydantic 建议看官方文档&#xff0c;写的很详细并且成体系。如果有问题需要交流&#xff0c;欢迎私信或者评论。 siwa 报 500 Pydantic 可以和 siwa 结合使用&#xff0c;这样既…

hyperf 十五 验证器

官方文档&#xff1a;Hyperf 验证器报错需要配合多语言使用&#xff0c;创建配置自动生成对应的语言文件。 一 安装 composer require hyperf/validation:v2.2.33 composer require hyperf/translation:v2.2.33php bin/hyperf.php vendor:publish hyperf/translation php bi…

React和Redux中的不变性

https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/ 一、不变性和副作用 1.不变&#xff1a;不断创造新值来替换旧值 2.不变性规则&#xff1a; &#xff08;1&#xff09;当给定相同的输入时&#xff0c;纯函数必须始终返回相同的值 &#xff08;2&#xff0…

如何利用Python代码优雅的进行文件下载

如何利用Python代码优雅的进行文件下载 一、什么是wget&#xff1f;二、使用wget.exe客户端进行文件下载三、使用Python脚本进行文件下载 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、什么是wget&#xff1f;…

JavaWeb_LeadNews_Day9-Redis实现用户行为

JavaWeb_LeadNews_Day9-Redis实现用户行为 网关配置点赞阅读不喜欢关注收藏文章详情-行为数据回显来源Gitee 网关配置 nacos: leadnews-app-gateway # 用户行为微服务 - id: leadnews-behavioruri: lb://leadnews-behaviorpredicates:- Path/behavior/**filters:- StripPrefi…

yolov3

yolov1 传统的算法 最主要的是先猜很多候选框&#xff0c;然后使用特征工程来提取特征&#xff08;特征向量&#xff09;,最后使用传统的机器学习工具进行训练。然而复杂的过程可能会导致引入大量的噪声&#xff0c;丢失很多信息。 从传统的可以总结出目标检测可以分为两个阶…

Java 读取TIFF JPEG GIF PNG PDF

Java 读取TIFF JPEG GIF PNG PDF 本文解决方法基于开源 tesseract 下载适合自己系统版本的tesseract &#xff0c;官网链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 下载之后安装&#xff0c;安装的时候选择选择语言包&#xff0c;我选择了中文和英文 3.…

提高Python并发性能 - asyncio/aiohttp介绍

在进行大规模数据采集时&#xff0c;如何提高Python爬虫的并发性能是一个关键问题。本文将向您介绍使用asyncio和aiohttp库实现异步网络请求的方法&#xff0c;并通过具体结果和结论展示它们对于优化爬虫效率所带来的效果。 1. 什么是异步编程&#xff1f; 异步编程是一种非阻…

vue使用打印组件print-js

项目场景&#xff1a; 由于甲方要求&#xff0c;项目需要打印二维码标签&#xff0c;故开发此功能 开发流程 安装包&#xff1a;npm install print-js --saveprint-js的使用 <template><div id"print" ref"print" ><p>打印内容<p&…

树的介绍(C语言版)

前言 在数据结构中树是一种很重要的数据结构&#xff0c;很多其他的数据结构和算法都是通过树衍生出来的&#xff0c;比如&#xff1a;堆&#xff0c;AVL树&#xff0c;红黑色等本质上都是一棵树&#xff0c;他们只是树的一种特殊结构&#xff0c;还有其他比如linux系统的文件系…

CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置

一、设置文件显示和搜索过滤步骤 为了提高搜索效率以及文件列表中隐藏不需要显示的文件&#xff0c; VS Code 需要设置排除目录用于过滤。 比如 cocoscreator 中&#xff0c;编辑器运行时会自动生成一些目录&#xff1a;build、temp、library&#xff0c; 所以应该在搜索中排除…

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期&#xff0c;714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接 视频讲解 给定一个整数数组prices&#xff0c;其中第 pric…

Mysql-索引查询相关

一、单表查询 1.1 二级索引为null 不论是普通的二级索引&#xff0c;还是唯一二级索引&#xff0c;它们的索引列对包含 NULL 值的数量并不限制&#xff0c;所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法&#xff0c;而不是 const 的访问方法 1.2 c…

深入探索PHP编程:连接数据库的完整指南

深入探索PHP编程&#xff1a;连接数据库的完整指南 在现代Web开发中&#xff0c;与数据库进行交互是不可或缺的一部分。PHP作为一种强大的服务器端编程语言&#xff0c;提供了丰富的工具来连接和操作各种数据库系统。本篇教程将带您了解如何在PHP中连接数据库&#xff0c;执行…

并发编程的故事——并发之共享模型

并发之共享模型 文章目录 并发之共享模型一、多线程带来的共享问题二、解决方案三、方法中的synchronize四、变量的线程安全分析五、习题六、Monitor七、synchronize优化八、wait和notify九、sleep和wait十、park和unpark十一、重新理解线程状态十二、多把锁十三、ReentrantLoc…

Window11-Ubuntu双系统安装

一、制作Ubuntu系统盘 1.下载Ubuntu镜像源 阿里云开源镜像站&#xff1a;https://mirrors.aliyun.com/ubuntu-releases/ 清华大学开源软件镜像网站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 选择想要的版本下载&#xff0c;我用的是20.04版本。 2…

关于类和接口

类和接口的区别&#xff0c;去除语法层面&#xff0c;谈谈编程层面的意义。 设计原则SOLID&#xff1a; S&#xff1a;单一职责(SRP)&#xff0c;Single Responsibility Principle O&#xff1a;开-闭原则(OCP)&#xff0c;Open-Closed Principle L&#xff1a;里氏替换(LSP)&…