【UCB CS 61B SP24】Lecture 3 - Lists 1: References, Recursion, and Lists學習筆記

本文開坑伯克利 CS 61B(算法與數據結構)2024年春季課程學習筆記,Lecture 1 & Lecture 2 的內容為課程介紹與 Java 基礎,因此直接跳過。本文內容為介紹基本數據類型與引用數據類型的區別,以及手動實現整數列表。

1. 基本數據類型 & 引用數據類型

在 Java 中,所有數據類型可以分為兩大類:Primitive Types(基本數據類型) 和 Reference Types(引用數據類型)。基本數據類型是 Java 語言內置的、最基礎的數據類型,它們直接存儲值,而不是對象的引用

Java 提供了8種基本數據類型,分別是:byteshortintlongfloatdoublecharboolean。基本數據類型直接存儲值,存儲在棧內存中,訪問速度快,因為棧內存的讀寫效率高于堆內存。

引用數據類型是指存儲在堆內存中的對象的引用。它們通過對象的引用(內存地址)來訪問對象的實際數據。引用數據類型包括:類(Class)、接口(Interface)、數組(Array)、枚舉(Enum)、包裝類(Wrapper Classes)。

看下面這個例子:

package CS61B.Lecture3;public class PollQuestions {public static void main(String[] args) {Walrus a = new Walrus(1000, 8.3);Walrus b;b = a;b.weight = 5;System.out.println(a);  // Weight: 5, TuskSize: 8.30System.out.println(b);  // Weight: 5, TuskSize: 8.30int x = 5;int y;y = x;y = 2;System.out.println(x);  // 5System.out.println(y);  // 2}public static class Walrus {public int weight;public double tuskSize;public Walrus(int weight, double tuskSize) {this.weight = weight;this.tuskSize = tuskSize;}public String toString() {return String.format("Weight: %d, TuskSize: %.2f", weight, tuskSize);}}
}

對于基本數據類型,執行 y = x 實際上是將 x 在內存中所存放的值復制y,兩個變量互相獨立。

Walrus 類的對象為引用數據類型,當聲明任何引用類型的變量時,無論對象類型是什么,Java 都精確地分配一個64位大小的空間,這些位可以設置為 null(全為零)或該類的特定實例的64位地址(由 new 返回)。

我們創建了一個 Walrus 對象,并將其引用賦值給變量 a。此時,a 指向堆內存中的一個 Walrus 對象,而之后又聲明了一個變量 b,并將 a 的引用復制b。此時,ab 都指向同一個 Walrus 對象(內存地址相同)。換句話說,ab同一個對象的兩個引用

通過 IDEA 的 Java Visualizer 插件進行調試可以直觀地看到不同數據在內存中的情況:

在這里插入圖片描述

對于函數的參數傳遞同樣會完成復制值的操作,例如以下代碼的 doStuff 方法接收的參數 w 執行了 w = walrus 操作,而 walrus 變量為一個 Walrus 類的對象地址,因此 w 接收到的是從 walrus 那復制過來的地址,而不像 x 接收到的是從 a 復制過來的值:

package CS61B.Lecture3;public class ParameterPassing {public static void main(String[] args) {Walrus walrus = new Walrus(3500, 10.5);int a = 9;doStuff(walrus, a);System.out.println(walrus);  // Weight: 2500, TuskSize: 10.50System.out.println(a);  // 9}public static void doStuff(Walrus w, int x) {w.weight -= 1000;x -= 5;}public static class Walrus {public int weight;public double tuskSize;public Walrus(int weight, double tuskSize) {this.weight = weight;this.tuskSize = tuskSize;}public String toString() {return String.format("Weight: %d, TuskSize: %.2f", weight, tuskSize);}}
}

2. 數組與列表

數組不是基本數據類型,因此也需要用 new 進行初始化:

int[] a = new int[]{0, 1, 2, 3}

數組的大小在創建時必須指定,并且一旦創建,其大小不能改變,數組的值存儲在堆內存中,但數組變量(引用)存儲在棧內存中,也就是上述代碼中的變量 a

列表的大小可以動態變化,可以根據需要添加或刪除元素,列表本身是一個對象,存儲在堆內存中,其內部通過動態數組或其他數據結構(如鏈表)來存儲元素。

我們先手動實現一個整數列表:

package CS61B.Lecture3;public class IntList {public int val;public IntList next;public IntList(int val) {this.val = val;this.next = null;}public static void main(String[] args) {IntList L = new IntList(5);L.next = new IntList(3);L.next.next = new IntList(10);while (L != null) {System.out.print(L.val + " ");L = L.next;}  // 5 3 10}
}

其可視化效果如下:

在這里插入圖片描述

同樣我們還能構建一個反向列表,即元素在首部插入:

package CS61B.Lecture3;public class IntList {public int val;public IntList next;public IntList(int val, IntList next) {this.val = val;this.next = next;}public static void main(String[] args) {IntList L = new IntList(5, null);L = new IntList(3, L);L = new IntList(10, L);while (L != null) {System.out.print(L.val + " ");L = L.next;}  // 10 3 5}
}

最后我們可以實現求解列表長度以及獲取某個元素的方法:

package CS61B.Lecture3;public class IntList {public int val;public IntList next;public IntList(int val, IntList next) {this.val = val;this.next = next;}// 使用遞歸求解列表長度public int sizeRecursive() {if (this.next == null) {return 1;} else return 1 + this.next.sizeRecursive();}// 使用遍歷求解列表長度public int sizeIterative() {int res = 0;IntList p = this;  // 創建一個指向當前地址的變量while (p != null) {res++;p = p.next;}return res;}// 使用遞歸求解列表第i個元素public int getVal(int i) {if (i >= this.sizeRecursive()) {System.out.println(String.format("Index %d is out of range!", i));return 0;}if (i == 0) return this.val;else return this.next.getVal(i - 1);}public static void main(String[] args) {IntList L = new IntList(5, null);L.next = new IntList(3, null);L.next.next = new IntList(10, null);System.out.println(L.sizeRecursive());  // 3System.out.println(L.sizeIterative());  // 3System.out.println(L.getVal(2));  // 10while (L != null) {System.out.print(L.val + " ");L = L.next;}  // 5 3 10}
}

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

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

相關文章

每日學習Java之一萬個為什么

9.Class <?> class1 Myclass.class 為什么要有通配符&#xff1f;傳給誰用的&#xff1f; 首先&#xff0c;這里的class特指某個對象在JVM中的元數據集合。 有普通、接口、數組、基本類型、 void 類型、局部類、匿名類、枚舉、注解 1.類型安全&#xff1a;通配符允許…

【算法】787. 歸并排序

題目 歸并排序 思路 和快排一樣&#xff0c;先判斷數據是否沒有或者只為一個&#xff1b;如果大于一個&#xff0c;取中間的值一分為二&#xff0c;然后兩邊遞歸&#xff0c;歸并的實質是把兩個有序數組排成一個&#xff0c;兩個數組都從頭開始比較&#xff0c;把更小的取下…

濾波器 | 原理 / 分類 / 特征指標 / 設計

注&#xff1a;本文為 “濾波器” 相關文章合輯。 未整理去重。 淺談濾波器之 —— 啥是濾波器 原創 RF 小木匠 射頻學堂 2020 年 03 月 25 日 07:46 濾波器&#xff0c;顧名思義&#xff0c;就是對信號進行選擇性過濾&#xff0c;對不需要的信號進行有效濾除。按照其傳輸信…

DeepSeek-學習與實踐

1.應用場景 主要用于學習與使用DeepSeek解決問題, 提高效率. 2.學習/操作 1.文檔閱讀 文檔 DeepSeek -- 官網, 直接使用 --- 代理網站 --- 極客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的資料 資料 20250209DeepSeekC…

分布式架構與XXL-JOB

目錄 先了解什么是任務調度&#xff1f; 什么是分布式任務調度&#xff1f; 了解XXL-JOB分布式任務調度平臺 如何搭建XXL-JOB&#xff1f; 分片廣播 作業分片方案 最近學習在項目的媒資管理模塊如何高效處理大量視頻&#xff0c;上傳單個視頻可能涉及到轉碼&#xff0c…

如何解決服務器端口被攻擊:全面防護與快速響應

服務器端口被攻擊是網絡安全中常見的問題之一&#xff0c;尤其是當服務器暴露在公共網絡上時&#xff0c;容易成為黑客的目標。攻擊者可能通過掃描開放端口、利用漏洞或發動拒絕服務&#xff08;DoS/DDoS&#xff09;攻擊來破壞服務器的正常運行。本文將詳細介紹如何檢測、防御…

在高流量下保持WordPress網站的穩定和高效運行

隨著流量的不斷增加&#xff0c;網站的穩定和高效運行變得越來越重要&#xff0c;特別是使用WordPress搭建的網站。流量過高時&#xff0c;網站加載可能會變慢&#xff0c;甚至崩潰&#xff0c;直接影響用戶體驗和網站正常運營。因此&#xff0c;我們需要采取一些有效的措施&am…

MyBatis-Plus之通用枚舉

MyBatis-Plus之通用枚舉 前言 MyBatis-Plus中提供了通用枚舉&#xff0c;簡單來說就是將數據庫中的某一字段的代替的含義轉換成真實的含義將數據展示給用戶&#xff0c;用戶在存儲時也會將真實值轉換成代替的數字存入到數據庫中。舉個例子&#xff1a;用戶性別在數據庫中存儲…

鴻蒙應用中使用本地存儲實現數據共享

在鴻蒙應用開發中&#xff0c;使用本地存儲來保存和共享數據是一個常見的需求。通過本地存儲&#xff0c;我們可以在不同的頁面之間共享數據&#xff0c;避免重復加載數據&#xff0c;提高應用的性能和用戶體驗。本文將詳細介紹如何在鴻蒙應用中使用 AppStorage 實現數據的保存…

Comsol 二維Voronoi泰森多邊形結構振動傳輸特性

Voronoi 泰森多邊形結構在振動傳輸特性方面具有一些獨特的特點&#xff1a; 1. 頻率特性&#xff1a;Voronoi 泰森多邊形結構的頻率特性受到其幾何形狀和材料特性的影響。不規則的邊界和內部區域的形狀、尺寸和材料會影響結構的振動模態和頻率響應。 2. 波的傳播&#xff1a;…

解析DrugBank數據庫數據|Python

一、DrugBank 數據庫簡介 DrugBank 是一個綜合性的生物信息學和化學信息學數據庫&#xff0c;專門收錄藥物和靶點的詳細信息。它由加拿大阿爾伯塔大學的 Wishart 研究組 維護&#xff0c;提供化學、藥理學、相互作用、代謝、靶點等多方面的藥物數據。DrugBank 結合了實驗數據和…

YOLOv11-ultralytics-8.3.67部分代碼閱讀筆記-dataset.py

dataset.py ultralytics\data\dataset.py 目錄 dataset.py 1.所需的庫和模塊 2.class YOLODataset(BaseDataset): 3.class YOLOMultiModalDataset(YOLODataset): 4.class GroundingDataset(YOLODataset): 5.class YOLOConcatDataset(ConcatDataset): 6.class Sema…

LeetCode - 18 四數之和

題目來源 18. 四數之和 - 力扣&#xff08;LeetCode&#xff09; 題目描述 給你一個由 n 個整數組成的數組 nums &#xff0c;和一個目標值 target 。請你找出并返回滿足下述全部條件且不重復的四元組 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若兩個四元組元素一一…

pt100 2線和3線的區別?

3線比2線更穩定一些&#xff1b; 在電路中&#xff0c;b和c是不連接在一起的&#xff1b; 測試的時候&#xff0c;b和c是接在一起的&#xff0c;也就是說pt100中b和c是連接在一起的 3線比2線多一個反饋&#xff1b; 平時測試的時候&#xff0c;測試一下ab或者ac 都是一樣的…

使用QT讀取文件,生成json文件

前言&#xff1a; 最近我遇到了一個需要讀取本地文件生成json文件的問題&#xff0c;在這里分享下如何在qt中寫一個生成json的程序當然也可以使用一些可視化的工具來寫json文件(比如&#xff1a;notepad–,還有一些ide都可以)&#xff0c;但未免太過于麻煩本文會以一個以qmake…

國產編輯器EverEdit -告別東找西找!一鍵打開當前文件所在目錄!

1 文件操作 2 應用場景 在文件編輯過程中&#xff0c;有時需要對文件進行一些操作&#xff0c;比如&#xff1a;在命令窗口輸入文件路徑、文件名&#xff0c;進入到文件目錄&#xff0c;對文件進行壓縮等&#xff0c;如果沒有直達命令&#xff0c;用戶需要通過文件管理器找到目…

【Docker】百度網盤:基于VNC的Web訪問及后臺下載

本教程通過 Docker Compose 部署百度網盤的 VNC 版本&#xff0c;實現24小時不間斷下載、雙模式訪問、數據持久化、自動重啟和安全加密控制等核心功能。 目錄結構規劃 建議使用以下目錄結構&#xff08;可根據實際情況調整&#xff09;&#xff1a; ~/baidunetdisk/├── d…

立創實戰派ESP32-S3燒錄小智AI指南

小智 AI 聊天機器人-開源項目介紹 本項目是一個開源項目&#xff0c;主要用于教學目的。我們希望通過這個項目&#xff0c;能夠幫助更多人入門 AI 硬件開發&#xff0c;了解如何將當下飛速發展的大語言模型應用到實際的硬件設備中。無論你是對 AI 感興趣的學生&#xff0c;還是…

【設計模式】【創建型模式】原型模式(Prototype)

&#x1f44b;hi&#xff0c;我不是一名外包公司的員工&#xff0c;也不會偷吃茶水間的零食&#xff0c;我的夢想是能寫高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 歡迎點贊、收藏、關注&#xff0c;跟上我的更新節奏 &#x1f3b5; 當你的天空突…

Weblogic 反序列化漏洞深度剖析與復現

目錄 一、引言 二、Weblogic 反序列化漏洞原理 &#xff08;一&#xff09;什么是反序列化 &#xff08;二&#xff09;Weblogic 反序列化漏洞產生機制 三、Weblogic 反序列化漏洞危害 四、Weblogic 反序列化漏洞復現 &#xff08;一&#xff09;復現環境準備 &#xff…