本系列笔记基于官网发布的slides,videos,textbook以及B站Lecture视频编写。
CS61B官网(2025 Fall):CS 61B Fall 2025
CS61B Lecture(2024 Spring):CS61B Lecture sp24
注:本课程使用的编程语言为Java,但是否熟悉这个语言对学习此课程影响不大。(个人认为它相当于C++去掉C)
关于Java的安装配置,可参考:Java开发环境配置教程。如果你和我一样使用的是vscode,并且电脑上已经安装了java版minecraft,那么只需要在vscode中安装对应的java插件就行()
但为了更好理解本课程,下面给出一些Java的基本语法。其实笔者也是第一次学QAQ
# Getting started - Introduction of Java
从经典的Hello world开始:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello"+" "+"world!");
//注意java输出多个内容时中间使用+而不是,
}
}
可以看出,和python相比,Java的语法繁杂很多,但和C/C++语法比较类似。
- 一些基本语法:
- Java的所有语句都必须放在 类(Classes) 中。
- 需要运行的代码必须放在
public static void main(String[] args)里(之后会解释具体的含义) - 代码块必须用
{}包裹,每个语句必须以;结尾。
# Java工作流
- 运行
.java文件通常经过两个过程:编译(compilation)和解释(interpretation)。 - 以上面的
HelloWorld.java文件(java文件名必须和public class名称相同)为例,当我们使用命令行操作文件时,先输入:
javac HelloWorld.java
将java文件编译为.class文件(如果我们尝试查看文件内容,会发现一堆乱码)。接下来,我们再执行:
java HelloWorld
程序就会开始执行。
使用.class文件有若干优点,包括更安全的代码共享,更高效的运行效率,保护编写者的知识产权等。但这里不会详细涉及。
# 更多的Java语法
# 变量
- 以一段输出0到9之间的整数为例:
public class HelloNumbers {
public static void main(String[] args) {
int x = 0;
while (x < 10) {
System.out.print(x + " ");
//print和println的区别在于println输出后自动换行,而print不换行
x = x + 1;
}
}
}
- 可以发现java定义变量的语法和C/C++类似,需要提前声明并确定变量类型,且不能随意更改变量类型。(这种程序语言被称为 静态类型语言statically typed language )
- 当然,java还有一个独特的特性。当我们尝试组合输出不同类型的数据时(如下例):
public class HelloWorld {
public static void main(String []args) {
System.out.println(114514+"homo");
}
}
程序会顺利输出114514homo。这是C/C++和python都做不到的。这是因为java的编译器在识别到+的一边为字符串后,会自动将另一边转换为字符串并合并。
# 函数
- java定义函数也与C/C++类似,需要声明参数的数据类型,以及返回的数据类型。例子如下:
public class LargerDemo {
public static int larger(int x, int y) {
if (x > y) {
return x;
}
return y;
}
public static void main(String[] args) {
System.out.println(larger(8, 10));
}
}
- 注意所有函数都应该放在
public static中(这类似于python中的def),可以与public static void main(String[] args){}并列。(main本身也是一个函数)另外,函数只能返回一个值。 - 当然定义函数还有其他方式,之后也会提到。
# 代码风格与注释
- 和其他语言一样,在编写程序时我们应尽量提高程序的可读性。
- 关于代码的编写风格,这因人而异,但核心点在于能让他人轻松读懂你的代码。
- 注释:和C/C++一样,java使用
//进行单行注释,/* */进行多行注释。 - 另外,在CS61A课程中,我们提到python支持在函数内编写文档字符串(docstring)。事实上,java也支持类似的操作,只需要在函数体开头加入
/** */(这被称为javadoc),在其中就可以编写函数的功能描述(尽量控制在一行)。javadoc还支持加入标签(tags),在这里不详细讨论。
以上便是java的一些基础介绍。更多java用法可见java菜鸟教程。
# 关于CS61B
-
与CS61A不同,本课程着重于高效地编写能够高效运行的程序,包括熟练掌握一些好的算法与数据结构,以及能够完整地设计、编写并调试大型程序,同时能使用包括但不限于git,IntelliJ IDEA(或其他编程环境),断言测试(如JUnit,Truth),大模型等编程工具。
-
同时,本课程假定你已经掌握了一些编程的基础知识,包括:基于对象的编程,递归,列表,树等。
-
本课程主要分为三大部分:
- Java和数据结构基础
- 数据结构(和一部分软件工程)
- 算法与软件工程
-
另外,本课程非常注重实践,所以会有大量的作业,实验与项目。(之后可能会考虑放一些自己做的在博客里)
-
补充:关于学习路线,引用B站用户“适嘉”的评论作为参考:
数据结构推荐18,然后第四节课的list听25fall新增了循环列表;渐进分析之后都可以,因为变化不大,可以听21的视频因为我觉得课堂效果没有那么好,想听课堂版可以采用25fall的live版,因为是josh讲的,sp25下半部分是大佐讲的,当然大佐思路也挺清晰,不过目前fa25 up还没有搬运,油管有;作业推荐数据结构18+sp24补充fa25的stack和comparator以及21的gitlet;剩下就都做sp24的就行,18还有一个bear map,也可以做一下,核心作业还是sp24
