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

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响

在使用 ROS(Robot Operating System)进行开发时,通常会涉及多个 Catkin 工作空间(Catkin Workspace)。这些工作空间包含不同的 ROS 包和节点,可能相互依赖或存在版本差异。正确配置和加载这些工作空间对于确保 ROS 包的正确识别和功能的正常运行至关重要。本文将详细解释 .bashrc 文件中工作空间加载顺序的重要性,分析其对环境变量特别是 ROS_PACKAGE_PATH 的影响,并通过示例说明如何合理配置加载顺序以避免常见问题。

一、背景概述

1. ROS 工作空间(Catkin Workspace)

Catkin 是 ROS 的官方构建系统,用于组织和编译 ROS 包。一个 Catkin 工作空间通常包含以下目录结构:

~/catkin_ws/
├── src/
│   ├── package_1/
│   ├── package_2/
│   └── ...
├── build/
└── devel/
  • src/:包含所有 ROS 包的源代码。
  • build/:CMake 构建文件生成目录。
  • devel/:编译后生成的开发环境,包含环境配置脚本 setup.bash

2. .bashrc 文件

.bashrc 是 Bash Shell 的配置文件,每次启动新的终端会话时都会执行。通过在 .bashrc 中添加 source 命令,可以自动加载 ROS 环境和多个工作空间的配置,从而简化开发流程。

二、工作空间加载顺序的重要性

1. setup.bash 的作用

每个 Catkin 工作空间的 devel/setup.bash 文件负责设置环境变量,尤其是 ROS_PACKAGE_PATH,以便 ROS 工具能够找到和使用该工作空间中的包。执行 source devel/setup.bash 会将该工作空间的路径优先级提升,使其包含的包在 ROS 系统中具有更高的优先级。

2. 多工作空间叠加(Overlay Workspaces)

当存在多个工作空间时,后加载的工作空间会覆盖先前加载的工作空间中相同名称的包。这意味着加载顺序直接影响 ROS 包的解析和优先级。例如,如果两个工作空间都包含 cv_bridge 包,最后加载的工作空间中的 cv_bridge 将被 ROS 系统优先识别。

3. 环境变量的累积和覆盖

  • ROS_PACKAGE_PATH:包含所有 ROS 包的搜索路径,顺序决定了包的优先级。后添加的路径优先级更高。
  • PATHLD_LIBRARY_PATHPKG_CONFIG_PATH 等:这些环境变量也会受到加载顺序的影响,可能导致库和可执行文件的冲突或版本不兼容。

三、常见问题分析

1. rospack find cv_bridge 无法找到包

用户在 .bashrc 中加载多个工作空间时,特别是将 source ~/pointcloudmap_ws/devel/setup.bash 放在最后,会导致 rospack find cv_bridge 无法找到 cv_bridge 包。这通常是因为:

  • 加载顺序问题:后加载的工作空间可能缺少 cv_bridge 包,或包含不同版本,覆盖了前面工作空间中的配置。
  • 错误的 ROS_PACKAGE_PATH 设置:手动添加路径时添加了包本身而非其父目录,导致 ROS 无法正确解析。

2. 环境变量冲突

加载多个工作空间时,若不同工作空间中存在相同名称的包或依赖不同版本的库(如 OpenCV),可能导致编译或运行时错误。

四、详细解决方案

1. 正确设置 ROS_PACKAGE_PATH

确保 ROS_PACKAGE_PATH 包含的是 ROS 包的父目录,而不是包本身的路径。例如:

  • 错误设置
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv/cv_bridge
    
  • 正确设置
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv
    

示例解释
假设 cv_bridge 位于 ~/vision_opencv/cv_bridge,则应将 ~/vision_opencv 添加到 ROS_PACKAGE_PATH,使 ROS 能在该目录下查找所有包。

2. 优化 .bashrc 中的工作空间加载顺序

加载多个工作空间时,建议将包含关键依赖包(如 cv_bridge)的工作空间放在最前面,其他工作空间按优先级递减的顺序加载。这样,关键包的版本优先级最高,避免被后加载的工作空间覆盖。

