1. 使用流程对比

  • ListView:

    1. 布局XML: 在布局文件中放置 <ListView> 控件,指定 id (如 android:id="@+id/listView")。
    2. 数据适配器 (Adapter): 继承 BaseAdapterArrayAdapter / CursorAdapter / SimpleAdapter
      • 重写 getCount():返回数据项总数。
      • 重写 getItem(int position):返回指定位置的数据对象。
      • 重写 getItemId(int position):返回指定位置项的 ID(通常就是 position)。
      • 核心:重写 getView(int position, View convertView, ViewGroup parent)
        • 检查 convertView 是否为空(是否有可复用的视图)。为空则通过 LayoutInflater 从布局 XML 文件 inflate 一个新视图。
        • 查找视图中的子控件(如 TextView, ImageView)。
        • 根据 position 获取数据对象。
        • 将数据对象绑定到子控件上。
        • 手动处理视图复用: convertView 机制是实现复用的关键,开发者需要自己管理。
    3. 设置适配器: 在 Activity/Fragment 中,findViewById 获取 ListView 实例,调用 setAdapter(adapter) 设置适配器。
    4. (可选) 设置监听器:setOnItemClickListener, setOnItemLongClickListener
  • RecyclerView:

    1. 布局XML: 在布局文件中放置 <androidx.recyclerview.widget.RecyclerView> 控件,指定 id (如 android:id="@+id/recyclerView")。
    2. ViewHolder 模式 (强制): 创建一个继承自 RecyclerView.ViewHolder 的内部类。
      • 在构造方法中 findViewById,持有 Item 布局中子控件的引用。
    3. 适配器 (Adapter): 继承 RecyclerView.Adapter<YourViewHolder>
      • 重写 onCreateViewHolder(ViewGroup parent, int viewType)
        • 使用 LayoutInflater 从布局 XML 文件 inflate Item 视图。
        • 创建并返回一个 YourViewHolder 实例(传入刚 inflate 的视图)。
      • 重写 onBindViewHolder(YourViewHolder holder, int position)
        • 根据 position 获取数据对象。
        • 通过 holder 对象访问其持有的子控件引用。
        • 将数据对象绑定到这些子控件上。
      • 重写 getItemCount():返回数据项总数。
      • (可选) 重写 getItemViewType(int position) 用于处理多种类型的 Item。
    4. 设置布局管理器 (LayoutManager - 必需):
      • RecyclerView 必须 设置一个 LayoutManager
      • 常用实现:
        • LinearLayoutManager: 线性列表(垂直或水平)。
        • GridLayoutManager: 网格布局。
        • StaggeredGridLayoutManager: 瀑布流布局。
      • 代码:recyclerView.setLayoutManager(new LinearLayoutManager(context));
    5. 设置适配器: recyclerView.setAdapter(yourAdapter);
    6. (可选) 设置 Item 装饰 (ItemDecoration) 和 Item 动画 (ItemAnimator): 提供分割线、间隔、增删改动画等。
    7. (可选) 处理点击事件: RecyclerView 没有内置 OnItemClickListener。需要在 ViewHolder 的构造函数中或在 onBindViewHolder 里为 Item 视图或其子控件设置点击监听 (setOnClickListener)。

流程关键差异:

  • ViewHolder 强制化: RecyclerView 强制使用 ViewHolder 模式,将 findViewById 的开销从频繁调用的 onBindViewHolder 移到了只调用几次的 onCreateViewHolder 中,显著提升性能。
  • 布局分离: RecyclerView 通过 LayoutManager 将布局策略(线性、网格、瀑布流)完全解耦,无需为不同布局重写整个适配器。
  • 事件处理: ListView 提供内置 Item 点击监听,RecyclerView 需要手动实现,灵活性更高(可以监听 Item 内任意子控件的点击)。
  • 复用机制: ListView 的复用 (convertView) 需要开发者在 getView 中手动管理。RecyclerView 的复用由系统通过 Adapter (onCreateViewHolder/onBindViewHolder) 和 LayoutManager 自动处理,开发者只需遵循 ViewHolder 模式。

