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

【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

  1. HashSet

  2. HashMap

前言

在探索Java集合框架的丰富世界时,我们不可避免地会遇到两个至关重要的成员:HashMap和HashSet。这两个组件虽然在功能上有着明显的交集,但它们在内部实现、性能表现以及使用场景上却有着显著的差异。本文将深入探讨HashMap与HashSet的内部机制,比较它们的性能特点,并指导读者如何在实际开发中做出恰当的选择

一. HashSet

1. set 的初识

在这里插入图片描述

对于 set 来说, 继承自 Collection 的类, 可以由 SortedSetTreeSetHashSet 来实现。

对于 set 本身 来说, 只 存储 key 的值, 并不 存values , 并且这个 key是唯一的, 且 不可修改的

在本篇文章中将重点讲解 HashSet 来实现 Set 类

鱼式疯言

set 本身的含义有: 设置集合

Java集合框架 中, set 的含义就表示 集合

集合中的关键码 (key) 就有 两大特性 : 1. 无序性 2. 唯一性

2. set 的常见方法使用

在这里插入图片描述

如上图, 小编介绍几种常见的方法, 足够我们平常 面试和刷算法题 中使用了

如果还想了解的小伙伴可以 参考下面的官方文档 哦 💕 💕 💕 💕

set 官方文档介绍

3. 代码演示

class Test1{public static void main(String[] args) {Set<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.add(4);set.add(5);//        使用迭代器 接收Iterator<Integer> iterator = set.iterator();//        输出迭代器while(iterator.hasNext()) {System.out.println(iterator.next());}//        判断 4 是否存在if(set.contains(4)) {System.out.println("删除前"+ 4 + "存在!");} else  {System.out.println("删除后"+  4 + "不存在!");}//        得到key 的个数System.out.println(set.size());set.remove(4);if(set.contains(4)) {System.out.println("删除后" +  4 + "存在!");} else  {System.out.println("删除后" +  4 + "不存在!");}}}

在这里插入图片描述

  • add() 添加了 key 值 , 如果 set 中存在则 添加失败

  • contains() 检查 是否存在该 key

  • remove() 删除 某个key

  • size() 得到key 的个数

  • iterator 迭代器 , 用来得到 全部的key 的一个 整体的迭代器

鱼式疯言

补充说明

  • 对于 set 的用法主要是用于判断是否 有重复元素 , 并且进行 去重操作。 并且用HashSet 实现, 时间复杂度 可以达到 O(1)
  • 对于 HashSet 实现的 set 接口 , 是可以进行 插入 null 的

二. HashMap

1. Map 的初识

在这里插入图片描述

对于Map 而已, 该接口 不继承Collection 接口 , 可有 HashMap 或 TreeMap 实现,

并且 Map<K, V> 中存储的是 一对K和 V 的键值对

其中 K 是 关键码(key) 用来 作为标识 , 是用来转化为 哈希地址索引标识, 是 唯一的不可更改 , 不能重复

而 V 是 值 (value) , 用来存储具体需要 存储的数据

上面的解释, 可能小伙伴们还不是很能理解

不妨回忆下我们上篇文章的 哈希表的建立

其中数组的下标就可以作为 索引值 , 而key 就可以通过 某种哈希函数 来转化为 数组的下标

value 就可以刚好对应 数组下标位置对应的值

鱼式疯言

小知识 :

对于 HashMap 实现的Map 来说, 键值对都是可以置为 null 的。

2. Map.Entry<K, V>

Map.Entry<K,V> 是一种专门 存放键值对的一种类型 , 并且是 Map 的静态方法 , 可以 不需要对象调用

其实有下面三种方法 ,小编在这里就展示 前两个
在这里插入图片描述

下面我们来看看其演示过程