示例 .bashrc 配置

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/lyb/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/lyb/anaconda3/etc/profile.d/conda.sh" ]; then. "/home/lyb/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/home/lyb/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<export JAVA_HOME=/usr/lib/jvm/default-java/jre# OpenCV 3.2.0 环境变量设置
export PATH=/usr/local/opencv3.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH# ROS 环境配置
source /opt/ros/noetic/setup.bash# 加载关键工作空间(包含 cv_bridge 的工作空间)
source ~/catkin_ws/devel/setup.bash# 加载其他工作空间,顺序从高优先级到低优先级
source ~/AutoPaintRobot/devel/setup.bash
source ~/demo_ros-control_ws/devel/setup.bash
source ~/ros_web/devel/setup.bash
source ~/ROS-Noetic-pr2/catkin_ws/devel/setup.bash
source ~/catkin_ws_1/devel/setup.bash
source ~/Orbbec_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash# 添加 GCC 工具链和 Python 路径
export PATH=/home/lyb/gcc-arm-none-eabi-5_4-2016q2/bin:$PATH
export PATH=/usr/local/python3.10.14/bin:$PATH# 设置别名和其他环境变量
alias python='python3'# 添加 ROS 库路径
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/ros/noetic/lib/pkgconfig

示例解释

  1. 加载 ROS 基础环境

    source /opt/ros/noetic/setup.bash
    

    这是 ROS Noetic 的全局配置,必须首先加载。

  2. 加载关键工作空间

    source ~/catkin_ws/devel/setup.bash
    

    假设 ~/catkin_ws 包含 cv_bridge,将其放在最前面,确保其包在 ROS_PACKAGE_PATH 中优先级最高。

  3. 加载其他工作空间

    source ~/AutoPaintRobot/devel/setup.bash
    source ~/demo_ros-control_ws/devel/setup.bash
    ...
    

    按照使用频率或依赖关系,从高优先级到低优先级依次加载。

  4. 环境变量设置

    export PATH=/usr/local/opencv3.2.0/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH
    

    确保自定义库路径优先于系统默认路径,避免版本冲突。

3. 避免手动设置 ROS_PACKAGE_PATH

依赖于 Catkin 工作空间的 setup.bash 自动管理 ROS_PACKAGE_PATH,避免手动干预,以减少配置冲突。若确实需要手动添加路径,确保添加的是包的父目录。

错误示例

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv/cv_bridge

正确示例

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv

4. 使用工作空间叠加(Overlay Workspaces)

Catkin 支持叠加多个工作空间,后加载的工作空间可以覆盖前加载的工作空间中的包。确保加载顺序符合优先级需求。

示例

假设有两个工作空间:

  • ~/catkin_ws:包含核心包,如 cv_bridge
  • ~/pointcloudmap_ws:包含自定义包,可能依赖 cv_bridge

加载顺序

  1. ~/catkin_ws:核心包优先加载
  2. ~/pointcloudmap_ws:自定义包加载,依赖于核心包
source ~/catkin_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash

5. 示例 .bashrc 配置与解释

完整示例

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/lyb/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/lyb/anaconda3/etc/profile.d/conda.sh" ]; then. "/home/lyb/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/home/lyb/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<export JAVA_HOME=/usr/lib/jvm/default-java/jre# OpenCV 3.2.0 环境变量设置
export PATH=/usr/local/opencv3.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH# ROS 基础环境配置
source /opt/ros/noetic/setup.bash# 加载包含关键依赖包的工作空间
source ~/catkin_ws/devel/setup.bash# 加载其他工作空间,按优先级递减顺序
source ~/AutoPaintRobot/devel/setup.bash
source ~/demo_ros-control_ws/devel/setup.bash
source ~/ros_web/devel/setup.bash
source ~/ROS-Noetic-pr2/catkin_ws/devel/setup.bash
source ~/catkin_ws_1/devel/setup.bash
source ~/Orbbec_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash# 添加 GCC 工具链和 Python 路径
export PATH=/home/lyb/gcc-arm-none-eabi-5_4-2016q2/bin:$PATH
export PATH=/usr/local/python3.10.14/bin:$PATH# 设置别名和其他环境变量
alias python='python3'# 添加 ROS 库路径
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/ros/noetic/lib/pkgconfig# 确保 `cv_bridge` 的父目录已在 ROS_PACKAGE_PATH 中
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv

示例解释

  1. Conda 初始化

    • 保持 Conda 环境的正确加载,不影响 ROS 环境配置。
  2. JAVA_HOME 设置

    • 设置 Java 环境变量,供需要 Java 的工具使用。
  3. OpenCV 3.2.0 环境变量设置

    • 手动指定 OpenCV 3.2.0 的路径,确保使用特定版本的 OpenCV。
    • 注意:若 ROS Noetic 默认使用 OpenCV 4,需谨慎管理版本冲突。
  4. 加载 ROS 基础环境

    • source /opt/ros/noetic/setup.bash:加载 ROS Noetic 的全局配置。
  5. 加载关键工作空间

    • source ~/catkin_ws/devel/setup.bash:包含核心依赖包,如 cv_bridge,优先加载以确保其包优先级最高。
  6. 加载其他工作空间

    • 按优先级递减顺序加载其他工作空间,避免覆盖关键依赖包。
  7. 添加工具链和 Python 路径

    • 将自定义工具链和 Python 版本添加到 PATH,确保使用特定版本。
  8. 设置别名和其他环境变量

    • 设置 python 别名为 python3,确保脚本使用正确的 Python 版本。
  9. 添加 ROS 库路径

    • 确保 ROS 库路径正确添加,避免库文件冲突。
  10. 确保 ROS_PACKAGE_PATH 正确

    • 添加 ~/vision_opencv,使 ROS 能正确查找 cv_bridge 包。

