当前位置: 首页 > news >正文

Java 中FastJson的使用【吃透FastJson】

如果不了解JSON格式,建议先看下:JSON数据格式【学习记录】

JSON序列化、反序列化JavaBean的框架有很多,最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等,下面我们主要来熟悉一下:Java语言中FastJson的使用。

FastJson

FastJson是由阿里巴巴工程师基于Java开发的一款Json解析器和生成器,可用于将Java对象转换为其JSON表示形式,它还可以用于将JSON字符串转换为等效的Java对象。FastJson可以处理任意Java对象,包括没有源代码的预先存在的对象。

FastJson使用十分简便,我们只需要在Maven工程的pom文件中引入以下依赖即可:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version>
</dependency>

FastJson API的入口是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

API测试

我们已经在项目中引入了FastJson的依赖,我们再创建一个用户类用于测试:

package com.test.json;import lombok.Data;@Data
public class User {private Integer id;private String name;private String sex;private Integer age;public User(Builder builder) {this.id = builder.id;this.name = builder.name;this.sex = builder.sex;this.age = builder.age;}public static Builder builder() {return new Builder();}public static class Builder {private Integer id;private String name;private String sex;private Integer age;public Builder name(String name) {this.name = name;return this;}public Builder sex(String sex) {this.sex = sex;return this;}public Builder age(int age) {this.age = age;return this;}public Builder id(int id) {this.id = id;return this;}public User build() {return new User(this);}}
}

一、序列化

序列化就是将JavaBean序列化为JSON字符串,下面我们来看下FastJson常见的序列化方法。

下面序列化相关方法都有统一的返回值类型String。

1)toJsonString(Object o);

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();System.out.println(JSON.toJSONString(user));
}
{"age":23,"id":1,"name":"张三","sex":"男"}

我们通过传入一个对象,便可以将对象转成JSON字符串,这里我们传入的不仅仅是JavaBean还可以是一个Map对象,传入Map对象我们同样也可以取到一个JSON字符串。

public static void main(String[] args) {Map<String, Object> userMap = new HashMap<>();userMap.put("id", 1);userMap.put("name", "张三");userMap.put("sex", "男");userMap.put("age", 23);System.out.println(JSON.toJSONString(userMap));
}
{"age":23,"id":1,"name":"张三","sex":"男"}

List对象也很适用,结果是一个标准的JSONArray的字符串。

public static void main(String[] args) {User zhangsan = User.build().id(1).name("张三").sex("男").age(23).build();User lisi = User.build().id(2).name("李四").sex("女").age(18).build();List<User> userList = new ArrayList<>();userList.add(zhangsan);userList.add(lisi);System.out.println(JSON.toJSONString(userList));
}
[{"id":1,"name":"张三","sex":"男","age":23},{"id":2,"name":"李四","sex":"女","age":18}]

2)toJSONString(Object o, boolean prettyFormat);

如果说 toJSONString(Object o); 的输出结果只有单调的一行让你看起来有点吃力,那么我们可以使用 toJSONString(Object o, boolean prettyFormat); 来让输出结果看起来舒服点。

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();System.out.println(JSON.toJSONString(user, true));
}
{"age":23,"id":1,"name":"张三","sex":"男"
}

通过JSON自带的格式化,让输出结果看起来更加清晰,真是贴心~

3)JSON.toJSONString(Object object, SerializerFeature… features);

我们可以看到这个方法里面有个参数SerializerFeature...,可能感到有点陌生,我们先来看下什么是 SerializerFeature ,通过源码可以发现 SerializerFeature 原来是个枚举类:

在这里插入图片描述

源码中都被 @deprecated 注释的实例说明已经废弃了,那有哪些是我们平时经常用到的呢:

对象描述
SerializerFeature.UseSingleQuotes使用单引号而不是双引号,默认为false
SerializerFeature.PrettyFormat结果是否格式化,默认为false
SerializerFeature.WriteDateUseDateFormat如果时间是date、时间戳类型,按照这种格式"yyyy-MM-dd HH:mm"初始化时间
SerializerFeature.WriteMapNullValue是否输出值为null的字段,默认为false
SerializerFeature.WriteClassName序列化时写入类型信息,默认为false

使用案例:

  • SerializerFeature.UseSingleQuotes

