作为一名 Java 程序员,在经历了众多面试后,深知 Java 基础在大厂面试中的重要性。以下是我总结的一些常被问到的 Java 基础面试题及解析,希望对大家有所帮助。
一、面向对象的三大特性
(一)封装
概念
封装是将数据和操作数据的方法绑定在一起,形成一个类。通过访问修饰符(如 public、private、protected 等)来控制类成员的访问权限,对外隐藏内部的实现细节,只暴露必要的接口给外部使用。
示例:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
比如我们有一个 Person 类,包含姓名、年龄等属性。我们可以将这些属性设为私有,并提供公共的方法来获取和设置这些属性的值。
(二)继承
概念
继承允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以扩展父类的功能,同时还可以重写父类的方法来实现自己特定的行为。
示例
class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("Dog is barking.");
}
}
我们有一个 Animal 类作为父类,有 eat 方法。然后创建一个 Dog 类继承自 Animal 类,并添加自己的 bark 方法。
(三)多态
概念
多态是指同一个行为具有多种不同的表现形式。在 Java 中,多态主要通过方法重写和方法重载来实现。方法重写是子类对父类中已有的方法进行重新定义,方法重载是在同一个类中定义多个同名但参数不同的方法。
示例
以下是方法重写的例子:
class Animal {
public void makeSound() {
System.out.println("Some sound.");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
然后我们可以这样使用:
Animal animal1 = new Cat();
Animal animal2 = new Dog();
animal1.makeSound(); // 输出 Meow
animal2.makeSound(); // 输出 Woof
二、异常处理
(一)try-catch-finally 块
概念
try 块中放置可能会抛出异常的代码。当 try 块中的代码抛出异常时,程序流程会立即跳转到相应的 catch 块中进行处理。finally 块中的代码无论是否发生异常都会被执行,常用于释放资源等操作。
示例
try {
FileReader fileReader = new FileReader("nonexistent.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine())!= null) {
System.out.println(line);
}
bufferedReader.close();
} catch (FileNotFoundException e) {
System.out.println("File not found: " + e.getMessage());
} catch (IOException e) {
System.out.println("IO error: " + e.getMessage());
} finally {
// 这里可以关闭资源等操作,即使前面发生了异常,也会执行到这里
if (bufferedReader!= null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
比如我们读取一个文件,可能会遇到文件不存在的情况。
(二)常见异常类型
RuntimeException
这是一种运行时异常,比如 NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界异常)等。这些异常在代码编写时可能不容易被发现,通常在程序运行时才会暴露出来。
示例:
String str = null;
System.out.println(str.length()); // 会抛出 NullPointerException
Checked Exception
这类异常需要在代码中进行显式的处理,比如 IOException(输入输出异常)、SQLException(数据库操作异常)等。如果不处理,编译器会报错。
示例:
try {
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write("Hello".getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
三、集合框架
(一)List 接口
概念
List 是一个有序的集合,它允许元素重复。常用的实现类有 ArrayList 和 LinkedList。ArrayList 基于数组实现,随机访问效率高;LinkedList 基于链表实现,插入和删除操作效率高。
示例
使用 ArrayList 添加元素:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apple"); // 允许重复元素
System.out.println(list); // 输出 [apple, banana, apple]
使用 LinkedList 进行插入和删除操作:
List<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(1, 5); // 在索引1处插入元素5
linkedList.remove(2); // 删除索引为2的元素
System.out.println(linkedList); // 输出 [1, 5, 2]
(二)Set 接口
概念
Set 是一个不包含重复元素的集合。常用的实现类有 HashSet 和 TreeSet。HashSet 基于哈希表实现,不保证元素的顺序;TreeSet 基于红黑树实现,元素会按照自然顺序或指定的比较器顺序进行排序。
示例
使用 HashSet 添加元素:
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复的元素不会被添加
System.out.println(set); // 输出 [apple, banana]
使用 TreeSet 并按照字符串长度进行排序(需要实现 Comparator 接口):
Set<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
treeSet.add("apple");
treeSet.add("banana");
treeSet.add("pear");
System.out.println(treeSet); // 输出 [pear, apple, banana](按照字符串长度排序)
(三)Map 接口
概念
Map 是一个用于存储键值对的集合。键必须是唯一的,而值可以重复。常用的实现类有 HashMap 和 TreeMap。HashMap 基于哈希表实现,不保证键值对的顺序;TreeMap 基于红黑树实现,键会按照自然顺序或指定的比较器顺序进行排序。
示例
使用 HashMap 存储和获取键值对:
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
System.out.println(map.get("apple")); // 输出 1
使用 TreeMap 并按照键的字符串长度进行排序(需要实现 Comparator 接口):
Map<String, Integer> treeMap = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
treeMap.put("apple", 1);
treeMap.put("banana", 2);
treeMap.put("pear", 3);
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 输出 pear: 3
// apple: 1
// banana: 2(按照键的字符串长度排序)
以上就是一些 Java 大厂面试中常见的 Java 基础面试题及相关代码示例和解析。希望大家在准备面试时,不仅要熟悉这些知识点的概念,还要能够熟练运用代码进行实现和演示。祝大家面试顺利!
以上内容仅供参考,你可以根据实际情况进行调整和补充。如果你还有其他问题或需要进一步的帮助,欢迎随时问我。