← Java 学习路线(共 8 章)

第 2 章 类型、变量与字符串

red wenzi · 2026-09-15 · 编程语言 · Java · 📖 预计阅读 9 分钟 · 共 2 道练习
🎯 本章你会学到:基本类型大小固定、包装类与装箱、String 为什么不可变。建议边读边敲,每节练习先自己做,再展开答案对照。

Java 的类型大小是**语言规范写死的**:int 永远是 4 字节,long 永远是 8 字节——这点和 C/C++ 完全不同,也意味着 Java 程序的行为不会因为平台而变。

类型大小范围/说明
byte1 字节-128 ~ 127
short2 字节-32768 ~ 32767
int4 字节约 ±21 亿(最常用)
long8 字节约 ±9.2×10^18,字面量要加 L
float / double4 / 8 字节double 是默认浮点类型
char2 字节UTF-16 字符,不是 1 字节!
boolean1 位(规范未定大小)true / false

基本类型 vs 包装类

类型与装箱
public class Main {
    public static void main(String[] args) {
        int n = 7;
        double d = 2.0;
        System.out.println("n=" + n);
        System.out.printf("d=%.2f%n", d);
        System.out.println("n/d=" + (n / d));       // 自动提升为 double
        System.out.println("int bytes=" + Integer.BYTES);

        Integer boxed = 1000;
        Integer other = 1000;
        System.out.println("boxed == other: " + (boxed == other));
        System.out.println("boxed.equals(other): " + boxed.equals(other));
    }
}
运行结果
n=7
d=2.00
n/d=3.5
int bytes=4
boxed == other: false
boxed.equals(other): true

输出说明两件事:n / d 会自动把 n 提升成 double;而 == 对包装类比较的是**对象引用**,超出缓存范围(-128~127)后 Integer 会各自新建对象,所以 == 得 false,必须用 equals

字符串不可变

String 与 StringBuilder
public class Main {
    public static void main(String[] args) {
        String a = "hello";
        String b = a.toUpperCase();     // 生成新对象,a 不变
        System.out.println(a + " -> " + b);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            sb.append(i);               // 循环里拼接用 StringBuilder
        }
        System.out.println(sb.toString());
    }
}
运行结果
hello -> HELLO
01234
⚠️ 易错点 判断字符串内容相等必须用 a.equals(b)a == b 比较的是引用地址,两个内容相同的字符串可能是 false。
⚠️ 易错点 循环里用 s += x 拼接会不断创建新对象(O(n²)),累加字符串用 StringBuilder

✍️ 本节练习

2.1必做圆的面积

读入半径 r(double),输出面积,保留 2 位小数。圆周率用 3.14159265。

输入 一个实数 r。

输出 一行 area=面积(2 位小数)。

样例输入
2
样例输出
area=12.57

💡 提示 System.out.printf("area=%.2f%n", ...);注意 %n 是平台无关的换行。

✅ 查看参考答案与解析
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double r = sc.nextDouble();
        System.out.printf("area=%.2f%n", 3.14159265 * r * r);
    }
}

解析 printf 的格式符和 C 一样;%.2f 四舍五入到 2 位小数。

2.2挑战单词大写与长度

读入一个单词,输出它的大写形式和字符个数,中间用空格分隔。

输入 一个单词。

输出 一行:大写 长度

样例输入
hello
样例输出
HELLO 5

💡 提示 toUpperCase() 返回新字符串;length() 求长度(注意有括号)。

✅ 查看参考答案与解析
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String w = sc.next();
        System.out.println(w.toUpperCase() + " " + w.length());
    }
}

解析 数组的 length 是字段(没有括号),字符串的 length() 是方法(有括号)——这是 Java 新手最容易混的一处。

📚 本文概念都在知识大全:

JVM 与字节码 · JDK · String 与 StringBuilder · 集合框架 · 泛型 · 受检异常 · 继承与接口 · record · Stream API