    public static void main(String[] args) {//        entryMap.Entry<String , String> entry = Map.entry("s","t");System.out.println(entry.getValue());System.out.println(entry.getKey());}

在这里插入图片描述

如上图

其中 s 就代表 key 的关键码,可以用 getValue 获取到

t 就表示 value 的关键码 , 可以用 getKey 来 获取到。

这个类型 其实用的不多, 小伙伴们只需要了解一下即可。

鱼式疯言

补充说明 :

虽然小编上面说明有提供了 修改Value 的方法, 但是并 没有提供 修改 Key 的方法。
所以对于 key 来说, 是 不可修改的

3. Map 的常见方法使用

在这里插入图片描述

对于上述的方法来说, get ()getOrDefault()put() remove()keySet() , values() 等…

以上这些方法, 小编都会一一演示。

4. 代码演示

import java.util.*;
public class Test {public static void main(String[] args) {// 实例化一个 map  对象Map<String, String> map = new HashMap<>();map.put("小白", "dog");map.put("小黑", "cat");map.put("小头", "sleep");map.put(null, null);System.out.println("正在遍历 value 值: ");// 使用 values 演示得到的所有的value  的结果Collection<String> strings = map.values();for(String strings1 : strings) {System.out.print(strings1 + " ");}System.out.println();// 使用 keyset  演示所以得到的 key 的结果System.out.println("正在遍历 key 值: ");Set<String> strings1 = map.keySet();for (String str : strings1) {System.out.print(str+ " ");}System.out.println();//        判断map 是否存在 某个特定的 value  和 keyif(map.containsKey("小白")) {System.out.println("存在小白!");if (map.containsValue("dog")) {System.out.println("存在小白, 并且小白是条狗");} else {System.out.println("存在小白, 但是小白不是条狗!");}}// 获取小黄的value , 如果没有就会返回 defaultValue 的特定的valueString ret =  map.getOrDefault("小黄", "不存在小黄, 但这里会返回一个小蓝");System.out.println(ret);}}

在这里插入图片描述

  • 通过 get() 其中参数列表中填入的 key 的值, 然后 调用 get() 之后 , 就会得到该 key 所对应的 value 值

  • getOrvalue() 如果有 key 就返回 对应的value 值 , 如果没有就 返回后面那个参数的结果

  • put() 就相等于 插入元素 , 不仅要插入 key , 也要 插入key 所对应的value 。 从而得到 两者相关联一样对应的关系 的作用。

  • remove() , 是直接删除 key , 并且 一旦删除 key , 那么 对应的value 也会被删除。

  • keyset() , 这个方法的作用就在于 获取map 中所有的key 值 , 并且用前面讲解过的 Set<Key> 来接收。

  • values() 这个方法的含义就在于 获取map 中所有的 value值 , 返回值是一个Collection<value> 来接收。

  • containsKey() , 用于判断指定的 key 是否存在

  • containsValue() , 用于判断指定的 value 是否存在

鱼式疯言

补充说明:

  • 对于map 来说, key 是不可重复的, 但是 value 是可以重复 ,并且是可以修改的, 如果 一定要修改key 的值 , 就需要把 原先的key 删除 , 然后 添加一个新的key

  • 由于 key 是不可重复的 , 当我们返回 key 的集合 时, 就可以用set 来接收 ,因为set 的最大功能就是对元素 进行去重 , 达到每一个 关键码都是唯一性

  • 由于 value 是可以重复的, 当我们返回 value的集合 时 , 不可以用 set 来接收一般用Collection 来接收

  • 综上所得, 对于 set 的而言, 如果涉及到 单个元素的去重操作一般我们使用 set

    但如果有 两种关联属性 的话, 我们一般用 map建立键值对进行操作

三. 哈希桶实现哈希表

哈希桶的本质就是当出现哈希冲突时, 利用 链表把新的关键码(key) 插入原有的 key 的后面 , 把 一个大集合转化为一个小集合 来使用。

如果对这个概念还很模糊的小伙伴可以参考小编的上一篇文章哦 💕 💕 💕 💕

1. 哈希桶的代码展示

package hash;public class KVHashBucket <K,V>{// 存放链表数组Node<K,V>[]array;// 实际元素个数int useSize;private static final int DEFAULTSIZE=10;// 定义一个内部类为节点static class Node<K,V> {V val;Node<K,V> next;K key;public Node(K key,V val) {this.key=key;this.val = val;}}public KVHashBucket() {array= (Node<K, V>[]) new Node[DEFAULTSIZE];}/*** 插入方法* @param val 需要插入的数据*/void put(K key,V val) {// 判断是否满if (isFull()) {insertFunc2(key,val);return;}insertFunc1(key,val);}/*** 未满时普通插入* @param val 需要插入的数据*/private void insertFunc1(K key,V val) {int sz=array.length;int k=key.hashCode();int index= k % sz;// 如果出现 key 重复 就修改 val 值Node<K,V> cur=array[index];while (cur != null) {if (cur.key == key) {cur.val=val;return;}cur=cur.next;}Node<K,V> node=new Node<K,V>(key,val);node.next=array[index];array[index]=node;useSize++;}/*** 扩容方法* @param val 插入数据* 先扩容一个新数组* 然后把旧数组整合放入新数组* 最后旧数组成为新数组*/private void insertFunc2(K key ,V val) {Node<K,V> cur=null;Node<K,V>[] newArray= (Node<K, V>[]) new Node[2 * array.length];int newLength = 2 * array.length;for (int i = 0; i < array.length; i++) {cur=array[i];while (cur != null) {K m = cur.key;// 先让 node 记住 cur 的下个节点Node<K,V> node = cur.next;int k=m.hashCode();int index= k % newLength;cur.next = newArray[index];newArray[index] = cur;cur=node;}}Node<K,V> til=new Node<K,V>(key,val);int k=key.hashCode();int index=k%newLength;// 如果出现 key 重复 就修改 val 值Node<K,V> curN=array[index];while (curN != null) {if (curN.key == key) {curN.val=val;return;}curN=curN.next;}til.next=newArray[index];newArray[index]=til;useSize++;array=newArray;}/*** 查找该节点* @param key 需要查找的数据* @return 返回该数据的节点*/public V get(K key) {if (isEmpty()) return null;int k=key.hashCode();int index = k % array.length;Node<K,V> cur=array[index];while (cur != null) {if (cur.key.equals(key)) {return cur.val;}cur=cur.next;}return null;}/*** 查找是否该节点* @param key 需要查找的数据* @return 返回是否找到*/public   boolean contains(K key) {if (isEmpty()) return false;int k=key.hashCode();int index=k % array.length;Node<K,V> cur=array[index];while (cur != null) {if (cur.val.equals(key)) {return true;}cur=cur.next;}return false;}public boolean remove(K key) {if (isEmpty()) return false;int k=key.hashCode();int index = k % array.length;Node<K,V> cur = array[index];Node<K,V> node = cur;if (cur.key==key) {array[index]=cur.next;return true;}while (cur != null) {if (cur.key.equals(key)) {node.next = cur.next;useSize--;return true;}node = cur;cur = cur.next;}return false;}/*** 判断是否满* @return 返回结果*/private boolean isFull() {return (useSize*1.0/array.length) >= 0.75;}/*** 判断是否为空* @return 返回结果*/private boolean isEmpty() {return useSize==0;}
}
public class TestKVHash {public static void main(String[] args) {KVHashBucket<String,String> kvhb=new KVHashBucket<>();kvhb.put("钟大帅哥","喜欢美女!");kvhb.put("郭大男神","喜欢拉比!");kvhb.put("刘大少爷","喜欢花钱!");}}

在这里插入图片描述

具体的实现 流程三部曲

  1. 首先创建一个 Node 类的节点

  2. 然后创建一个 Node类型的数组来存储

  3. 对利用 key 进行hashcode寻找到索引值, 根据索引操作链表 进行 增删查改

鱼式疯言

上述流程,小编只 强调三点

  1. 负载因子一旦达到 0.75 就相当于 满了, 就需要 扩容

  2. 扩容的过程中, 需要将 旧表转移到新表 中,不可以只是扩容而不转移, 否则数据会集中在原数组中, 而不会分散到新扩扩容的数组空间中。

  3. 如果添加时,遇到 相同的key 时, 只需要修改 原先 value现有的 valuekey 无须变动 即可。

    其他小编认为问题不大,小伙伴们可以自己先 操练操练 哦, 如果有不清楚的地方, 欢迎评论区留言哦 。💖 💖 💖

总结

  • hashset : 对于Hashset 来说主要是运用 Hashset 实现Set的相关的方法 来达到 判断数据是否重复进行去重操作的目的

  • HashMap : 对于 hashMap 实现 Map 接口, 达到对于 键值对之间的关联 , 已经对于 键的唯一性 所包含 值的可重复性 查找操作。

  • 哈希桶的实现: 利用数组和泛型来理解 哈希函数的底层实现 , 并注意实现过程中 负载因子的更新 以及背后的细节。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

相关文章:

【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…...

Docker 教程:如何查看容器的最后 300 行实时日志

Docker 教程&#xff1a;如何查看容器的最后 300 行实时日志 文章目录 Docker 教程&#xff1a;如何查看容器的最后 300 行实时日志Docker 日志简介查看容器日志的基本命令查看最后 300 行实时日志的具体命令参数解释 实际案例演示示例输出 常见问题解答如何退出实时日志的查看…...

Qwen2-VL论文阅读笔记

第1章介绍 论文亮点&#xff1a; 1、 the Naive Dynamic Resolution mechanism 2、Multimodal Rotary Position Embedding (M-RoPE) 2D Rotary Position Embedding 3、统一图片和视频的处理范式、增i强视觉感知能力 4、LVLMs的scaling laws&#xff1a;2B、8B、72B 5、 dynamic…...

APScheduler、Django实现定时任务,以及任务动态操作

环境&#xff1a;Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景&#xff1a;工作需要使用且用法较为复杂&#xff0c;各种功能基本都使用了 事件&#xff1a;20240920 说明&#xff1a;记录&#xff0c;方便后期自己查找 1、搭建基础环境 文件结构图…...

SpringBoot开发——整合Apache POI轻松生成精美的Excel报表

文章目录 1、准备工作2、编写代码2.1 创建实体类2.2 创建Excel生成服务2.3 创建控制器 3、测试4、结论 在许多企业应用程序中&#xff0c;导出数据到Excel表格是一项常见的需求。Spring Boot提供了许多库来简化这个过程&#xff0c;其中包括Apache POI和Spring Boot的相关模块。…...

海信智能电视的使用心得

买了海信智能电视(型号:32E2F)有一段时间了&#xff0c;要使用这个智能电视还真能考验你的智商。海信电视有很多优点&#xff0c;它的屏幕比较靓丽&#xff0c;色彩好看&#xff0c;遥控器不用对着屏幕就能操作。但也有不少缺点。 1. 海信智能电视会强迫自动更新操作系统&…...

【YashanDB知识库】客户端字符集与数据库字符集兼容问题

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352675.html?templateId1718516 问题现象 客户端yasql配置字符集为GBK&#xff0c;服务端yasdb配置字符集为UTF8&#xff0c;之后执行语句&#xff1a; 会发现&#xff1a; 期望是两个都…...

Session和Cookie是什么?有什么区别?分布式Session问题又是什么?

Session和Cookie是什么&#xff1f;有什么区别&#xff1f;分布式Session问题又是什么&#xff1f; Cookie&#xff1a;是服务器发送到浏览器并保存在本地的数据。在浏览器下一次向同一服务器再次发送请求时&#xff0c;将Cookie也发送给服务器&#xff0c;并以此来判定这个请…...

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142454993 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…...

CSS开发全攻略

目录 一、CSS基础入门&#xff08;一&#xff09;CSS概述1.CSS的定义与作用2.CSS的历史与发展3.CSS的核心概念&#xff08;1&#xff09;选择器&#xff08;Selector&#xff09;&#xff08;2&#xff09;声明&#xff08;Declaration&#xff09;&#xff08;3&#xff09;规…...

OpenCV运动分析和目标跟踪(3)计算图像序列的加权平均值函数accumulateWeighted()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 更新一个运行平均值。 该函数计算输入图像 src 和累积器 dst 的加权和&#xff0c;使得 dst 成为帧序列的运行平均值&#xff1a; dst ( x , y…...

vue3中echarts柱状图横轴文字太多放不下怎么解决

问题&#xff1a;在做数据展示的时候&#xff0c;使用的是echarts&#xff0c;遇到了个问题&#xff0c;就是数据过多&#xff0c;但是设置的x轴的文字名称又太长&#xff0c;往往左边第一个或右边最后一个的名称展示不全&#xff0c;只有半个。 从网上找到了几种办法&#xff…...

Web 开发安全与最佳实践:MVC、会话管理与常见攻击防御

1. 引言 随着 Web 应用的普及&#xff0c;安全问题变得尤为重要。从小型个人网站到复杂的企业级系统&#xff0c;安全漏洞可能导致数据泄露、服务中断甚至经济损失。因此&#xff0c;在 Web 开发中&#xff0c;采用良好的架构设计、会话管理和安全防护机制至关重要。本文将探讨…...

Segformer双显卡推理速度测试

1、4080单显卡和双显卡同步并行推理平均耗时分别为360ms、600ms;双显卡速度明显比单显卡的速度快 2、两个相机间隔500ms的并行推理耗时&#xff0c;单双显卡推理平均耗时为340ms 3、4080双显卡和4070双显卡同步并行推理平均耗时分别为360ms、380ms;4080比4070的速度快20ms...

使用在线电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、ESP32C3)

文章目录 Wokwi安装客户端&#xff08;Mac/Linux&#xff09;创建 Token ESP32C3 示例demo.ino创建模拟器运行模拟器 Wokwi Wokwi 是一款在线电子模拟器。您可以使用它来模拟 Arduino、ESP32、STM32 以及许多其他流行的主板、部件和传感器。 Github&#xff1a; https://gith…...

vue3+element-plus icons图标选择组件封装

一、最终效果 二、参数配置 1、代码示例 <t-select-icon v-model"selectVlaue" />2、配置参数&#xff08;Attributes&#xff09;继承 el-input Attributes 参数说明类型默认值v-model绑定值string-prefixIcon输入框前缀iconstringSearchisShowSearch是否显…...

Spring validation校验框架

第1步&#xff1a;导入依赖 <!-- 校验框架--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 第2步&#xff1a;为需要校验的参数&…...

UBUNTU20.04安装CH384串口卡驱动

继续上文&#xff1a;统信UOS安装CH384串口卡驱动-CSDN博客 统信UOS系统成功安装CH384串口驱动后&#xff0c;继续在ubuntu20.04下安装驱动&#xff0c;发现一直报错&#xff0c;原因是内核驱动不一致。 解决办法&#xff1a; 1. 下载最新的驱动。CH35XCH384驱动源文件资源-C…...

JWT(JSON Web Tokens) 详细介绍

文章目录 什么是JWT?JWT的组成部分JWT的使用场景优点缺点 Java中如何实现JWT编解码引入JJWT依赖编码JWT解码JWT使用示例 什么是JWT? JWT&#xff08;JSON Web Tokens&#xff09;是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。JWT可以传递信息&#xff0c;这…...

数据结构练习题————(二叉树)——考前必备合集!

今天在牛客网和力扣上带来了数据结构中二叉树的进阶练习题 1.二叉搜索树与双向链表———二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 2.二叉树遍历————二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 3.二叉树的层序遍历————102. 二叉树的层序遍历 - 力扣&am…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...