2. 应用场景对比

  • ListView (当前适用场景非常有限):

    • 维护非常老旧的 Android 项目(API level < 21 或未引入支持库)。
    • 需要实现极其简单静态单类型性能要求不高的短列表。
    • 不推荐在新项目中使用。
  • RecyclerView (现代首选):

    • 绝大多数列表/网格/瀑布流需求。
    • 需要复杂布局(多种 Item 类型)。
    • 需要高度定制化的布局(如水平滑动列表、网格、交错网格、自定义排列)。
    • 需要精细控制项目动画(增、删、改、移动)。
    • 需要添加项目装饰(如分割线、间隔、高亮)。
    • 需要高性能处理超长列表复杂 Item 布局
    • 需要局部更新数据(notifyItemChanged(), notifyItemInserted() 等),避免全局刷新。
    • 所有新项目都应使用 RecyclerView。

3. 实现原理对比

  • ListView:

    • 继承自 AbsListView
    • 核心在 AdaptergetView() 系统在需要显示 Item 时调用此方法。position 指明位置,convertView 是可能可复用的旧视图(由系统管理一个复用池 - RecycleBin),parentListView 本身。
    • 复用池 (RecycleBin): ListView 内部维护一个有限的视图复用池。当 Item 滚出屏幕时,其视图可能被放入池中。当需要新的 Item 视图时,系统尝试从池中取 (getScrapView()) 一个同类型的视图 (convertView) 给 getView() 复用。开发者负责在 getView() 中检查 convertView 并重置内容。
    • 布局: ListView 自身负责垂直(或水平)堆叠排列子视图。不支持网格或瀑布流(除非自定义或使用 GridView,但 GridView 也有类似限制)。
    • 测量与布局:onMeasureonLayout 中,ListView 会遍历所有需要显示的 Item(或预估),调用它们的 measurelayout
  • RecyclerView:

    • 核心设计哲学:关注点分离 (Separation of Concerns)
      • Adapter: 负责提供数据 (getItemCount, getItem) 和创建/绑定 ViewHolder (onCreateViewHolder, onBindViewHolder)。
      • ViewHolder: 持有 Item 视图及其子控件的引用,避免重复 findViewById
      • LayoutManager: 核心创新点! 完全负责 Item 的测量布局。决定 Item 在屏幕上的摆放位置(线性、网格、瀑布流、自定义)。它管理着视图的附加/分离和复用策略。RecyclerView 本身不知道如何布局。
      • Recycler:LayoutManager 使用。LayoutManager 在需要视图时会向 Recycler 请求 (getViewForPosition)。Recycler 管理着多级缓存池 (Scrap, Cache, ViewCacheExtension, RecycledViewPool),优先从缓存中提供视图。如果缓存中没有,则要求 Adapter 创建新的 ViewHolder (onCreateViewHolder)。
      • ItemAnimator: 负责 Item 的增、删、改、移动动画。
      • ItemDecoration: 负责在 Item 周围绘制装饰(分割线、间隔、边框等),不影响 Item 的测量和布局。
    • 工作流程简述:
      1. RecyclerView 被测量和布局时,将任务委托给 LayoutManager
      2. LayoutManager 开始遍历需要显示的位置。
      3. 对于每个位置,LayoutManagerRecycler 请求该位置的视图 (getViewForPosition)。
      4. Recycler 检查各级缓存:
        • Scrap: 当前布局过程中临时分离但很快会重新附加的视图(如正在滚出但尚未完全离开屏幕的 Item)。
        • Cache: 刚刚滚出屏幕的视图(mAttachedScrap 和一级缓存)。类型匹配可直接复用。
        • ViewCacheExtension (可选): 开发者自定义的缓存层。
        • RecycledViewPool: 最终的共享池。存放被完全移除且类型相同的视图。onBindViewHolder 会被重新调用。
      5. 如果缓存中找到视图,Recycler 返回它(可能需要重新绑定数据)。
      6. 如果缓存中没有,Recycler 要求 Adapter 创建新的 ViewHolder (onCreateViewHolder)。
      7. LayoutManager 将获取到的视图添加到 RecyclerView 中并测量、布局它。
      8. 当 Item 滚出屏幕,LayoutManager 将其视图回收到 Recycler 的缓存中(通常是 Cache 或 RecycledViewPool)。