使用单引号而不是使用双引号,默认为false。

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();System.out.println(JSON.toJSONString(user, SerializerFeature.UseSingleQuotes));
}
{'age':23,'id':1,'name':'张三','sex':'男'}
  • SerializerFeature.PrettyFormat

结果是否格式化,默认为false。

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();System.out.println(JSON.toJSONString(user));System.out.println("===============");System.out.println(JSON.toJSONString(user, SerializerFeature.PrettyFormat));
}
{"age":23,"id":1,"name":"张三","sex":"男"}
===============
{"age":23,"id":1,"name":"张三","sex":"男"
}
  • SerializerFeature.WriteDateUseDateFormat

如果时间是Date、时间戳类型,按照这种格式初始化时间"yyyy-MM-dd HH:mm"。

public static void main(String[] args) {System.out.println(JSON.toJSONString(new Date()));System.out.println("===============");System.out.println(JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat));
}
1676427576691
===============
"2023-02-15 10:19:37"

通过这种方式我们将日期输出成了固定的格式:yyyy-MM-dd HH:mm,有时候我们不想得到这种格式那该怎么办?通过下面方法支持自定义时间格式:(注意方法不要用错)

4)toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature… features);

public static void main(String[] args) {System.out.println(JSON.toJSONString(new Date()));System.out.println("===============");System.out.println(JSON.toJSONStringWithDateFormat(new Date(), "HH:mm:ss"));
}
1676428350771
===============
"10:32:30"

下面我们接着看SerializerFeature枚举类的其他用法。

  • SerializerFeature.WriteMapNullValue

是否输出值为null的字段,默认为false。

这个有什么用处呢?我们应该很清楚开发规范中鼓励用JavaBean传递参数,尽量减少Map传递参数,因为Map相当于一个黑盒,对于使用者来说根本不知道里面存在哪些字段,而对于创建者来说估计也时常会忘记里面存在哪些字段,为了解决这个痛,JSON也推出了解决方法:

public static void main(String[] args) {Map<String, Object> dataMap = new HashMap<>();dataMap.put("name", null);dataMap.put("age", 23);System.out.println(JSON.toJSONString(dataMap));System.out.println("===============");System.out.println(JSON.toJSONString(dataMap, SerializerFeature.WriteMapNullValue));
}
{"age":23}
===============
{"name":null,"age":23}

通过普通方式的 toJSONString() 方法,空值仿佛被吃掉了,这很可能会成为一个开发灾难!

  • SerializerFeature.WriteClassName

序列化时写入类信息,默认为false。这个方法可以在反序列化的时候用到,用法如下:

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();System.out.println(JSON.toJSONString(user, SerializerFeature.WriteClssName));
}
{"@type":"com.test.json.User","age":23,"id":1,"name":"张三","sex":"男"}

通过这样我们可以看到我们序列化的对象是什么类型的。

上面这些便是toJSONString的扩展用法,上面说到的是序列化,那么对应的便是反序列化。

二、反序列化

反序列化就是把JSON格式的字符串转换为JavaBean对象。

1)JSONObject parseObject(String text);

public static void main(String[] args){String jsonStr = "{'age':23,'id':1,'name':'张三','sex':'男'}";JSONObject jsonObject = JSON.parseObject(jsonStr);System.out.println(jsonObject.get("name"));
}
张三

用法十分简单,可以将一个标准的JSON字符串转为一个JSONObject对象,由于JSONObject类实现了Map接口,因此我们可以通过get()来获取到值。

我们上述已经说过Map的致命不足,所以我们更希望能得到一个JavaBean对象。

2)<T> T parseObject(String text, Class<T> clazz);

我们通过传入我们想要转换的对象类型,就可以得到我们想要的JavaBean。

public static void main(String[] args){String jsonStr = "{'age':23,'id':1,'name':'张三','sex':'男'}";User user = JSON.parseObject(jsonStr, User.class);System.out.println(user.getName());
}
张三

除了基本反序列化之外,还有一种泛型反序列化可提供使用。

3)<T> T parseObject(String text, TypeReference<T> type, Feature... features);

通过泛型,我们就可以不用传入一个Class对象,而直接获取到我们的JavaBean。

public static void main(String[] args){String jsonStr = "{'age':23,'id':1,'name':'张三','sex':'男'}";User user = JSON.parseObject(jsonStr, new TypeReference<User>(){});System.out.println(user.getName());
}
张三

