第3章:Java基础速通(上)
各位同学,欢迎来到Java基础速通的上半场。说实话,很多零基础转行的朋友,一听到「面向对象」、「集合框架」这些词就头大。我当年刚学的时候也一样,感觉像在看天书。但别怕,这一章我会用最接地气的方式,带你把这些硬骨头啃下来。
3.1 Java开发环境搭建
工欲善其事,必先利其器。咱们先搞定环境。
3.1.1 JDK安装与配置
JDK是Java的开发工具包。说白了,没有它,你的代码就是一堆文本。
- 下载JDK:去Oracle官网下载,或者用OpenJDK。我个人习惯用JDK 8或11,这两个版本最稳定,企业里用得最多。
- 安装:一路默认路径就行。但我建议你记一下安装路径,比如
C:\Program Files\Java\jdk1.8.0_291。 - 配置环境变量:
- 新建
JAVA_HOME,值填你的JDK安装路径。 - 在
Path变量里加上%JAVA_HOME%\bin。
- 新建
java -version 还是报错。折腾了半天,发现是Path里多了一个分号。记住,路径之间用英文分号隔开,别用中文的!
3.1.2 IDE选择
写代码总不能用记事本吧?我推荐两个:
- IntelliJ IDEA:目前最流行的Java IDE,社区版免费。我个人强烈推荐。
- Eclipse:老牌IDE,免费开源。如果你公司用这个,也别排斥。
安装好IDE后,新建一个项目,写个Hello World试试:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, 大数据世界!");
}
}
能跑通,说明环境没问题了。
3.2 基本语法
Java的语法,其实和C/C++很像。如果你学过其中一门,上手会很快。如果没学过,也别慌,咱们一步步来。
3.2.1 变量与数据类型
Java是强类型语言。什么意思?就是每个变量在声明时,必须指定类型。你不能像Python那样,随便写个 x = 10 就完事。
| 数据类型 | 占用空间 | 示例 |
|---|---|---|
| int | 4字节 | int age = 25; |
| double | 8字节 | double price = 19.99; |
| boolean | 1位 | boolean isOk = true; |
| String | 引用类型 | String name = "张三"; |
long 类型来存时间戳,比如 long timestamp = System.currentTimeMillis();。别用 int,因为 int 最大只能存到21亿左右,时间戳早就超了。
3.2.2 运算符与流程控制
运算符没什么好说的,加减乘除、取模、自增自减,和数学一样。流程控制里,if-else 和 for 循环是最常用的。
// 判断成绩等级
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else {
System.out.println("继续努力");
}
// 循环打印1到5
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
嗯,这里要注意:for 循环里的 i++,很多人写成 i+1,这是不对的。 i++ 是自增,i+1 只是计算,不会改变 i 的值。
3.3 面向对象
面向对象是Java的核心。你想想看,现实世界里的任何东西,都可以抽象成一个「对象」。比如一辆车,它有颜色、品牌(属性),它能跑、能停(方法)。
3.3.1 类与对象
类是模板,对象是实例。就像一张汽车设计图(类),和根据这张图造出来的真车(对象)。
// 定义一个类
public class Car {
// 属性
String brand;
String color;
// 方法
public void run() {
System.out.println(brand + " 正在行驶...");
}
}
// 创建对象
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.brand = "特斯拉";
myCar.color = "红色";
myCar.run(); // 输出:特斯拉 正在行驶...
}
}
我在项目中遇到过很多新手,喜欢把所有的代码都写在 main 方法里。千万别这样!面向对象的核心思想就是「分而治之」,把不同的功能封装到不同的类里。
3.3.2 继承
继承,说白了就是「儿子可以继承老子的东西」。比如,电动车是车的一种,它继承了车的所有属性和方法,同时还可以有自己的新特性。
// 父类
public class Vehicle {
String brand;
public void honk() {
System.out.println("滴滴!");
}
}
// 子类
public class ElectricCar extends Vehicle {
int batteryLevel;
public void charge() {
System.out.println("正在充电...");
}
}
// 使用
ElectricCar tesla = new ElectricCar();
tesla.brand = "特斯拉";
tesla.honk(); // 继承来的方法
tesla.charge(); // 自己的方法
3.3.3 多态
多态,就是「同一个行为,不同的表现形式」。比如,同样是「叫」这个动作,狗是汪汪,猫是喵喵。
// 父类
public class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
// 子类
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("汪汪!");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("喵喵!");
}
}
// 多态
public class Test {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.sound(); // 输出:汪汪!
myAnimal = new Cat();
myAnimal.sound(); // 输出:喵喵!
}
}
为什么会这样?因为 myAnimal 虽然是 Animal 类型的引用,但它实际指向的是 Dog 或 Cat 的对象。这就是多态的魅力——写代码时面向父类编程,运行时却执行子类的方法。
3.4 集合框架
集合,就是用来存数据的容器。数组也能存数据,但数组长度固定,不够灵活。集合就灵活多了。
3.4.1 List
List是有序的、可重复的集合。最常用的是 ArrayList 和 LinkedList。
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
// 创建一个List
List<String> names = new ArrayList<>();
// 添加元素
names.add("张三");
names.add("李四");
names.add("王五");
// 遍历
for (String name : names) {
System.out.println(name);
}
// 获取指定位置的元素
String second = names.get(1); // 李四
}
}
ArrayList 作为默认选择。因为它基于数组实现,随机访问速度快。只有在频繁插入和删除的场景下,我才会考虑 LinkedList。
3.4.2 Map
Map是键值对集合,就像一本字典,通过「键」来查找「值」。最常用的是 HashMap。
import java.util.HashMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
// 创建一个Map
Map<String, Integer> scores = new HashMap<>();
// 添加键值对
scores.put("张三", 90);
scores.put("李四", 85);
scores.put("王五", 95);
// 获取值
int zhangsanScore = scores.get("张三"); // 90
// 遍历
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
我曾经在做一个用户画像系统时,需要根据用户ID快速查找其标签。用 HashMap 存储,查询速度是毫秒级的。如果用List遍历查找,数据量一大,性能就崩了。
HashMap 的键不能重复。如果你 put 了相同的键,后面的值会覆盖前面的值。另外,HashMap 不是线程安全的,多线程环境下要用 ConcurrentHashMap。
本章小结
这一章我们覆盖了Java最基础、最核心的内容。环境搭建、基本语法、面向对象、集合框架,这些都是你后续学习大数据框架(比如Hadoop、Spark)的基石。别指望一次全记住,多写代码,多踩坑,自然就熟了。
下一章,我们会继续深入Java基础,讲异常处理、IO流、多线程这些更进阶的内容。准备好了吗?咱们下章见。