原理关键差异:

  • 架构: ListView 是相对单一的整体。RecyclerView 是高度模块化的设计(Adapter, ViewHolder, LayoutManager, ItemAnimator, ItemDecoration, Recycler),职责清晰分离,扩展性极强。
  • 布局控制: ListView 自身处理布局。RecyclerView 将布局职责完全委托给可插拔的 LayoutManager,这是实现多样化布局(网格、瀑布流)的基础。
  • 复用机制: ListView 使用相对简单的两级复用池 (ActiveView + ScrapView)。RecyclerView 使用更精细、可扩展的四级缓存机制 (Scrap + Cache + ViewCacheExtension + RecycledViewPool),并由 LayoutManagerRecycler 紧密协作管理,效率更高,尤其对复杂布局和多类型 Item。
  • ViewHolder 强制化: RecyclerViewListView 中推荐的最佳实践 (ViewHolder) 变为强制要求,从架构上保证了性能优化的基础。

4. 缓存机制对比

  • ListView (RecycleBin):

    • ActiveView: 当前屏幕上完全可见的 Item 视图。这些视图是“活跃”的。
    • ScrapView: 刚刚滚出屏幕的 Item 视图(通常存储在 mScrapViewsmRecycler 中)。当新 Item 需要进入屏幕时,系统优先尝试从 ScrapView 中获取同类型的视图作为 convertViewgetView() 复用。如果 ScrapView 中没有匹配的,可能会新建视图。ScrapView 是 ListView 主要的复用来源。
    • 特点:
      • 两级缓存(Active + Scrap)。
      • 缓存以 Item 位置 (Position) 为主要标识(虽然也看类型 itemType,但不如 RecyclerView 严格)。
      • 复用发生在 getView() 方法内部,开发者手动处理 convertView
      • 没有不同 ListView 实例间的视图共享机制。
  • RecyclerView (Recycler):

    • Scrap (Attached Scrap & Changed Scrap):
      • Attached Scrap: 在布局过程中(如 onLayout)临时从父视图分离但不需要重新绑定的视图。通常是因为布局调整(如滚动一点距离)暂时移出但很快会放回的视图。不需要调用 onBindViewHolder
      • Changed Scrap: 在布局过程中被标记为需要更新的视图(调用了 notifyItemChanged)。它们会被优先复用,并且复用时会调用 onBindViewHolder(带 payloads 如果有的话)。
    • Cache (View Cache):
      • 刚刚滚出屏幕的视图。它们被保留在内存中,类型匹配位置在屏幕附近。当用户反向滚动时,可以非常快地重新附加,且不需要重新绑定数据 (onBindViewHolder 不会被调用),因为数据假设未变。这是 RecyclerView 流畅滚动体验的关键之一。缓存大小通常有限(默认 2 个)。
    • ViewCacheExtension (可选 - 开发者扩展):
      • 开发者可以继承 ViewCacheExtension 实现自定义的缓存层。可以存储特定类型的视图或应用特殊逻辑。较少使用。
    • RecycledViewPool (回收视图池):
      • 核心优势点! 存储的是完全移除(既不在屏幕也不在 Cache/Scrap 中)且按类型 (viewType) 分类的视图 (ViewHolder)。
      • LayoutManager 请求一个视图,且 Scrap/Cache/Extension 都没有时,会到 RecycledViewPool 中查找相同 viewType 的视图。
      • 如果找到,该视图会被返回给 Adapter 进行数据重新绑定(调用 onBindViewHolder)。
      • 如果 RecycledViewPool 中也没有,则 Adapter 会创建新的 ViewHolder (onCreateViewHolder)。
      • 关键特性:
        • viewType 存储: 严格区分不同类型 Item 的视图。
        • 可跨 RecyclerView 实例共享: 多个 RecyclerView 实例(即使是不同列表)可以设置同一个 RecycledViewPool (setRecycledViewPool)。这对于具有相同 Item 类型的多个列表(如标签选择器、多 Tab 下的同类型列表)是巨大的性能优化,避免了重复创建视图的开销。
        • 池大小可配置: 可以为每种 viewType 设置最大缓存数量 (setMaxRecycledViews)。