FastJson序列化还有一个用处那便是进行深克隆。软件设计模式中:原型模式涉及到的深克隆和浅克隆。

浅克隆的实现方式十分简单,我们只需要实现Cloneable接口,然后重写clone()方法:

@Data
class Person {private String name;
}@Data
class NiceCard implements Cloneable {public Person person;public void award() {System.out.println(this.person.getName() + "获得好人卡一张");}public NiceCard clone() throws CloneNotSupportedException {return (NiceCard)super.clone();}
}public class TestClient {public static void main(String[] args) {NiceCard niceCard = new NiceCard();Person person = new Person();person.setName("小李");niceCard.setPerson(person);NiceCard cloneCard = niceCard.clone();Persson clonePerson = cloneCard.getPerson();clonePerson.setName("小王");niceCard.award();cloneCard.award();System.out.println(person == clonePerson);}
}
小王获得一张好人卡
小王获得一张好人卡
true

结果中我们可以看到,好人卡都是属于小王的,这就是浅克隆的弊端了。

我们要想实现深克隆有许多种方式:

  • 手动为引用属性赋值
  • 借助FastJson
  • 使用Java流的序列化对象

方法有很多,我们重点看下FastJson的实现方式:

public static void main(String[] args) {NiceCard niceCard = new NiceCard();Person person = new Person();person.setName("小李");niceCard.setPerson(person);//借助FastJsonNiceCard cloneCard = JSON.parseObject(JSON.toJSONString(niceCard), NiceCard.class);Person clonePerson = cloneCard.getPerson();clonePerson.setName("小王");niceCard.award();cloneCard.award();System.out.println(person == clonePerson);
}
小李获得好人卡一张
小王获得好人卡一张
false

通过FastJson反序列化,我们得到的两个对象实际上是不同的,这也很方便的实现了深克隆。

4)<T> List<T> parseArray(String text, Class<T> clazz);

这是将一个JSON字符串转为JSONArray的方法。

public static void main(String[] args) {String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"sex\":\"男\",\"age\":23},{\"id\":2,\"name\":\"李四\",\"sex\":\"女\",\"age\":18}]";List<User> userList = JSON.parseArray(jsonStr, User.class);userList.forEach(System.out::println);
}
User(id=1, name=张三, sex=男, age=23)
User(id=2, name=李四, sex=女, age=18)

同样我们也可以通过使用泛型序列化来实现同样的功能:

5)List<Object> parseArray(String text, Type[] types);

public static void main(String[] args) {String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"sex\":\"男\",\"age\":23},{\"id\":2,\"name\":\"李四\",\"sex\":\"女\",\"age\":18}]";Type type = new TypeReference<User>() {}.getType();JSON.parseArray(jsonStr, new Type[]{type, type}).forEach(System.out::println);
}

这种方式有个坑就是:我们使用parseArray()这个方法的时候第二个参数需要传入我们要反序列化的对象类型,但是我们这里需要传入的是数组,不知道你有没有为数组里面放了两个一样的type感到奇怪?没错,这就是方法的坑,我们List里面有多少个对象,Type[]这个数组里面的个数要与之匹配,不然会抛出以下错误:

在这里插入图片描述
上述JSON串中对象的类型都为User,如果JSON串中存在不同的类型时:

public static void main(String[] args) {String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"sex\":\"男\",\"age\":23},{\"stuName\":\"李四\"}]";Type userType = new TypeReference<User>() {}.getType();Type studentType = new TypeReference<Student>() {}.getType();JSON.parseArray(jsonStr, new Type[]{userType,studentType}).forEach(System.out::println);
}
User(id=1, name=张三, sex=男, age=23)
Student(stuName=李四)

如果将userType和studentType调换顺序,则结果:

Student(stuName=null)
User(id=null, name=null, sex=null, age=null)

三、JavaBean转换为Byte[]

1)toJSONBytes(Object o)

我们平时在进行网络通讯的时候,需要将对象转为字节然后进行传输。我们使用字符串的时候,字符串中有个很便捷的API可以将字符串转为字节数组。

String str = "张三";
byte[] bytes = str.getBytes();

但是我们要将一个JavaBean对象转为字节数组的时候,我们得借助ByteArrayOutputStream流的帮助。

public static void main(String[] args) {byte[] bytes = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();try{ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);oos.flush();bytes = bos.toByteArray();oos.close();bos.close();} catch(IOException ex) {ex.printStackTrace();}
}

