【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.mzph.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…