RecyclerView與ListView深度對比分析

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…