引言
Java基础是面试必考内容。本文系统梳理Java基础知识的高频面试题。
一、数据类型
1.1 基本数据类型
1 2 3 4 5 6 7 8 9
| byte short int long float double char boolean
|
1.2 包装类
1 2 3 4 5 6 7 8 9 10 11 12
| Integer a = 10; int b = a;
Integer x = 127; Integer y = 127; System.out.println(x == y);
Integer m = 128; Integer n = 128; System.out.println(m == n);
|
二、面向对象
2.1 三大特性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Student extends Person { private String school; }
Person person = new Student();
|
2.2 重载与重写
1 2 3 4 5 6 7 8 9
| public void method(int a) {} public void method(String a) {}
@Override public String toString() { return "Custom toString"; }
|
三、关键字
3.1 static
1 2 3 4 5 6 7 8 9 10 11
| public class Counter { private static int count = 0; public static void increment() { count++; } static { System.out.println("Static block"); } }
|
3.2 final
1 2 3 4 5 6 7 8
| public final class FinalClass {}
public final void method() {}
public static final int MAX = 100;
|
3.3 abstract
1 2 3 4 5 6 7 8 9 10
| public abstract class Animal { public abstract void eat(); public void sleep() { System.out.println("Sleeping..."); } }
|
四、String类
4.1 不可变性
1 2 3
| String s1 = "hello"; String s2 = s1.concat(" world");
|
4.2 String vs StringBuilder vs StringBuffer
1 2 3 4 5 6 7 8 9 10
| String str = "hello";
StringBuilder sb = new StringBuilder("hello"); sb.append(" world");
StringBuffer sbf = new StringBuffer("hello"); sbf.append(" world");
|
4.3 字符串常量池
1 2 3 4 5 6 7 8 9
| String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2);
String s3 = new String("hello"); System.out.println(s1 == s3);
String s4 = s3.intern(); System.out.println(s1 == s4);
|
五、equals和hashCode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Person { private String name; private int age; @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
|
equals和hashCode的约定:
- equals相等,hashCode必须相等
- hashCode相等,equals不一定相等
- 重写equals必须重写hashCode
六、接口和抽象类
| 特性 |
抽象类 |
接口 |
| 继承 |
单继承 |
多实现 |
| 方法 |
可以有实现 |
JDK 8前只能是抽象方法 |
| 变量 |
任意变量 |
public static final |
| 构造器 |
可以有 |
不能有 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public abstract class Animal { protected String name; public Animal(String name) { this.name = name; } public abstract void eat(); }
public interface Flyable { void fly(); }
public class Bird extends Animal implements Flyable { public Bird(String name) { super(name); } @Override public void eat() { System.out.println("Bird is eating"); } @Override public void fly() { System.out.println("Bird is flying"); } }
|
七、泛型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Box<T> { private T item; public void set(T item) { this.item = item; } public T get() { return item; } }
public <T> T genericMethod(T param) { return param; }
public void process(List<?> list) { }
public void process(List<? extends Number> list) { }
public void process(List<? super Integer> list) { }
|
八、常见面试题
8.1 == 和 equals的区别
==:比较基本数据类型的值,比较引用类型的地址
equals():比较对象内容是否相等
8.2 Java为什么不支持多继承?
避免菱形问题(Diamond Problem)。但可以实现多个接口。
8.3 什么是值传递和引用传递?
Java只有值传递。基本类型传递值的副本,引用类型传递引用的副本。
1 2 3 4 5 6 7 8
| public void change(int num) { num = 10; }
public void change(Person person) { person.setName("Alice"); person = new Person(); }
|
总结
Java基础核心要点:
- 数据类型:基本类型、包装类、自动装拆箱
- 面向对象:封装、继承、多态
- 关键字:static、final、abstract
- String:不可变性、常量池
- equals和hashCode:重写规则
- 接口和抽象类:区别和使用场景
- 泛型:类型安全
参考资料