跳到正文
Java 入门到面试指南
返回

01-环境搭建与基础语法

阶段:入门篇 | 建议时长:4 天 | 前置:无

学习目标

  • 独立完成 JDK 17 安装与环境变量配置,会用 java -version、javac -version 验证。
  • 手写 HelloWorld 并分别用命令行(javac/java)和 IDEA 运行成功,能说清编译运行过程。
  • 掌握 8 种基本类型、类型转换、运算符、流程控制、方法重载与可变参数,能独立写出 50 行以内的小程序。
  • 熟练使用 IDEA 断点调试(Step Over/Into、查看变量)与常用快捷键。
  • 能口头解释「Java 只有值传递」并举例验证。

核心知识点

JDK 安装与版本选择

  • 三者关系:JDK(开发工具包)⊇ JRE(运行环境)⊇ JVM(虚拟机)。开发装 JDK,只运行装 JRE。
  • 常用 LTS 版本:8(老项目存量最大)、17(当前主流,入门推荐)、21(虚拟线程)、25(最新 LTS,2025.9 发布;新项目选型)。
  • 17 相比 8 的明显变化:模块化(JPMS)、var 局部变量类型推断、Switch 表达式、文本块、record、更强的 G1 GC。
  • 安装后配置 JAVA_HOME,并把 %JAVA_HOME%\bin(Windows)或 $JAVA_HOME/bin(macOS/Linux)加入 PATH。

第一个程序与编译运行原理

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}
  • javac Hello.java 编译出 字节码文件 Hello.class;java Hello 由 JVM 加载执行(Java 11+ 可直接 java Hello.java 单文件运行)。
  • 核心机制:一次编译,到处运行——源码编译成与平台无关的 .class,不同平台的 JVM 负责解释/JIT 编译执行。
  • main 方法签名固定:public static void main(String[] args),是程序入口。

IDEA 安装与调试

  • 社区版(Community)免费够用;新建 Project 时选择 JDK 17。
  • 断点调试:行号左侧点击下断点 → Debug 运行;F8(Step Over)单步跳过、F7(Step Into)进入方法、Shift+F8 跳出、F9 放行到下一断点;调试窗口可实时查看/修改变量值。
  • 快捷键(Windows/macOS):psvm+Tab 生成 main、sout+Tab 生成输出;Alt+Enter 快速修复;Ctrl+D 复制行;Ctrl+Y 删除行;Ctrl+Alt+L 格式化;Shift+F6 重命名。

变量与 8 种基本类型

类型字节范围/说明默认值
byte1-128 ~ 1270
short2-32768 ~ 327670
int4约 ±21 亿0
long8需加后缀 L0L
float4单精度,需加 f0.0f
double8双精度,浮点默认类型0.0d
char2单个字符,0 ~ 65535‘\u0000’
boolean-true/false(JVM 层面实现决定大小)false
  • 类型转换:小→大自动提升(byte/short/char 参与运算先转 int),大→小强制转换 (int) 3.9 截断小数。
  • 整数字面量默认 int,浮点默认 double;long x = 10000000000L; 不加 L 会编译错误。
  • float/double 存在精度丢失,金额计算禁止用它们(见文件 2 的 BigDecimal)。

运算符

  • 算术:+ - * / %;整数相除结果仍是整数(5 / 2 == 2)。
  • 自增:i++ 先用后加,++i 先加后用。
  • 逻辑:&&、|| 短路——a && b 中 a 为 false 则 b 不执行;&、| 不短路(位运算)。
  • 三元:条件 ? 值1 : 值2;优先级不确定时加括号。

String 简介与 Scanner

  • String 是引用类型、不可变对象,字符串字面量存在常量池中;== 比较地址,equals() 比较内容(详见文件 2)。
  • 常用方法:length()、charAt()、substring()、indexOf()、equals()、split()。
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();          // 读整数
String line = sc.nextLine();   // 读一行字符串
  • 坑:nextInt() 后接 nextLine() 会读到换行符,需要先额外调用一次 nextLine() 清空缓冲。

流程控制

  • if / else if / else:条件必须是 boolean。
  • switch:可作用的类型——byte、short、char、int 及其包装类、枚举、String(Java 7+),不支持 long/float/double/boolean;Java 14+ 箭头表达式 case 1 -> ... 不用写 break。
  • for、while、do-while、增强 for(for (int x : arr))。
  • break 跳出本层循环,continue 跳过本次;带标签 outer: 可跳出多层(少用)。

方法、重载与可变参数

static int add(int a, int b) { return a + b; }              // 重载:参数列表不同
static double add(double a, double b) { return a + b; }     // 与返回值类型无关
static int sum(int... nums) {                               // 可变参数本质是数组
    int s = 0;
    for (int n : nums) s += n;
    return s;
}
  • 重载(overload):同一个类中方法名相同、参数列表不同;仅返回值不同不算重载。
  • 可变参数必须是参数列表的最后一个。

Java 只有值传递

面试官想听:你能区分「传值的拷贝」和「传引用的拷贝」,并用一个反例证明引用本身不会被改变。

  • Java 中永远传递的是实参的拷贝:基本类型拷贝「值」,引用类型拷贝「引用(地址)」。
  • 方法内通过引用修改对象内容会影响原对象;但让引用指向新对象不影响原引用:
static void change(int x) { x = 100; }                      // 无效
static void fill(int[] arr) { arr[0] = 100; }               // 有效:改的是对象内容
static void reassign(int[] arr) { arr = new int[]{9}; }     // 无效:改的是引用副本

数组与 Arrays 工具类

  • 声明与初始化:int[] a = new int[3];、int[] b = {1, 2, 3};;长度固定 a.length,越界抛 ArrayIndexOutOfBoundsException。
  • 二维数组:int[][] m = new int[3][4];,本质是「数组的数组」,第二维长度可不同。
  • Arrays 常用方法:toString() 打印、sort() 排序、fill() 填充、copyOf() 复制、equals() 比较、binarySearch() 二分查找(需有序)。

动手实践

任务 1:九九乘法表

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.printf("%d*%d=%-4d", j, i, i * j);
    }
    System.out.println();
}
  • 验收标准:输出标准下三角 45 行乘法口诀;列对齐(用 %-4d);改写成 while 版本结果一致。

任务 2:猜数字游戏

  • 要求:程序随机生成 1~100 的整数(new Random().nextInt(100) + 1),用户循环输入猜测,提示「大了/小了」,猜中后输出总次数并退出。
  • 验收标准:用 while(true) + break 实现;输入非法(非数字)不崩溃(用 InputMismatchException 或先读字符串再解析);能统计并输出猜测次数。

任务 3:数组冒泡排序 + 最大值

for (int i = 0; i < arr.length - 1; i++) {
    boolean swapped = false;
    for (int j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
            int t = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = t;
            swapped = true;
        }
    }
    if (!swapped) break;   // 一趟无交换说明已有序,提前结束
}
  • 验收标准:对 {5, 2, 8, 1, 9} 输出排序结果与最大值 9;加上提前退出的优化;最后用 Arrays.sort(arr) 对照验证自己的排序结果一致。

任务 4:IDEA 调试练习

  • 验收标准:在任务 3 的内层循环处打断点,Debug 运行,用 Step Over 观察每轮 i、j、swapped 的值变化,并截图记录一次「修改 Debug 窗口中的变量值后程序行为改变」。

高频面试题

Q:JDK、JRE、JVM 三者是什么关系?⭐

  • JVM 是执行字节码的虚拟机,是「跨平台」的关键。
  • JRE = JVM + Java 核心类库,只够运行程序。
  • JDK = JRE + 编译器 javac、调试器 jdb 等开发工具,开发必须装 JDK。
  • 一句话:JDK ⊃ JRE ⊃ JVM。

Q:Java 是值传递还是引用传递?⭐

  • 只有值传递。基本类型传「值的副本」,方法内修改不影响原变量。
  • 引用类型传「引用(地址)的副本」,方法内通过该引用可以修改对象内容,但重新赋值(指向新对象)不影响原引用。
  • 反例:reassign(int[] arr) 中 arr = new int[]{9} 后调用方数组不变,证明不是引用传递。

Q:switch 支持哪些类型?

  • byte、short、char、int 及其包装类(Byte/Short/Character/Integer)、枚举(Java 5+)、String(Java 7+)。
  • 不支持 long、float、double、boolean;case 必须是编译期常量且不重复。
  • Java 14+ 的箭头语法 case x -> 无需 break、不穿透。

Q:& 和 && 的区别?

  • && 短路:左边为 false 时右边不计算,效率高且能防 NPE(如 s != null && s.length() > 0)。
  • & 是位运算符也可用于 boolean,但不短路,两边都会计算。

Q:char 类型能存一个汉字吗?

  • 能。char 占 2 字节(UTF-16 code unit),汉字大多落在基本多文种平面(BMP),如 '中' 可直接赋给 char。
  • 生僻字(如 emoji 或增补平面字符)需两个 char(代理对),String.length() 返回的是 code unit 数而不是字符个数。

Q:为什么 float 和 double 不能直接比较相等?

  • 二进制浮点无法精确表示很多十进制小数(如 0.1),运算后存在累积误差。
  • 比较应使用差值阈值,金额计算应使用 BigDecimal(字符串构造)。

Q:编译型语言和解释型语言,Java 算哪种?

  • 混合型:javac 先把源码编译成字节码(.class),再由 JVM 逐条解释执行,热点代码由 JIT 编译成本地机器码。
  • 由此获得「一次编译,到处运行」,JIT 又保证了接近原生的执行速度。

推荐资料

资料说明链接
廖雪峰 Java 快速入门入门主线精读,配环境到基础语法全覆盖https://liaoxuefeng.com/books/java/quick-start/index.html
慕课网《Java入门第一季》免费视频,适合完全零基础跟练https://www.imooc.com/learn/85
pdai 语言基础语法要点体系化梳理,可当速查表https://pdai.tech/md/java/basic/java-basic-lan-basic.html
JavaGuide 基础面试题学完本章开始刷基础面试题第一部分https://javaguide.cn/java/basis/java-basic-questions-01.html
Java 8 中文 API 速查查 String/Arrays/Scanner 等类的方法https://www.matools.com/api/java8