Java 列表復制與對象引用

Java 列表復制與對象引用

一、知識點

1. 對象引用的基本概念

在 Java 中,List<School> 這樣的集合存儲的并不是真正的對象,而是對象的“地址”(引用)。就好比你有一個文件柜,文件柜里放的不是文件本身,而是指向文件存放位置的標簽。集合中的每個元素都指向堆內存中的實際對象實例。

2. 列表復制與對象引用

當你用 new ArrayList<>(schools) 復制一個列表時,新列表(比如 sortedSchools)只是把原列表(schools)中對象的“地址”復制了一遍,而不是復制對象本身。也就是說,兩個列表中的元素都指向同一個對象實例,就像兩個標簽指向同一個文件。

3. 對象屬性修改的影響

因為兩個列表中的元素指向同一個對象,所以當你修改復制后的列表(sortedSchools)中對象的屬性時,原列表(schools)中對應的對象屬性也會跟著變。就好比你通過一個標簽修改了文件內容,另一個標簽指向的文件內容也會變。

4. 避免原列表被修改的方法

如果你希望修改復制后的列表時不影響原列表,可以在復制列表時創建新的對象,而不是直接復制引用。比如用構造函數重新創建對象:

List<School> sortedSchools = new ArrayList<>();
for (School school : schools) {sortedSchools.add(new School(school.abbreviation, school.totalStudents));
}

這種方法雖然能避免原列表被修改,但會增加內存開銷(因為要創建新的對象實例)和處理時間(因為要調用構造函數)。


二、面試題

1. 基礎概念題

題目:請解釋在 Java 中 List<School> 存儲的是 School 對象還是對象的引用?并說明當使用 new ArrayList<>(schools) 復制列表時會發生什么?

答案List<School> 存儲的是 School 對象的引用,而不是對象本身。就好比你有一個文件柜,文件柜里放的是指向文件的標簽,而不是文件本身。當使用 new ArrayList<>(schools) 復制列表時,新列表只是復制了原列表中對象的引用(標簽),而不是創建新的對象實例。也就是說,新列表和原列表中的元素都指向堆內存中同一個對象。

2. 代碼分析題

題目:以下是一段 Java 代碼,請分析代碼的輸出結果,并解釋原因。

import java.util.ArrayList;
import java.util.List;class School {String abbreviation;int totalStudents;int unassignedStudents;int supervisors;public School(String abbreviation, int totalStudents) {this.abbreviation = abbreviation;this.totalStudents = totalStudents;this.unassignedStudents = totalStudents;this.supervisors = 0;}
}public class Main {public static void main(String[] args) {List<School> schools = new ArrayList<>();School school1 = new School("ABC", 100);schools.add(school1);List<School> sortedSchools = new ArrayList<>(schools);for (School school : sortedSchools) {if (school.unassignedStudents > 0) {school.unassignedStudents -= 20;school.supervisors++;}}System.out.println("原列表 schools 中學校的未分配學生數: " + schools.get(0).unassignedStudents);}
}

答案:輸出結果是 原列表 schools 中學校的未分配學生數: 80。原因如下:

  • sortedSchools 是通過 new ArrayList<>(schools) 復制的,它只是復制了 schools 中對象的引用,而不是創建新的對象實例。
  • sortedSchools 中修改對象的屬性(比如 unassignedStudentssupervisors),因為引用的是同一個對象,所以 schools 中對應的對象屬性也會被修改。因此,schools.get(0).unassignedStudents 的值會從 100 變為 80。
3. 優化策略題

題目:如果希望在上述代碼中,對 sortedSchools 中 School 對象屬性的修改不影響 schools 列表,應該如何修改代碼?請說明這種修改的優缺點。