缓存机制关键差异:

  • 层级与精细度: RecyclerView 拥有更复杂、更精细的四级缓存(特别是分离的 Scrap 和 Cache),且严格按 viewType 区分,复用更精准高效。
  • Cache 层: RecyclerView 独有的 Cache 层避免了附近 Item 滚回时昂贵的 onBindViewHolder 调用,极大提升回滚流畅度。
  • RecycledViewPool: RecyclerView 独有的 RecycledViewPool 实现了跨列表的视图复用,是 ListView 完全不具备的能力,对复杂 UI 优化意义重大。
  • 位置 vs 类型: ListView 缓存更依赖位置信息,RecyclerView 缓存则强依赖 viewType,后者在数据动态变化(增删)时更健壮。
  • 管理方式: ListView 缓存复用逻辑需要开发者在 getView 中参与(检查 convertView)。RecyclerView 的缓存完全由系统 (Recycler + LayoutManager) 自动管理,开发者只需遵循 ViewHolder 模式。

5. 优化方案对比

  • ListView 优化 (本质是优化 getView()):

    1. 利用 convertView: 这是最重要的优化!务必检查 convertView != null 并复用,避免不必要的 inflate
    2. 应用 ViewHolder 模式 (非强制但必须做):convertViewtag 中存储子控件引用 (setTag / getTag),避免每次 findViewById。这是 RecyclerView 强制化的原因。
    3. 减少 Item 布局层次和复杂度: 使用 Hierarchy ViewerLayout Inspector 分析,避免嵌套过深。使用 ConstraintLayout 替代多层嵌套的 LinearLayout/RelativeLayout
    4. 图片加载优化: 使用 Picasso, GlideCoil 等库异步加载、缓存和正确处理图片回收。
    5. 避免在 getView() 中做耗时操作: 如网络请求、复杂计算、频繁 I/O。只做数据绑定。
    6. 分批加载/分页: 对于超长列表,实现滚动到底部加载更多数据。
    7. 使用 android:scrollingCache="false" (谨慎): 禁用滚动时的颜色缓存,可能略微提升滚动性能(但可能牺牲视觉平滑度)。需测试效果。
    8. 使用 android:fastScrollEnabled="true" (仅视觉): 启用快速滚动滑块,方便用户快速导航长列表。
  • RecyclerView 优化 (充分利用其架构优势):

    1. 遵循 ViewHolder 模式: 这是基础,已在架构中保证。
    2. 合理使用 notify 方法族: 绝对避免在数据变化时总是调用 notifyDataSetChanged()!使用精细化的方法:
      • notifyItemInserted(position)
      • notifyItemRemoved(position)
      • notifyItemMoved(fromPosition, toPosition)
      • notifyItemChanged(position)
      • notifyItemRangeInserted(positionStart, itemCount) 等。
      • 使用 Payloads: 当 Item 只有部分内容变化时,在 notifyItemChanged(position, payload) 中传递变化的 payload 对象。在 AdapteronBindViewHolder(VH holder, int position, List<Object> payloads) 中根据 payloads 进行增量更新,避免重绘整个 Item。这是 RecyclerView 独有的高级优化。
    3. 优化 onCreateViewHolderonBindViewHolder
      • onCreateViewHolder:尽量高效,只做 inflate 和创建 ViewHolder。避免耗时操作。
      • onBindViewHolder:只做数据绑定。避免在此创建新对象、做耗时操作。利用 payloads 进行局部更新。
    4. 减少 Item 布局层次和复杂度:ListView 优化 3。使用高效布局和 ConstraintLayout
    5. 图片加载优化:ListView 优化 4。库通常能很好配合 RecyclerView
    6. 预加载 (Prefetching): RecyclerView 内置了预取机制(默认开启)。LayoutManager 会在空闲时间预取即将进入屏幕的 Item 视图。通常不需要手动干预。确保 LayoutManager 支持(LinearLayoutManager/GridLayoutManager 支持)。
    7. 配置 RecycledViewPool
      • 对于同类型 Item 的多个列表共享同一个 RecycledViewPool (setRecycledViewPool) 是极其重要的优化。
      • 根据应用场景和 Item 类型内存占用,调整每种 viewType 的缓存池大小 (setMaxRecycledViews)。避免过大(内存浪费)或过小(频繁创建 ViewHolder)。
    8. 使用 setItemViewCacheSize(int size) 适当增大 Cache 层的大小(默认通常是 2)。增大它可以让更多刚滚出屏幕的 Item 视图保留在 Cache 中,提升回滚性能(避免重新绑定)。但会增加内存占用。需根据 Item 复杂度和设备内存平衡。
    9. 使用 setHasFixedSize(true) 如果 RecyclerView 自身的大小不会随 Adapter 内容的变化而改变(即宽高固定或 match_parent),调用此方法可以跳过不必要的自身测量步骤,优化性能。
    10. 合理使用 DiffUtil: 当数据集发生复杂变化(多个增删改操作混合)时,使用 DiffUtil 类计算新旧数据集差异,并自动调用最合适的精细 notify... 方法。比手动计算和调用更高效且不易出错。尤其适合配合 Paging 库或后台数据更新。
    11. 选择高效的 LayoutManager 对于超大数据集或复杂 Item,LinearLayoutManager 通常是最优解。StaggeredGridLayoutManager 在布局计算上可能稍重。
    12. 优化 Item 动画: 如果不需要默认动画,设置 DefaultItemAnimatornull (setItemAnimator(null))。自定义复杂动画也可能影响性能。

