集合框架-(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.rhkb.cn/news/111761.html

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

相关文章

【第1章 数据结构概述】

目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类&#xff1a;a. 线性结构&#xff1b;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法&#xff1a;顺序存储、链接存储、索引存储、散列存储 3. …

uni-app中使用iconfont彩色图标

uni-app中使用iconfont彩色图标 大家好&#xff0c;今天我们来学习一下uni-app中使用iconfont彩色图标&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 首先&#xff0c;从iconfont官网&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己需要的图…

从零构建深度学习推理框架-11 Resnet

op和layer结构 在runtime_ir.cpp中&#xff0c;我们上一节只构建了input和output&#xff0c;对于中间layer的具体实现一直没有完成&#xff1a; for (const auto& kOperator : this->operators_) {if (kOperator->type "pnnx.Input") {this->input_o…

Soul涉赌?元宇宙“皮囊”绷不住走样的“灵魂社交”

“软色情”、“杀猪盘”之后&#xff0c;陌生人社交平台Soul又多了一张“涉赌”标签。 8月初&#xff0c;视频媒体青蜂侠Bee报道称&#xff0c;Soul平台内游戏“星际庄园”名为“种地”&#xff0c;但用户充值种“水果”、平台发起概率抽奖、奖励转手可场外变现的玩法暗藏赌博…

DNS 协议都没听过?你配做开发?

一、什么是DNS协议&#xff1f; DNS协议是一种用于将域名转换为IP地址的分布式命名系统。它通过将用户提供的域名映射到相应的IP地址&#xff0c;实现了互联网上资源的定位和访问。DNS协议采用了层次化的域名结构&#xff0c;使得域名之间可以建立逻辑上的关联。 二、DNS解析过…

新建Spring Boot项目

使用IDEA 来创建: 文件-新建-项目 填写项目元数据 选择依赖项 此处可以先选 web-spring web 关于这些依赖项&#xff0c;更多可参考&#xff1a; IDEA创建Spring boot项目时各依赖的说明&#xff08;Developer Tools篇&#xff09;[1] 项目结构介绍 展开项目&#xff0c;此时…

跨站请求伪造(CSRF)

文章目录 渗透测试漏洞原理跨站请求伪造&#xff08;CSRF&#xff09;1. CSRF概述1.1 基本概念1.1.1 关键点1.1.2 目标 1.2 CSRF场景1.2.1 银行账户转账1.2.2 构造虚假网站1.2.3 场景建模1.2.4 实验 1.3 CSRF类别1.3.1 POST方式 1.4 CSRF验证1.4.1 CSRF Poc generator 1.5 XSS与…

Python爬虫(十六)_JSON模块与JsonPath

数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;它是的人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景&#xff0c;比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不相…

Day50|动态规划part11:188.买卖股票的最佳时机IV、123. 买卖股票的最佳时机III

188. 买卖股票的最佳时机IV leetcode链接&#xff1a;188 题「买卖股票的最佳时机 IVopen in new window」 视频链接&#xff1a;动态规划来决定最佳时机&#xff0c;至多可以买卖K次&#xff01;| LeetCode&#xff1a;188.买卖股票最佳时机4 给你一个整数数组 prices 和一…

用反射实现自定义Java对象转化为json工具类

传入一个object类型的对象获取该对象的class类getFields方法获取该类的所有属性对属性进行遍历&#xff0c;并且拼接成Json格式的字符串&#xff0c;注意&#xff1a;通过属性名来推断方法名获取Method实例通过invoke方法调用 public static String objectToJsonUtil(Object o…

线程安全-搞清synchronized的真面目

多线程编程中&#xff0c;最难的地方&#xff0c;也是最重要的一个地方&#xff0c;还是一个最容易出错的地方&#xff0c;更是一个特别爱考的地方&#xff0c;就是线程安全问题。 万恶之源&#xff0c;罪魁祸首&#xff0c;多线程的抢占式执行,带来的随机性. 如果没有多线程,此…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

python遍历文件夹下的所有子文件夹,并将指定的文件复制到指定目录

python遍历文件夹下的所有子文件夹&#xff0c;并将指定的文件复制到指定目录 需求复制单个文件夹遍历所有子文件夹中的文件&#xff0c;并复制代码封装 需求 在1文件夹中有1&#xff0c;2两个文件夹 将这两个文件夹中的文件复制到 after_copy中 复制单个文件夹 # coding: ut…

【跨域异常】

想在前端使用vue获取后端接口的数据&#xff0c;但是报了跨域异常&#xff0c;如下图所示。 一种解决的方式是&#xff0c;在后端Controller接口上加上CrossOrigin&#xff0c;从后端解决跨域问题。 还要注意前端请求的url要加上协议&#xff0c;比如http://

Excel:通过Lookup函数提取指定文本关键词

函数公式&#xff1a;LOOKUP(9^9,FIND($G 2 : 2: 2:G 6 , C 2 ) , 6,C2), 6,C2),G 2 : 2: 2:G$6) 公式解释&#xff1a; lookup第一参数为9^9&#xff1a;代表的是一个极大值的数据&#xff0c;查询位置里面最接近这一个值的数据&#xff1b;lookup第二参数用find函数代替&am…

80. 删除有序数组中的重复项 II

【中等题】 题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额…

string类中的一些问题

前言&#xff1a;C中的string类是继承C语言的字符数组的字符串来实现的&#xff0c;其中包含许多C的字符串的相关知识的同时&#xff0c;也蕴含很多的类与对象的相关知识&#xff0c;在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现str…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去&#xff0c;各模块各自管理自己的版本。Android源码引用了很多开源项目&#xff0c;每一个子项目都是一个Git仓库&#xff0c;每个Git仓库都有很多分支版本&#xff0c;为了方便统…

request+python操作文件导入

业务场景&#xff1a; 通常我们需要上传文件或者导入文件如何操作呢&#xff1f; 首先通过f12或者通过抓包查到请求接口的参数&#xff0c;例如&#xff1a; 图中标注的就是我们需要的参数&#xff0c;其中 name是参数名&#xff0c;filename是文件名&#xff0c;Content-Type是…

微信小程序开发教学系列(4)- 数据绑定与事件处理

4. 数据绑定与事件处理 在微信小程序中&#xff0c;数据绑定和事件处理是非常重要的部分。数据绑定可以将数据和页面元素进行关联&#xff0c;实现数据的动态渲染&#xff1b;事件处理则是响应用户的操作&#xff0c;实现交互功能。本章节将详细介绍数据绑定和事件处理的基本原…