答案

  • 修改方法:在復制列表時創建新的 School 對象,而不是直接復制引用。修改后的代碼如下:
    List<School> sortedSchools = new ArrayList<>();
    for (School school : schools) {sortedSchools.add(new School(school.abbreviation, school.totalStudents));
    }
    
  • 優點:這樣可以保證原列表 schools 不會被 sortedSchools 的操作所影響,數據的獨立性更好。就像你復制了一份文件,修改副本不會影響原始文件。
  • 缺點:會增加內存開銷(因為需要創建新的對象實例),同時也會增加處理時間(因為每次復制都要調用構造函數來創建新對象)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899058.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899058.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何理解 Apache Iceberg 與湖倉一體(Lakehouse)?

一、什么是湖倉一體&#xff08;Lakehouse&#xff09;&#xff1f; 湖倉一體是一種融合了數據湖的靈活存儲能力與數據倉庫的高效分析功能的現代數據架構。它通過整合兩者的優勢&#xff0c;解決了傳統架構的局限性&#xff0c;為企業數據處理提供了更全面的解決方案。 數據湖…

Android面試總結之Android RecyclerView:從基礎機制到緩存優化

引言 在 Android 開發中&#xff0c;RecyclerView是高效展示列表數據的核心組件。其強大的性能源于獨特的視圖復用機制和四級緩存體系。本文將結合源碼與示例&#xff0c;帶你深入理解RecyclerView的工作原理與優化策略。 核心組件 RecyclerView&#xff1a;作為容器視圖&am…

【鴻蒙開發】Hi3861學習筆記- TCP客戶端

00. 目錄 文章目錄 00. 目錄01. TCP概述02. TCP應用場景03. TCP和UDP比較04. TCP相關API05. TCP編程流程06. 硬件設計07. 軟件設計08. 實驗現象09. 附錄 01. TCP概述 TCP&#xff08;Transmission Control Protocol&#xff09;是一種面向連接、可靠的傳輸層協議&#xff0c;旨…

【負載均衡系列】Keepalive

一、Keepalived 的核心功能 Keepalived 是一款用于實現 ?高可用(HA)? 和 ?負載均衡 的開源工具,核心基于 ?VRRP(Virtual Router Redundancy Protocol)? 協議,工作在網絡四層(傳輸層)和七層(應用層)。 主要用途: 通過虛擬IP(VIP)實現服務高可用(主備切換)。…

2025-03-25 學習記錄--C/C++-PTA 習題9-3 平面向量加法

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 習題9-3 平面向量加法 本題要求編寫程序&#xff0c;計算兩個二維平面向量的和向量。 輸入格式: ? 輸入在…

23種設計模式-橋接(Bridge)設計模式

橋接設計模式 &#x1f6a9;什么是橋接設計模式&#xff1f;&#x1f6a9;橋接設計模式的特點&#x1f6a9;橋接設計模式的結構&#x1f6a9;橋接設計模式的優缺點&#x1f6a9;橋接設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是橋接設計模式…

python:music21 構建 LSTM+GAN 模型生成爵士風格音樂

keras_lstm_gan_midi.py 這是一個結合 LSTM 和 GAN 生成爵士風格音樂的完整Python腳本。這個實現包含音樂特征提取、對抗訓練機制和MIDI生成功能&#xff1a; import numpy as np from music21 import converter, instrument, note, chord, stream from tensorflow.keras.mode…

go:前后端分離

1.前端代碼 新建一個前端文件夾&#xff0c;在該文件夾下新建一個.html文件&#xff0c;寫入自己的html代碼。 前端搞定。 2.后端代碼 其核心是掛載路由接受前端傳來的數據核心代碼如下&#xff1a; func main() { // 服務運行提示 fmt.Println("go web server is runn…

大數據學習(86)-Zookeeper去中心化調度

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

JetsonNano —— 4、Windows下對JetsonNano板卡燒錄刷機Ubuntu20.04版本(官方教程)

介紹 NVIDIA Jetson Nano? 開發者套件是一款面向創客、學習者和開發人員的小型 AI 計算機。按照這個簡短的指南&#xff0c;你就可以開始構建實用的 AI 應用程序、酷炫的 AI 機器人等了。 燒錄刷機 1、下載 Jetson Nano開發者套件SD卡映像 解壓出.img文件并記下它在計算機上的…

