1. Java开发环境搭建实战
刚接触Java的新手往往会被各种环境配置问题劝退。作为从2008年就开始用Java的老码农,我见过太多人因为环境没配好直接放弃学习。今天我就用最接地气的方式,带你避开所有坑。
首先明确几个关键概念:
- JDK(Java Development Kit):Java开发工具包,包含编译器、调试器等核心工具
- JRE(Java Runtime Environment):Java运行环境,只能运行不能开发
- IDE(集成开发环境):如IntelliJ IDEA、Eclipse等
重要提示:永远选择LTS(长期支持)版本,目前主流是Java 11和Java 17。非LTS版本每6个月就停止更新,不适合生产环境。
1.1 JDK安装避坑指南
以Windows系统为例,官网下载经常遇到网络问题。推荐使用国内镜像:
- 华为云镜像:https://repo.huaweicloud.com/java/jdk/
- 清华镜像:https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/
安装后需要配置环境变量,这是新手最容易出错的地方:
bash复制# 系统变量新增
JAVA_HOME = C:\Program Files\Java\jdk-17.0.2
# Path变量追加
%JAVA_HOME%\bin
验证安装是否成功:
bash复制java -version
javac -version
常见问题排查:
- 报错"不是内部命令" → 环境变量没生效,检查Path是否包含bin目录
- 版本显示不一致 → 系统残留旧版JDK,需要清理注册表
1.2 IDE的选择与优化
IntelliJ IDEA社区版对初学者完全够用,但需要调整几个关键设置:
- 修改默认编码:File → Settings → Editor → File Encodings → 全部改为UTF-8
- 开启自动导包:Editor → General → Auto Import → 勾选优化导入
- 调整内存设置:Help → Change Memory Settings → 建议设为1024MB
实测技巧:用
.ignore插件管理不需要版本控制的文件,避免把IDE配置和编译输出提交到Git
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java语法核心精要
Java语法看似简单,但魔鬼藏在细节里。下面这些知识点我面试过上百个初级开发者,能完全说清楚的不到20%。
2.1 数据类型那些坑
基本类型和包装类的区别不只是大小写:
java复制int a = 100;
Integer b = 100;
Integer c = new Integer(100);
System.out.println(a == b); // true,自动拆箱
System.out.println(b == c); // false,对象地址不同
System.out.println(b.equals(c)); // true,值比较
浮点数精度问题必须警惕:
java复制double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d2 == 0.3); // false!
解决方案:
- 金融计算用BigDecimal
- 比较浮点数用差值法:Math.abs(d1-d2) < 1e-6
2.2 字符串处理秘籍
String的不可变性导致大量性能问题:
java复制String s = "";
for(int i=0; i<10000; i++){
s += i; // 每次循环创建新对象
}
正确做法:
java复制StringBuilder sb = new StringBuilder();
for(int i=0; i<10000; i++){
sb.append(i);
}
String result = sb.toString();
字符串比较的坑:
java复制String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";
System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // true
System.out.println(s1.equals(s2)); // true
3. 面向对象编程实战技巧
3.1 类与对象的本质
构造方法的重载原则:
java复制public class User {
private String name;
private int age;
// 全参构造
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 链式调用改造
public User setName(String name) {
this.name = name;
return this;
}
// 静态工厂方法
public static User createDefault() {
return new User("guest", 18);
}
}
3.2 继承与多态陷阱
重写(Override)的五大原则:
- 方法名、参数列表必须相同
- 返回类型可以是子类(协变返回)
- 访问权限不能更严格
- 不能抛出更宽泛的异常
- 不能是static/final方法
经典多态案例:
java复制class Animal {
void speak() {
System.out.println("动物叫");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("汪汪汪");
}
void fetch() {
System.out.println("捡球");
}
}
// 测试代码
Animal myDog = new Dog();
myDog.speak(); // 输出"汪汪汪"
// myDog.fetch(); // 编译错误!
4. 异常处理最佳实践
4.1 异常体系解析
Java异常分类:
code复制Throwable
├── Error(系统级错误,如OutOfMemoryError)
└── Exception
├── RuntimeException(未检查异常)
└── 其他Exception(检查异常)
异常处理黄金法则:
- 永远不要吞掉异常
java复制// 错误示范
try {
doSomething();
} catch (Exception e) {
e.printStackTrace(); // 仅打印不够
}
// 正确做法
try {
doSomething();
} catch (SpecificException e) {
log.error("业务异常", e);
throw new BusinessException("友好提示", e);
}
-
优先使用特定异常而非通用Exception
-
保持异常信息完整:
java复制throw new IllegalArgumentException("参数错误:id不能为空");
4.2 自定义异常设计
标准业务异常模板:
java复制public class BusinessException extends RuntimeException {
private final int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
// 常用异常静态工厂
public static BusinessException ofParamError(String detail) {
return new BusinessException(400, "参数错误:" + detail);
}
}
使用示例:
java复制public User getUserById(Long id) {
if (id == null) {
throw BusinessException.ofParamError("用户ID不能为空");
}
// ...
}
5. 集合框架性能玄机
5.1 ArrayList vs LinkedList
实测性能对比(100万次操作):
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问 | O(1) | O(n) |
| 头部插入 | O(n) |
