Java基础语法
数据类型
基本数据类型有哪些?
答案: Java有8种基本数据类型:
- 整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
- 浮点型:float(4字节)、double(8字节)
- 字符型:char(2字节)
- 布尔型:boolean(1字节)
int和Integer的区别?
答案:
- 类型不同:int是基本数据类型,Integer是包装类
- 默认值:int默认值为0,Integer默认值为null
- 存储位置:int存储在栈中,Integer对象存储在堆中
- 性能:int性能更高,Integer需要装箱拆箱
- 泛型支持:泛型不支持基本类型,只能用Integer
java
// 自动装箱
Integer i = 100; // 等价于 Integer.valueOf(100)
// 自动拆箱
int j = i; // 等价于 i.intValue()
// 缓存机制:-128到127之间的Integer对象会被缓存
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // falseString相关
String、StringBuilder、StringBuffer的区别?
答案:
| 特性 | String | StringBuilder | StringBuffer |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全 | 不安全 | 安全(synchronized) |
| 性能 | 最低 | 最高 | 中等 |
| 使用场景 | 少量字符串操作 | 单线程大量操作 | 多线程大量操作 |
java
// String不可变,每次拼接都会创建新对象
String s = "hello";
s += " world"; // 创建了新的String对象
// StringBuilder可变,适合单线程
StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 在原对象上修改
// StringBuffer线程安全
StringBuffer sbf = new StringBuffer("hello");
sbf.append(" world"); // 方法加了synchronizedString为什么设计成不可变?
答案:
- 安全性:String常用作HashMap的key,不可变保证hash值不变
- 线程安全:不可变对象天然线程安全,无需同步
- 字符串常量池:可以复用相同内容的字符串,节省内存
- 安全:防止被恶意修改(如文件路径、网络连接等)
关键字
final、finally、finalize的区别?
答案:
final:修饰符
- 修饰类:不能被继承
- 修饰方法:不能被重写
- 修饰变量:常量,只能赋值一次
finally:异常处理关键字,无论是否发生异常都会执行
finalize:Object类的方法,GC回收对象前调用(已废弃)
java
// final示例
final class FinalClass {} // 不能被继承
class Parent {
final void method() {} // 不能被重写
}
final int MAX = 100; // 常量
// finally示例
try {
// 可能抛异常的代码
} catch (Exception e) {
// 异常处理
} finally {
// 一定会执行(除非JVM退出)
}static关键字的作用?
答案:
- 静态变量:类变量,所有实例共享
- 静态方法:不依赖实例,通过类名调用
- 静态代码块:类加载时执行一次
- 静态内部类:不依赖外部类实例
java
public class StaticDemo {
static int count = 0; // 静态变量
static { // 静态代码块
System.out.println("类加载时执行");
}
static void method() { // 静态方法
System.out.println("静态方法");
}
static class Inner { // 静态内部类
}
}面向对象
重载(Overload)和重写(Override)的区别?
答案:
| 特性 | 重载 | 重写 |
|---|---|---|
| 定义 | 同一类中方法名相同,参数不同 | 子类重新定义父类方法 |
| 参数列表 | 必须不同 | 必须相同 |
| 返回类型 | 可以不同 | 相同或子类型 |
| 访问修饰符 | 可以不同 | 不能更严格 |
| 异常 | 可以不同 | 不能抛出新的或更广的异常 |
java
// 重载
class Calculator {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
int add(int a, int b, int c) { return a + b + c; }
}
// 重写
class Animal {
void sound() { System.out.println("动物叫"); }
}
class Dog extends Animal {
@Override
void sound() { System.out.println("汪汪"); }
}接口和抽象类的区别?
答案:
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 继承 | 可以实现多个接口 | 只能继承一个抽象类 |
| 方法 | 默认public abstract | 可以有具体实现 |
| 变量 | 默认public static final | 可以有实例变量 |
| 构造方法 | 不能有 | 可以有 |
| 设计理念 | 定义行为规范 | 代码复用 |
java
// 接口
interface Flyable {
void fly(); // 默认public abstract
}
// 抽象类
abstract class Animal {
String name; // 实例变量
abstract void sound(); // 抽象方法
void sleep() { // 具体方法
System.out.println("睡觉");
}
}练习题
- 为什么String的hashCode()方法要使用31作为乘数?
- 解释Java的值传递机制
- ==和equals()的区别?
- Java中如何实现深拷贝和浅拷贝?