6. 验证配置

在修改 .bashrc 后,执行以下命令以使更改生效:

source ~/.bashrc

然后,验证 cv_bridge 是否可被识别:

rospack find cv_bridge

若返回正确的路径(例如 /home/lyb/catkin_ws/src/vision_opencv/cv_bridge),说明配置正确。

五、总结与最佳实践

1. 加载顺序策略

  • 核心工作空间优先:包含关键依赖包(如 cv_bridge)的工作空间应最先加载,确保其包在 ROS_PACKAGE_PATH 中优先级最高。
  • 叠加工作空间:后加载的工作空间在叠加时覆盖前加载的工作空间中的同名包,应根据需要安排加载顺序。

2. 环境变量管理

  • 避免手动修改 ROS_PACKAGE_PATH:依赖 setup.bash 自动管理,减少人为错误。
  • 处理库版本冲突:尽量使用 ROS 默认的库版本,避免手动指定不同版本的库,除非必要。
  • 统一使用 catkin 构建系统:避免混用过时的 rosbuild 构建系统,以减少依赖识别问题。

3. 工作空间维护

  • 保持工作空间整洁:定期清理不必要的包和依赖,减少潜在冲突。
  • 版本控制:使用 Git 等版本控制系统管理工作空间,方便回滚和协作。
  • 文档记录:记录各工作空间的用途、依赖和配置,便于维护和问题排查。

4. 参考资源

  • ROS 官方文档:Catkin Workspace
  • 社区支持:ROS Answers
  • 最佳实践指南:ROS Wiki - Best Practices

通过遵循上述指南和最佳实践,您可以有效管理多个 ROS 工作空间,避免常见的环境配置问题,确保 ROS 包的正确识别和功能的稳定运行。

相关文章:

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 在使用 ROS&#xff08;Robot Operating System&#xff09;进行开发时&#xff0c;通常会涉及多个 Catkin 工作空间&#xff08;Catkin Workspace&#xff09;。这些工作空间包含不同的 ROS 包和节点&#xff0c;可能相互…...

Apache Doris 现行版本 Docker-Compose 运行教程

特别注意&#xff01;Doris On Docker 部署方式仅限于开发环境或者功能测试环境&#xff0c;不建议生产环境部署&#xff01; 如有生产环境或性能测试集群部署诉求&#xff0c;请使用裸机/虚机部署或K8S Operator部署方案&#xff01; 原文阅读&#xff1a;Apache Doris 现行版…...

Flink四大基石之窗口(Window)使用详解

目录 一、引言 二、为什么需要 Window 三、Window 的控制属性 窗口的长度&#xff08;大小&#xff09; 窗口的间隔 四、Flink 窗口应用代码结构 是否分组 Keyed Window --键控窗 Non-Keyed Window 核心操作流程 五、Window 的生命周期 分配阶段 触发计算 六、Wi…...

NGINX配置https双向认证(自签一级证书)

一 生成自签证书 以下是生成自签证书(包括服务端和客户端的证书)的步骤&#xff0c;以下命令执行两次&#xff0c;分别生成客户端和服务端证书和私钥。具体执行可以先建两个目录client和server&#xff0c;分别进入到这两个目录下执行下面的命令。 生成私钥&#xff1a; 首先&…...

Flink双流Join

在离线 Hive 中&#xff0c;我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢&#xff1f;Flink DataStream API 为我们提供了3个算子来实现双流 join&#xff0c;分别是&#xff1a; join coGroup intervalJoin 下面我们分别详细看一下这…...

【数据结构实战篇】用C语言实现你的私有队列

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构&#xff0c;本期内容我们将实现队列的数据结构 一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…...

基于web的海贼王动漫介绍 html+css静态网页设计6页+设计文档

&#x1f4c2;文章目录 一、&#x1f4d4;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站演示 五、⚙️网站代码 &#x1f9f1;HTML结构代码 &#x1f492;CSS样式代码 六、&#x1f527;完整源码下载 七、&#x1f4e3;更多 一、&#…...

2022 年 9 月青少年软编等考 C 语言三级真题解析