优化关键差异:

  • 精细化更新: RecyclerView 通过 notifyItem... 系列方法和 DiffUtil 支持局部更新,是 ListViewnotifyDataSetChanged() 无法比拟的。
  • Payloads: RecyclerView 独有的增量更新机制,对复杂 Item 优化效果显著。
  • 缓存配置: RecyclerView 提供 setItemViewCacheSizeRecycledViewPool 的精细控制(包括跨列表共享),优化手段更丰富。
  • 预加载: RecyclerView 内置预取机制提升流畅度。
  • 固定尺寸优化: setHasFixedSize(true)RecyclerView 特有的优化点。
  • ViewHolder 基础: ListView 优化需手动实现 ViewHolder,RecyclerView 已强制使用。

总结

特性ListViewRecyclerView结论与优势
年代/状态较老,基本被弃用现代,官方推荐,持续更新RecyclerView 是未来
架构相对单一高度模块化 (Adapter, VH, LayoutManager, Animator, Decoration, Recycler)RecyclerView 更灵活、可扩展、职责清晰
布局能力仅垂直/水平线性列表通过 LayoutManager 支持线性、网格、瀑布流及任意自定义布局RecyclerView 布局能力碾压
ViewHolder推荐使用但非强制强制使用RecyclerView 从架构保证性能基础
使用流程getView() 中手动处理 convertView 和 findViewById分离 onCreateViewHolder (创建/找控件) 和 onBindViewHolder (绑定数据)RecyclerView 代码更清晰,性能更好 (findViewById 开销低)
缓存机制两级 (Active + Scrap),按位置为主四级缓存 (Scrap, Cache, Extension, Pool),严格按 viewTypeRecyclerView 缓存更精细、高效
缓存复用无跨列表共享RecycledViewPool 支持跨列表共享同类型视图RecyclerView 对多列表场景优化显著
数据更新主要 notifyDataSetChanged() (全局刷新)精细 notifyItem...() 系列方法 + DiffUtilRecyclerView 局部更新效率极高
增量更新不支持支持 Payloads (部分绑定)RecyclerView 优化复杂 Item 更新的利器
Item 动画内置简单动画强大且可定制的 ItemAnimatorRecyclerView 动画效果丰富灵活
装饰需自定义或第三方库实现分割线等内置 ItemDecoration 机制RecyclerView 添加装饰更标准方便
点击事件内置 OnItemClickListener需在 ViewHolder 或 Adapter 中手动实现ListView 简单,RecyclerView 更灵活 (监听子控件)
优化点优化 getView() (复用, ViewHolder, 布局扁平化)优化 onBindViewHolder, 使用精细 notify, Payloads, DiffUtil, 配置缓存池/大小, 预加载, 共享 Pool, setHasFixedSizeRecyclerView 提供更多、更强大的内置和可配置优化手段
应用场景维护旧代码,极简单短列表所有现代列表/网格/瀑布流需求,复杂布局,高性能长列表新项目无脑选 RecyclerView

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89596.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89596.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89596.shtml

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