HTML5 拖放(Drag and Drop)學習筆記

一、HTML5 拖放簡介 HTML5 拖放&#xff08;Drag and Drop&#xff09;是HTML5標準的一部分&#xff0c;允許用戶抓取一個對象并將其拖動到另一個位置。拖放功能在現代網頁中非常常見&#xff0c;例如文件上傳、任務管理、布局調整等場景。 HTML5 拖放功能支持以下瀏覽器&…

文件I/O--C++的文件操作

一、打開文件&#xff0c;從文件中讀取、寫入文件 從文件中讀取數據&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以這句可以省略&#xff0c;現在不能了 using namespace std;i…

Redis GEO 命令詳解:輕松實現“附近的人“功能

目錄 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令詳解 命令應用示例 添加地點信息 查詢兩地距離 查詢附近的城市 實現"查找附近的人"功能 功能需求與實現思路 基本需求 實現思路 命令實現方案 存儲用戶位置 查詢附近的用戶 Java代碼實…

C語言貪吃蛇實現

When the night gets dark,remember that the Sun is also a star. 當夜幕降臨時&#xff0c;請記住太陽也是一顆星星。 ————《去月球海灘篇》 目錄 文章目錄 一、《貪吃蛇》游戲介紹 二、WIN32部分接口簡單介紹 2.1 控制臺窗口大小設置 2.2 命令行窗口的名稱的變更 2…

NIO入門

IO和NIO的區別&#xff1a; IO&#xff1a;通過流處理數據&#xff0c;僅支持阻塞IO。 核心組件&#xff1a;InputStream /OutputStream用于字節的讀寫&#xff0c;Reader / Writer&#xff1a;用于字符流的讀寫。讀取過程中無法被中斷&#xff0c;是阻塞式IO。 NIO:通過管道處…

基于vue.js開發的家庭裝修管理系統開發與設計(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 本家庭裝修管理系統采用B/S架構&#xff0c;數據庫是MySQL&#xff0c;網站的搭建與開發采用了先進的Node.js語言進行編寫&#xff0c;使用了VUE框架。該系統從兩個對象&#xff1a;由管理員和用戶來對系統進行設計構建。用戶的功能包括&#xff1a;注冊、登錄、瀏覽首頁…

OpenCV圖像拼接(5)圖像拼接模塊的用于創建權重圖函數createWeightMap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 庫中用于圖像拼接模塊的一個函數&#xff0c;主要用于創建權重圖。這個權重圖在圖像拼接過程中扮演著重…

LangGraph 怎么控制遞歸次數

這一節我們講講langgraph圖的遞歸限制 Recursion Limit&#xff0c;遞歸限制設置了圖在單次執行過程中可以執行的最大超級步驟數。一旦達到該限制&#xff0c;LangGraph 將引發 GraphRecursionError 錯誤。默認情況下&#xff0c;此值設置為 25 步。遞歸限制可以在運行時為任何…

08-項目中不可控的任務如何安排和驗收

項目中有時會有一些任務的時間是不可控的&#xff0c;不可控的原因在于該工作完全受制于他人。意思就是如果其他人沒有做好&#xff0c;比如前后端同步開發&#xff0c;前端通常可能會快一些&#xff0c;然后要等后端提供接口&#xff0c;這個時候聯調工作是沒辦法開展的&#…

【Git】git cherry-pick(將某個分支的 commit 改動復制到當前分支)

文章目錄 ?一、基礎用法1.1、?應用單個提交1.2、?應用多個非連續提交1.3、?應用多個連續提交 ?二、高級用法?2.1、沖突處理?2.2、放棄操作?2.3、?不自動提交2.4、應用分支的最新提交 ?一、基礎用法 1.1、?應用單個提交 使用提交的哈希值&#xff08;可通過 git lo…