目录 T1. 课程冲突T2. 42 点思路分析T3. 最长下坡思路分析T4. 吃糖果思路分析T5. 放苹果思路分析T1. 课程冲突 此题为 2021 年 9 月三级第一题原题,见 2021 年 9 月青少年软编等考 C 语言三级真题解析中的 T1。 T2. 42 点 42 42 42 是: 组合数学上的第 5 5 5 个卡特兰数字…...

机器学习算法(六)---逻辑回归

常见的十大机器学习算法&#xff1a; 机器学习算法&#xff08;一&#xff09;—决策树 机器学习算法&#xff08;二&#xff09;—支持向量机SVM 机器学习算法&#xff08;三&#xff09;—K近邻 机器学习算法&#xff08;四&#xff09;—集成算法 机器学习算法&#xff08;五…...

计算机科学中的主要协议

1、主要应用层协议&#xff1a; HTTP、FTP、SMTP、POP、IMAP、DNS、TELNET和SSH等 应用层协议的主要功能是支持网络应用&#xff0c;定义了不同应用程序之间的通信规则。它们负责将用户操作转换为网络可以理解的数据格式&#xff0c;并通过传输层进行传输。应用层协议直接与用…...

下载maven 3.6.3并校验文件做md5或SHA512校验

一、下载Apache Maven 3.6.3 Apache Maven 3.6.3 官方下载链接&#xff1a; 二进制压缩包&#xff08;推荐&#xff09;: ZIP格式: https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipTAR.GZ格式: https://archive.apache.org/dist/…...

【Android】View工作原理

View 是Android在视觉上的呈现在界面上Android提供了一套GUI库&#xff0c;里面有很多控件&#xff0c;但是很多时候我们并不满足于系统提供的控件&#xff0c;因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢&#xff1f;答案是自定义View&#…...

TIE算法具体求解-为什么是泊松方程和傅里叶变换

二维泊松方程的通俗理解 二维泊松方程 是偏微分方程的一种形式&#xff0c;通常用于描述空间中某个标量场&#xff08;如位相场、电势场&#xff09;的分布规律。其一般形式为&#xff1a; ∇ 2 ϕ ( x , y ) f ( x , y ) \nabla^2 \phi(x, y) f(x, y) ∇2ϕ(x,y)f(x,y) 其…...

postman中获取随机数、唯一ID、时间日期(包括当前日期增减)截取指定位数的字符等

在Postman中&#xff0c;您可以使用内置的动态变量和编写脚本的方式来获取随机数、唯一ID、时间日期以及截取指定位数的字符。以下是具体的操作方法&#xff1a; 一、postman中获取随机数、唯一ID、时间日期&#xff08;包括当前日期增减&#xff09;截取指定位数的字符等 获取…...

【计算机网络】实验3:集线器和交换器的区别及交换器的自学习算法

实验 3&#xff1a;集线器和交换器的区别及交换器的自学习算法 一、 实验目的 加深对集线器和交换器的区别的理解。 了解交换器的自学习算法。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、熟悉集线器和交换器的区别 (1) 第一步&#xff1a;构建网络…...

flink学习(14)—— 双流join

概述 Join:内连接 CoGroup&#xff1a;内连接&#xff0c;左连接&#xff0c;右连接 Interval Join&#xff1a;点对面 Join 1、Join 将有相同 Key 并且位于同一窗口中的两条流的元素进行关联。 2、Join 可以支持处理时间&#xff08;processing time&#xff09;和事件时…...

HTTP协议详解:从HTTP/1.0到HTTP/3的演变与优化

深入浅出&#xff1a;从头到尾全面解析HTTP协议 一、HTTP协议概述 1.1 HTTP协议简介 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最广泛的通信协议之一。它用于客户端与服务器之间的数据传输&#xff0c;尤其是在Web…...

张量并行和流水线并行在Transformer中的具体部位

目录 张量并行和流水线并行在Transformer中的具体部位 一、张量并行 二、流水线并行 张量并行和流水线并行在Transformer中的具体部位 张量并行和流水线并行是Transformer模型中用于提高训练效率的两种并行策略。它们分别作用于模型的不同部位,以下是对这两种并行的具体说…...

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…...

【论文阅读】Federated learning backdoor attack detection with persistence diagram

目的&#xff1a;检测联邦学习环境下&#xff0c;上传上来的模型是不是恶意的。 1、将一个模型转换为|L|个PD,&#xff08;其中|L|为层数&#xff09; 如何将每一层转换成一个PD&#xff1f; 为了评估第&#x1d457;层的激活值&#xff0c;我们需要&#x1d450;个输入来获…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...