相关文章

deepseekAI对接大模型的网页PHP源码带管理后台(可实现上传分析文件)

前端后端都已进行优化&#xff0c;新增可上传文件功能&#xff08;拖拽进去也可以&#xff09;&#xff0c;后端进行风格主题设置&#xff0c;优化数据结构&#xff01;依旧测试网站&#xff1a;iEPMS我的工具箱&#xff0c;你的智慧助手&#xff01;还是那句话兄弟们轻点搞我的…

NJU 凸优化导论(9) 对偶(II)KKT条件+变形重构

https://www.lamda.nju.edu.cn/chengq/optfall24/slides/Lecture_9.pdf 目录 关于对偶的一些解释 1. Max-min characterization 最大最小准则 2. Saddle-point Interpretation 鞍点解释 3. Game interpretation 博弈论里的对偶 Optimality Conditions 最优条件 1. Certi…

Vue Swiper组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue Swiper组件实现笔记 目录 Swiper组件 下载swiper 创建swiper组件 保存时修复 编写swiper内容 引入swiper 使用swiper Swiper子组件 创建Swiper列表组件 使用子组件 增加生命周期 增加图片显示 加载数据 渲染…

Linux:lvs集群技术

一.集群和分布式1.1 集群集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统。即当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c…

【管理】持续交付2.0:业务引领的DevOps-精要增订本,读书笔记(理论模型,技术架构,业务价值)

【管理】持续交付2.0&#xff1a;业务引领的DevOps-精要增订本&#xff0c;读书笔记&#xff08;理论模型&#xff0c;技术架构&#xff0c;业务价值&#xff09; 文章目录1、持续交付的理论模型&#xff08;第1-3章&#xff09;1.1 结构图1.2 持续交付的演进1.3 双环模型理论体…

Wilcox检验的星星怎么规定的?

在 R 里&#xff0c;常见的把 p 值映射为“星号”标记&#xff08;显著性水平&#xff09;的规则通常是&#xff1a;p 值范围标记p ≤ 0.0001“****”0.0001 < p ≤ 0.001“***”0.001 < p ≤ 0.01“**”0.01 < p ≤ 0.05“*”0.05 < p ≤ 0.1“.”p > 0.1…

https与DNS的运行流程

HTTPS流程&#xff1a;HTTPS核心:加了TLS层&#xff0c;加密传输身份认证TLS:信息加密、校验机制、身份证书TLS&#xff08;Transport Layer Security&#xff09;握手是建立安全通信通道的关键过程&#xff0c;发生在客户端&#xff08;如浏览器&#xff09;和服务器之间。其主…

板子 5.29--7.19

板子 5.29–7.19 目录 1. 树状数组 2. KMP 3. 矩阵快速幂 4. 数位DP 5. 状压枚举子集 6. 快速幂&#xff08;新版 7. priority_queue 8. dijkstra 9. 单调栈 10. debug内容 1. 树状数组 // 树状数组 快速求前缀和 / 前缀最大值 // 维护位置数量(离散化)...// (区间加 区间求和…

min-max容斥学习笔记

最近报了航电的春季赛&#xff0c;在一道题目里面遇到了做法&#xff0c;感觉挺有意思。 考虑一个&#xff08;多重&#xff09;集合S{ai}S\{a_i\}S{ai​}&#xff0c;有如下的等式成立 min⁡ai∈S(ai)∑T⊆S,T≠∅(−1)∣T∣−1max⁡ai∈T(ai)\min_{a_i\in S}(a_i)\sum_{T\sub…

使用帆软制作项目

https://zhuanlan.zhihu.com/p/23429318335 项目背景 为加快大数据体系建设&#xff0c;稳步推进数字化转型战略&#xff0c;规范数据架构体系和数据治理体系&#xff0c;运用大数据推进全行数字化转型建设&#xff0c;为业务发展提供创新动力&#xff0c;目标是利用金融科技和…

论C/C++的条件编译#if、#ifdef、#ifndef、#undef