这种方式也可以很好的将JavaBean对象转为字节数组,但是代码不免有点多了!而FastJson中野提供了很方便的API以供使用。

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();//JavaBean对象转为字节数组byte[] bytes = JSON.toJSONBytes(user);
}

我们要将字节数组转为对象,FastJson也同样支持:

public static void main(String[] args) {User user = User.builder().id(1).name("张三").sex("男").age(23).build();//JavaBean对象转为字节数组byte[] bytes = JSON.toJSONBytes(user);//将字节数组转为JavaBean对象Object obj = JSON.parseObject(bytes, User.class, Feature.IgnoreNotMatch);System.out.println(obj);
}

//待更新…

相关文章:

Java 中FastJson的使用【吃透FastJson】

如果不了解JSON格式&#xff0c;建议先看下&#xff1a;JSON数据格式【学习记录】 JSON序列化、反序列化JavaBean的框架有很多&#xff0c;最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等&#xff0c;下面我们主要来熟悉一下&#xff1a;Java语…...

Redis5.0集群搭建

Redis集群教程 此文重在介绍 Redis5.0 三主三从集群安装&#xff0c;无复杂难懂的概念&#xff0c;若想深入了解集群原理请参考Redis集群规范。 Redis集群介绍 Redis Cluster 提供一种 Redis 安装方式&#xff1a;数据自动在多个 Redis 节点间分片。 Redis Cluster 提供一定…...

继企业级信息系统开发学习1.1 —— Spring配置文件管理Bean

骑士救美计划采用构造方法注入属性值1、创建救美任务类2、创建救美骑士类2、创建救美骑士类3、创建旧救美骑士测试类3、配置救美骑士Bean5、创建新救美骑士测试类采用构造方法注入属性值 1、创建救美任务类 在net.huawei.spring.day01包里创建RescueDamselQuest类 Rescue Da…...

Web 容器、HTTP 服务器 、Servlet 容器区别与联系

首先浏览器发起 HTTP 请求&#xff0c;像早期的时候只会请求一些静态资源&#xff0c;这时候需要一个服务器来处理 HTTP 请求&#xff0c;并且将相应的静态资源返回。 这个服务器叫 HTTP 服务器。 简单点说就是解析请求&#xff0c;然后得知需要服务器上面哪个文件夹下哪个名字…...

eBPF 进阶: 内核新特性进展一览

Linux 内核在 2022 年主要发布了 5.16-5.19 以及 6.0 和 6.1 这几个版本&#xff0c;每个版本都为 eBPF 引入了大量的新特性。本文将对这些新特性进行一点简要的介绍&#xff0c;更详细的资料请参考对应的链接信息。总体而言&#xff0c;eBPF 在内核中依然是最活跃的模块之一&a…...

2.输入子系统学习-multi-touch-protocol-2023.02

Documentation/input/multi-touch-protocol.txt&#xff08;百度翻译&#xff09; Multi-touch (MT) Protocol ------------------------- Copyright (C) 2009-2010 Henrik Rydberg <rydbergeuromail.se> 一、Introduction ------------ In order to utilize t…...

【靶机】vulnhub靶机pylington

靶机下载地址 Pylington: 1 ~ VulnHub kali ip&#xff1a;192.168.174.128 靶机ip&#xff1a;192.168.174.146 arp-scan -l发现靶机ip是192.168.174.146 进行靶机的端口扫描&#xff0c;这里使用的是nmap的gui 可以发现开放了21和80端口&#xff0c;80端口扫描到了robot…...

【大数据】大数据学习路线

职位选择 首先明确一点&#xff1a;大数据涉及的知识面广度还是有的&#xff0c;需要学习的组件繁多&#xff0c;想要每一项精通几乎不可能&#xff0c;所以企业在招聘的时候会进行细分&#xff0c;基于某个方向进行招聘&#xff0c;比如关键字&#xff0c;数据仓库工程师、数…...

【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由

