集合的进阶
不可变集合
-
创建不可变的集合
-
在创建了之后集合的长度内容都不可以变化
-
-
静态集合的创建在list ,set ,map接口当中都可以获取不可变集合
方法名称 | 说明 |
---|---|
static list of(E …elements) | 创建一个具有指定元素集合list集合对象 |
staticlist of(E…elements) | 创建一个具有指定元素的set集合 |
static<k,v> Map<k,v> of(E…elements) | 创建一个具有指定元素的Map集合 |
-
这个集合是不能删除和修改
-
List集合
/*不能添加修改操作*/
List<String> list = List.of("lishi", "changff", "zhangshan", "wangshang");list.remove("lishi");list.add("shuxili");list.set(0,"bbbb");
- set集合
- 注意事项:信息不能重复
package ImmutableDemo;import java.util.Iterator;
import java.util.Set;public class Demo2 {public static void main(String[] args) {Set<String> s=Set.of("lishi", "changff", "zhangshan", "wangshang","dkjkjf");Iterator<String> it = s.iterator();while (it.hasNext() ) {System.out.println(it.next());}System.out.println("---------------");System.out.println("---------------");
// s.remove("lishi");
// s.add("shuxili");}
}
- map集合
- 注意事项:键值对信息不能重复
package ImmutableDemo;import java.util.Map;
import java.util.Set;public class Demo3 {public static void main(String[] args) {Map<String, String> mapDeom = Map.of("南京", "1000", "北京", "10000", "上海", "8000");Set<String> keySet = mapDeom.keySet();for (String s : keySet) {System.out.println(s);System.out.println(mapDeom.get(s));}System.out.println("---------");Set<Map.Entry<String, String>> entries = mapDeom.entrySet();for (Map.Entry<String, String> entry : entries) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}
- Map
由于map集合的特殊,还有一种方法为Map.ofEntries( )方法可以传递多个键值对 对象
package ImmutableDemo;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo4 {public static void main(String[] args) {HashMap<String,String> h =new HashMap<>();h.put("aaa","111");h.put("bbb","222");h.put("ccc","333");h.put("ddd","444");h.put("eee","555");/*先获取键值对,对像*/Set<Map.Entry<String, String>> entries = h.entrySet();Map.Entry[] array = entries.toArray(new Map.Entry[0]);/*先将键值对对象转化为数组,0长度不会影响,在底层会自动比较,然后转成集合的长度*//*创建不可变集合*/Map map = Map.ofEntries(array);/*可变集合底层是一个数组,可以将数组直接传过去*/
// map.put("fff","777");
// map.remove("aaa");/*简写*/Map<Object, Object> map1 = Map.ofEntries(h.entrySet().toArray(new Map.Entry[0]));}
}
总结:
-
特点:
定义完成后不可以进行增删改
-
如何创建不可变集合
- 三种方式的细节
Stream流:
-
思想:工厂流水线,每个负责一项功能,结合lambda表达式来简化对数组的操作
-
Stream流的使用步骤:
1.得到一条Stream流,并添加数据
2.使用中间方法对流水线进行操作
3.使用终结方法结束对Stream的操作例如 sout获取方法 方法名 说明 单列集合 default Stream stream() Collection 中的默认方法 双列集合 无 无法直接使用stream流 数组 Public static StramStream(T[] array) Arrays工具类中的静态方法调用 一堆零散数据 public staticStream of(T…value) Stream接口中的静态方法 -
单列集合
public static void main(String[] args) {/*单列集合直接调用,list是collections的实现类*/ArrayList<String> list =new ArrayList<>();Collections.addAll(list,"A","B","C","E","F","G");list.stream().forEach(s -> System.out.println(s ));}
- 双列集合
注意事项:不能直接使用,必须转化为单列结合最后(keyset,entery)
- 双列集合
public static void main(String[] args) {HashMap<String,Integer> ha =new HashMap<>();ha.put("aaa",1);ha.put("bbb",2);ha.put("ccc",3);ha.put("ddd",4);ha.put("eee",5);/*获取键值 */ha.keySet().stream().forEach(s -> System.out.println(s));System.out.println();/*获取键值对 对象,*/ha.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));}
-
数组
注意事项:不能直接使用需要借助工具类arrays中的stream流
/*数组*/public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};String [] st ={"aaa","bbb","ccc"};/*获取stream流*/Arrays.stream(arr).forEach(s-> System.out.println(s));System.out.println();Arrays.stream(st).forEach(s1 -> System.out.println(s1));}
-
零散数据
注意事项:数据的类型必须一致,在添加引用类型的数组是可以直接使用,但是基本数据类型的数组是不能使用的会吧整个数组当成一个元素直接传递到steam流中public static void main(String[] args) {Stream.of(1,2,3,4,5,6,7,8,9).forEach(s-> System.out.println(s));}
-
stream流中的中间方法:
- Filter 过滤
注意事项:stream流在使用一次后就自动关闭,不能在下面接着使用,建议链式编程
在stream流中修改了数据,原来集合里面的数据不会发生改变
ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "aaa", "bbb", "ccc", "ddd", "eee");list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {/*true:留下 false:舍弃*/return s.startsWith("a");}}).forEach(s -> System.out.println(s));/*简化*/list.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));
-
Limit 获取前几个元素,limit(个数)
/*limit获取前几元素,不是索引是元素*/list.stream().limit(4).forEach(s -> System.out.println(s));
-
skip 跳过前几个元素,skip(个数)
/*skip跳过前几个元素*/list.stream().skip(2).forEach(s -> System.out.println(s));
练习:
/*练习获取其中3-4*/list.stream().limit(4).skip(2).forEach(s -> System.out.println(s));System.out.println();list.stream().skip(2).limit(2).forEach(s -> System.out.println(s));System.out.println( );
-
distinct 去重复,在底层是hashset去重复
/*去重复*/list1.stream().distinct().forEach(s -> System.out.println(s));/*引用数据类型可以直接,自定义的对象需要重写hascode和equales方法*/
-
Concat 流合并
**注意事项:**类型一致,不会提升类型,不一致会提升到俩流的父类,不能使用单独流的特有功能
-
/*流合并,类型一致,不会提升类型,不一致会提升到俩流的父类,不能使用单独流的特有功能*/Stream.concat(list1.stream().distinct(),list.stream()).forEach(s -> System.out.println(s));
Map 流的转换:
/*流的转换*/list2.stream().map(new Function<String, Integer>() {/*string表示流里面原来就有的数据* integer表示的是要转换了之后的类型*/@Overridepublic Integer apply(String s) {String[] split = s.split("-");/*切割方法split*/String s1 = split[1];int i = Integer.parseInt(s1);/*integer中的转换方法*/return i;}}).forEach(s -> System.out.println(s));System.out.println("================================");/*简化*/list2.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
终结方法:
- 遍历
/*遍历方式*/list2.stream().forEach(s -> System.out.println(s));
-
统计
/*将Stream流中的数据进行统计*/System.out.println(list2.stream().distinct().count());
-
收集流中的数据放到数组中
String[] array = list2.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(array));/*简化*/String[] array1 = list2.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(array));
-
收集流中的数据放到集合里面
注意事项:
lis集合是不会去重复的
set集合是会去重复的
map里面的键值对不能重复
/*list*/List<String> collect = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toList());System.out.println(collect);/*set*/Set<String> collect1 = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toSet());System.out.println(collect1);/*迭代器遍历*/Iterator<String> iterator = collect.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}/*增强for*/for (String s : collect) {System.out.println(s);}/*foreach*/collect.forEach((s)-> { System.out.println(s); });/*收集到map集合当中注意键值对不能重复*/Map<String, Integer> mapcollect = list2.stream().filter(s -> "男".equals(s.split("-")[2]))/*在map集合里面要传递2个数据,键的获取规则,值的获取规则*//*在键或者值里面有2个类型第一个表示流里面的类型,第二个表示键或者值里面的类型,他们是交叉对应的*/.collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[1]);}}));/*简化*/Map<String, Integer> mapcollect2 = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[1])));System.out.println(mapcollect2);System.out.println(mapcollect);
总结:
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/76357db66c06e80aa7f8ec94c1e957e6.png)
集合的进阶
不可变集合 创建不可变的集合 在创建了之后集合的长度内容都不可以变化 静态集合的创建在list ,set ,map接口当中都可以获取不可变集合 方法名称说明static list of(E …elements)创建一个具有指定元素集合list集合对象staticlist of(E…elements)创…...
![](https://img-blog.csdnimg.cn/956bd04a548b4ba5a7e90f787282efd2.gif#pic_center)
【LeetCode刷题(数据结构与算法)】:数据结构中的常用排序实现数组的升序排列
现在我先将各大排序的动图和思路以及代码呈现给大家 插入排序 直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个…...
![](https://img-blog.csdnimg.cn/6c153f676f594765bb539215ef043af9.png)
【HTML+CSS】零碎知识点
公告滚动条 <!DOCTYPE html> <html><head><title>动态粘性导航栏</title><style>.container {background: #00aeec;overflow: hidden;padding: 20px 0;}.title {float: left;font-size: 20px;font-weight: normal;margin: 0;margin-left:…...
![](https://img-blog.csdnimg.cn/62de859db1d64e5fb6f1729229d770cd.png)
嵌入式开发学习之STM32F407串口(USART)收发数据(三)
嵌入式开发学习之STM32F407串口(USART)收发数据(三) 开发涉及工具一、选定所使用的串口二、配置串口1.配置串口的I/O2.配置串口参数属性3.配置串口中断4.串口中断在哪里处理5.串口如何发送字符串 三、封装串口配置库文件1.创建头文…...
![](https://img-blog.csdnimg.cn/41110d9823c8426d9d31f416a4b7ed0a.png)
python:talib.BBANDS 画股价-布林线图
python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…...
![](https://www.ngui.cc/images/no-images.jpg)
ESP32网络开发实例-自定义主机名称
自定义主机名称 文章目录 自定义主机名称1、软件准备2、硬件准备3、代码实现ESP32 的默认主机名是 expressif。 但是,如果正在使用多个 ESP32 设备,并且在某些时候希望在软接入点模式下使用它们时通过名称来区分设备。 例如,在基于物联网的项目中有多个节点,例如温度、湿度…...
![](https://img-blog.csdnimg.cn/7fbeb5170a0f454c8005b378f10e590d.png)
【ELK 使用指南 3】Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构(附部署实例)
EFLKK 一、Zookeeper1.1 简介1.2 zookeeper的作用1.3 Zookeeper的特点1.5 Zookeeper的数据结构1.6 Zookeeper的应用场景1.7 Zookeeper的选举机制(重要)1.7.1 第一次启动时1.7.2 非第一次启动时 二、Zookeeper集群部署2.1 安装前准备2.2 安装 ZookeeperSt…...
![](https://img-blog.csdnimg.cn/9280157d0a9f418e9be2c86fc62180ed.png)
手写redux的connect方法, 使用了subscribe获取最新数据
一. 公共方法文件 1. connect文件 import React, { useState } from "react"; import MyContext from "./MyContext"; import _ from "lodash";// 模拟react-redux的 connect高阶函数 const connect (mapStateToProps, mapDispatchToProps) &…...
![](https://img-blog.csdnimg.cn/aa6028a8066940169daf84668c8cc8c6.png)
数据结构--B树
目录 回顾二叉查找树 如何保证查找效率 B树的定义 提炼 B树的插入和删除 概括B树的插入方法如下 B树的删除 导致删除时,结点不满足关键字的个数范围时(需要借) 如果兄弟不够借,需要合体 回顾B树的删除 B树 B树的查找 …...
![](https://img-blog.csdnimg.cn/b9a9a3c469ff43c8a799e60c2e9c532b.gif#pic_center)
【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
![](https://img-blog.csdnimg.cn/024c21a8374947a48b5767116775a999.png)
嵌入式养成计划-43----QT QMainWindow中常用类的使用--ui界面文件--资源文件的添加--信号与槽
一百零九、QMainWindow中常用类的使用 109.1 菜单栏 QMenuBar 菜单栏 QMenuBar 最多只能有一个 109.2 工具栏 QToolBar 工具栏 QToolBar 可以有多个 109.3 状态栏QStatusBar 状态栏 QStatusBar 最多只能有一个 109.4 浮动窗口QDockWidget 浮动窗口 可以有多个 109.5 代…...
![](https://www.ngui.cc/images/no-images.jpg)
【Yarn】清除Yarn的缓存,更新Yarn本身、更新项目的依赖项
要清除Yarn的缓存,可以运行以下命令: yarn cache clean这将清除Yarn的缓存目录。 要更新Yarn本身,可以运行以下命令: yarn self-update这将下载并安装最新版本的Yarn。 如果要更新项目的依赖项,可以运行以下命令&a…...
![](https://www.ngui.cc/images/no-images.jpg)
点云从入门到精通技术详解100篇-雨雾环境下多传感器融合SLAM方法(续)
目录 4 基于球面投影的激光视觉融合里程计 4.1 引言 4.2 视觉惯性里程计 4.2.1特征点提取与匹配...
![](https://www.ngui.cc/images/no-images.jpg)
解决GET请求入参@NotNull验证不生效问题
一、问题 get请求NotNull验证不生效 二、解决方案 两个步骤: 在该方法的controller类上加Validated;在参数面前加NotNull; 三、其他注解 //被注释的元素必须为null Null //被注释的元素不能为null NotNull //被注释的元素必须为true Ass…...
![](https://img-blog.csdnimg.cn/4a3d2dc909d846f3ade748eb38789629.png#pic_center)
《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)
文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求…...
![](https://img-blog.csdnimg.cn/9c004d29752c4ed3aa03117fda615a61.png)
环境变量【使用命令行参数引出环境变量】
前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…...
![](https://img-blog.csdnimg.cn/ee6246a97e76456ea2a96231b3fde401.png)
【Java 进阶篇】JavaScript BOM History 详解
当用户浏览网页时,可以使用JavaScript的BOM (Browser Object Model)中的History对象来访问浏览器的历史记录。这个对象允许您在不更改页面的情况下导航到不同的历史记录项,或者查看有关用户访问过的页面的信息。 在本篇博客中,我们将围绕Jav…...
![](https://img-blog.csdnimg.cn/e8d88ea3d6ae4ea8af86359785258466.png)
【计算机网络】https协议
文章目录 1 :peach:基本概念:peach:1.1 :apple:什么是HTTPS?:apple:1.2 :apple:什么是加密?:apple:1.3 :apple:常见的加密方式:apple:1.3.1 :lemon:对称加密:lemon:1.3.2 :lemon:⾮对称加密:lemon: 1.4 :lemon:数据指纹:lemon: 2 :peach:HTTPS的⼯作过程…...
![](https://img-blog.csdnimg.cn/9fe035533f174b828ded7fb672e45dfe.png)
React之受控组件和非受控组件以及高阶组件
一、受控组件 受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据 举个简单的例子: class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…...
![](https://img-blog.csdnimg.cn/img_convert/6f9cee7e33cc1064306fe6a0994a7a9e.jpeg)
中国移动集采120万部,助推国产5G赶超iPhone15
近期媒体纷纷传出消息指中国移动将大规模集采,预计将采购国产5G手机120万台,加上另外两家运营商的集采数量,估计集采数量可能达到300万部,如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市,获益…...
![](https://img-blog.csdnimg.cn/e1ab2811ca2d45a79a5f71674cde12ff.png)
华为云HECS服务器下docker可视化(portainer)
一、docker安装 华为云HECS安装docker-CSDN博客 二、portainer安装 portainer地址:Portainer: Docker and Kubernetes Management Platform 当前portainer分CE(开源版) 和 BE(商业版),用CE即可 1 创建…...
![](https://img-blog.csdnimg.cn/e5ade96bd11149ed8c8fe2b90bbd4faa.png)
postman发送soap报文示例
一、soap简介 soap是一种基于XML的协议 二、postman发送soap请求 1、发送post请求,url: https://www.dataaccess.com/webservicesserver/NumberConversion.wso 2、headers设置,添加Content-Type,值为text/xml 添加SOAP…...
![](https://img-blog.csdnimg.cn/6832125cb64b446baeab040939f0ae62.png)
力扣-python-两数之和
题解: class Solution(object):def twoSum(self, nums, target):# 遍历列表for i in range(len(nums)):# 计算需要找到的下一个目标数字res target-nums[i]# 遍历剩下的元素,查找是否存在该数字if res in nums[i1:]:# 若存在,返回答案。这里…...
![](https://img-blog.csdnimg.cn/18b6f18730bf4f5dbf764bc405a1aea6.jpeg)
算水质TDS加温度补偿
先上图,就图里这款水质检测,用树莓派3/4的话,要配个温度检测作为温度校正,以及一个adc 元器件。我选ds18b20和ads1115。 再把模拟数据计算过程放一下: 温度检测元器件在农历钟那里提过,就是同款。此处先测个…...
![](https://img-blog.csdnimg.cn/f403fd9986e2451593e1149d640d1252.png)
wps/word 如何让表格的标题和表格名称文本(表1-1 xxx)跨页显示(已解决)
第一步: 打开wps 创建一个跨页的表格表格,如下图 第二步 大家都知道 表格标题跨页 就是1)在菜单表格工具 点击重复标题 或者 2)表格属性--》行--》在各页顶端以标题行形式出现,详细如下图。 1) 第一…...
![](https://img-blog.csdnimg.cn/a24e92fcc20647688d7799a8a6c8fb0a.png)
攻防世界web篇-PHP2
直接点击进入到http网页中,会得到这样一个界面 这里,我最开始使用了burp什么包也没有抓到,然后接着又用nikto进行探测,得到的只有两个目录,当时两个目录打开后,一个是fond界面,一个是这个网页的…...
![](https://www.ngui.cc/images/no-images.jpg)
Kotlin中的步长
步长是 Kotlin 中用于迭代区间或集合时控制迭代步进的概念。在 Kotlin 中,我们可以使用 step 关键字来指定迭代时的步长。 在 Kotlin 中,有多种方式可以定义一个区间(Range)。我们将通过以下示例代码来展示不同类型的区间以及如何…...
![](https://www.ngui.cc/images/no-images.jpg)
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...
![](https://img-blog.csdnimg.cn/9343cdd5e65840d8b5eab73380cc8c56.png#pic_center)
通过SPI传输BMI160数据到nrf528xx
目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系 在完成代码之前,我们手里会有两份代码,一份是nrf528xx的SDK,一份是BMI160传感器的SDK,怎么利用SDK完成我们的需求呢?首先我们要搞明白,…...
![](https://img-blog.csdnimg.cn/bb00b8ed20ef41a49c701e88b990d84c.png)
MAYA教程之建模基础命令介绍
基础命令 视图相关操作 旋转视图 : ALT 鼠标左键平移视图 : ALT 鼠标中键缩放视图 : 滚动鼠标滚轮 或者 ALT 鼠标右键切换视图 : 空格键回到模型 : F 视图状态 选择状态 : Q移动状态 : W旋转状态 : E缩放状态 : R 视图显示 正常显示 : 1正常圆滑同时显示 : 2圆滑显示 …...
![](/images/no-images.jpg)
wordpress 图片插件/seo是啥
history对象保存用户上网的历史记录,从窗口被打开的那一刻算起。历史记录对象是窗口对象下的一个子对象,它实际上是一个对象数组,包含了一系列的用户访问过的URL地址。保存着用户的上网历史记录,用于浏览器工具栏中的"Back t…...
![](https://img-blog.csdnimg.cn/3ffac7632ff2433abc29c8c0c85b449b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ29kZVN0YXJy,size_20,color_FFFFFF,t_70,g_se,x_16)
网络优化公司网站代码/电商运营助理
文章目录1. 安装2. 插桩3. Quick Startcorpus基本使用输出多线程字典崩溃分析4. 用户手册如何查看结果如何配置(环境变量)多线程5. Using ASAN with AFL6. TipsFuzz优化7. More about AFLAFL原理8. Demo9. 其它参考资料官方文档:https://afl-…...
![](/images/no-images.jpg)
网站建设的相关知识/seo咨询茂名
堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中…...
![](/images/no-images.jpg)
导入表格数据做地图网站/网站推广哪家好
---------------------------------------------------------------------------------------- 转载于:https://www.cnblogs.com/xioxu/archive/2008/09/23/1297518.html...
![](/images/no-images.jpg)
wordpress添加富强民主/网络热词缩写
首先根据你的问题,先实际运行一下代码,如下:通过代码结果,我们看到两者都是True,所以是相等的为什么相等呢?此处涉及到运算优先级的问题1、首先比较容易理解的是当x是空字符串,也就是什么都没有…...
![](/images/no-images.jpg)
wordpress 主页幻灯片/做网站多少钱一年
本发明涉及一种基于Kaa服务的跨平台日志采集方法。背景技术:物联网是在互联网基础上的延伸和扩展的网络,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信,也就是物物相息,随着物联网技术快速发展&#x…...