我们以实例来演示&#xff1a; ------------------------------------------实验①------------------------------------------ 子函数&#xff1a;主函数&#xff1a;当定义了COMMENT_FLAG该宏&#xff0c;且其为0&#xff0c;则运行结果如下&#xff1a;只执行了sub_func_1函…

21、鸿蒙Harmony Next开发:组件导航(Navigation)

目录 设置页面显示模式 设置标题栏模式 设置菜单栏 设置工具栏 路由操作 页面跳转 页面返回 页面替换 页面删除 移动页面 参数获取 路由拦截 单例跳转 子页面 页面显示类型 页面生命周期 页面监听和查询 页面转场 关闭转场 自定义转场 共享元素转场 跨包…

“外卖大战”正在改变国内“大零售”

出品 | 何玺排版 | 叶媛7月18日&#xff0c;市场监管总局约谈美团、饿了么、京东三家外卖平台&#xff0c;要求“理性竞争、规范促销”&#xff0c;剑指近期愈演愈烈的“0元购”“0.1秒杀”等外卖补贴乱象。但约谈之后&#xff0c;平台们是真整改&#xff0c;还是玩话术&#x…

当CAN握手EtherCAT:视觉检测系统的“双芯合璧”时代来了

在汽车制造的高速生产线上&#xff0c;设备间的“语言不通”曾是工程师们的头疼事&#xff1a;CAN总线像踏实的老司机&#xff0c;稳扎稳打传输传感器数据&#xff1b;而EtherCAT网关则是追求极致速度的“闪电侠”&#xff0c;主导着实时控制的重任。当视觉检测系统需要同时对接…

【C语言】动态内存管理全解析:malloc、calloc、realloc与free的正确使用

C语言学习 动态内存分配 友情链接&#xff1a;C语言专栏 文章目录C语言学习前言&#xff1a;一、为什么要有动态内存分配二、malloc和free2.1 malloc2.2 free三、calloc和realloc3.1 calloc3.2 realloc总结附录上文链接下文链接专栏前言&#xff1a; 在C语言编程中&#xff0…

基于Arduino智能家居环境监测系统—以光照强度检测修改

2 相关技术与理论 2.1 Arduino 技术 Arduino 是一款广受欢迎的开源电子原型平台&#xff0c;由硬件和软件组成&#xff0c;为开发者提供了便捷且低成本的解决方案&#xff0c;尤其适用于快速搭建交互式电子项目&#xff0c;在本智能家居环境监测系统中担当核心角色。​ 硬件方…

前端上传 pdf 文件 ,前端自己解析出来 生成界面 然后支持编辑

要在前端解析 PDF 文件并生成可编辑界面&#xff0c;我们可以使用 PDF.js 库来解析 PDF 内容&#xff0c;然后将其转换为可编辑的 HTML 元素。 主要特点和工作原理如下&#xff1a; PDF 解析&#xff1a; 使用 Mozilla 的 PDF.js 库解析 PDF 文件内容&#xff0c;提取文本信息。…

Linux“一切皆文件“设计哲学 与 Linux文件抽象层:struct file与file_operations的架构解析

在Linux系统中&#xff0c;“一切皆文件”&#xff08;Everything is a file&#xff09;是一个核心设计哲学&#xff0c;它抽象了系统资源的访问方式&#xff0c;使得几乎所有硬件设备、进程、网络连接等都可以通过统一的文件接口&#xff08;如open()、read()、write()、clos…

蓝桥杯零基础到获奖-第3章 C++ 变量和常量

蓝桥杯零基础到获奖-第3章 C 变量和常量 文章目录一、变量和常量1.变量的创建2.变量初始化3.变量的分类4.常量4.1 字⾯常量4.2 #define定义常量4.3 const 定义常量4.4 练习练习1&#xff1a;买票https://www.nowcoder.com/practice/0ad8f1c0d7b84c6d8c560298f91d5e66练习2&…

物理AI是什么技术?

当英伟达CEO黄仁勋在链博会上明确提出“物理AI将是AI的下一浪潮”时&#xff0c;这个看似陌生的概念瞬间引发了科技圈的广泛关注。究竟什么是物理AI&#xff1f;它与我们熟悉的人工智能有何不同&#xff1f;又将如何重塑我们与物理世界的交互方式&#xff1f; 物理AI&#xff1…