前言 (&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨 大家好&#xff0c;这里是小圆 现在开始每天都给大家 分享些关于python爬虫的案例教学 从最简单的开始 — 采集图片壁纸 今天就来扒拉这个优质的壁纸网站~ 网址 &#x1f447; 顺便瞧一眼 这里的…...

波卡2022年第四季度报告

本文将介绍Messari最新发布的波卡Polkadot 2022年第四季度报告内容。 1 Messari已经发布关于波卡Polkadot最新的报告&#xff1a;显示了2022年第四季度的日活账户增加了64%&#xff0c;新用户增长49%。 2 Messari指出&#xff0c;波卡中继链在2022第四季度的环比增长令人印象…...

第一章:初始化react项目+antd+less

初始化react项目 我们首先使用react脚手架创建一个项目 Ant Design less creact-react-app中文文档 creact-react-app demo生产环境打包运行 当我们执行了 npm run build 打包后直接访问index.html 看效果白屏 这时候就需要安装一个serve包 npm install -g serve当我们安…...

图的基本概念

1、图的概念 G(V&#xff0c;E) 图G由节点集合VV(G)和边集合EE(G)组成&#xff0c;其中V为非空有限集合。 集合V中的节点&#xff08;node&#xff09;用红色标出&#xff0c;通过集合E中黑色的边&#xff08;edge&#xff09;连接。 G的边&#xff1a;E中的每个顶点对&#x…...

MySQL必会四大函数-窗口函数

在了解窗口函数之前&#xff0c;我们必须了解聚合函数。常见的聚合函数&#xff0c;包括 AVG、COUNT、MAX、MIN、SUM 以及 GROUP_CONCAT&#xff0c;常和GROUP BY 函数一起使用。聚合函数的作用就是对一组数据行进行汇总计算&#xff0c;并且返回单个分析结果。 窗口函数和聚合…...

各CCF期刊点评网站/学术论坛的信息汇总及个人评价

CCF中文期刊投稿选择之篇章一:各CCF期刊点评网站/学术论坛的信息汇总及个人评价中文科技期刊A类&#xff08;EI检索&#xff09;中文期刊投稿点评网站整理1.小木虫学术论坛2. Letpub3. Justscience4. 发表记5. 会伴&#xff08;Conference Partner)6. ijouranl7. 掌桥科研这是以…...

深度解析 JavaScript 严格模式:利弊长远的考量

前言 ECMAScript 5首次引入严格模式的概念。严格模式用于选择以更严格的条件检查JavaScript代码错误&#xff0c;可以应用到全局&#xff0c;也可以应用到函数内部。 严格模式的好处是可以提早发现错误&#xff0c;因此可以捕获某些 ECMAScript 问题导致的编程错误。 理解严格…...

Vue.js 循环语句

Vue.js 循环语句 在Vue开发中&#xff0c;for循环是我们最常遇见的场景之一&#xff0c;我们知道常见的遍历方式有for循环&#xff0c;for of、forEach、for in.虽然在开发过程中&#xff0c;这几种方式基本上可以满足我们大多数的场景&#xff0c;但是你真的知道他们之间的区…...

家政服务小程序实战教程12-详情页

我们的家政服务小程序已经完成了首页和分类展示页面的开发&#xff0c;接下来就需要开发详情页了。在详情页里我们展示我们的各项服务内容&#xff0c;让用户可以了解每项家政服务可以提供的内容。 低码开发不像传统开发&#xff0c;如果开发详情页需要考虑每个字段的类型&…...

十四、平衡二叉树

1、看一个案例&#xff08;说明二叉排序树可能的问题&#xff09; 给你一个数列{1,2,3,4,5,6}&#xff0c;要求创建一棵二叉排序树&#xff08;BST&#xff09;&#xff0c;并分析问题所在。 上面二叉排序树存在问题分析&#xff1a; 左子树全部为空&#xff0c;从形式上看&…...

AC/DC 基础

一、概念&#xff1a; AC转换成DC的基本方法有变压器方式和开关方式&#xff0c;如下图1、2所示&#xff1b;整流的基本方法有全波整流和半波整流&#xff0c;如下图3所示。 图1 变压器方式 图2 开关方式 图3 整流方式 二、转换方式 1、变压器方式 变压器方式首先需要通过变压…...

集成电路相关书籍

注&#xff1a;从此开始&#xff0c;文中提到的书籍都会在公众号对应文章末尾给出链接&#xff0c;不需要在微信后台获取&#xff0c;当然还是可以通过在微信后台回复相关书名获取对应的电子书。 在后台看到很多人回复集成电路相关的一些书籍&#xff0c;所以本文就提供一些书籍…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...