一、请解释Java平台及其组成部分(JVM、JRE、JDK)的区别
Java平台主要包括JVM(Java虚拟机)、JRE(Java运行环境)和JDK(Java开发工具包)。JVM是运行Java字节码的虚拟机,JRE包含JVM及运行Java程序所需的核心类库,而JDK则包含JRE以及编译器、调试器和其他工具。
二、Java中什么是对象,如何创建对象
在Java中,对象是类的实例,通过new关键字创建,例如:Car car = new Car();
三、请简述Java中的封装、继承和多态概念,并举例说明
封装是Java中面向对象的三大特性之一,它主要指的是将对象的属性和行为(方法)结合在一起,并尽可能地隐藏对象内部的细节。在Java中,通过访问修饰符(private、protected、public等)来控制类中的成员变量和成员方法的访问权限,同时提供公共的getter和setter方法来获取或修改私有变量,从而实现对数据的保护,防止外部随意修改。
举例:
public class Student {
private String name; // 私有化姓名属性
private int age;
// 提供公共的getter和setter方法
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;
}
}
继承是Java面向对象的另一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,这样可以减少代码重复,提高代码复用性。子类还可以根据需要扩展或覆盖父类的方法。
举例:
public class Animal { // 父类
public void eat() {
System.out.println("动物会吃东西");
}
}
public class Dog extends Animal { // 子类继承Animal
@Override
public void eat() {
System.out.println("狗喜欢吃骨头"); // 覆盖父类eat方法
}
public void bark() {
System.out.println("狗会叫");
}
}
多态: 多态是指同一个接口,使用不同的实例而表现出不同的行为。在Java中,多态主要是依靠继承以及接口实现来体现。编译时类型与运行时类型不一致,就可以体现出多态。多态可以减少程序中的if-else条件判断,使得程序更加灵活且易于扩展。
public class Test {
public static void main(String[] args) {
Animal a1 = new Dog(); // 多态,父类引用指向子类对象
a1.eat(); // 输出"狗喜欢吃骨头"
Animal a2 = new Cat();
a2.eat(); // 输出"猫喜欢吃鱼"
}
}
interface Animal {
void eat();
}
class Dog implements Animal {
public void eat() {
System.out.println("狗喜欢吃骨头");
}
}
class Cat implements Animal {
public void eat() {
System.out.println("猫喜欢吃鱼");
}
}
四、Java中的四种访问权限修饰符是什么,各有什么区别
public:公开的。使用public修饰的类、属性或方法对所有类都是可见的,无论它们是否在同一包中。任何类都可以直接访问public修饰的成员。
protected:受保护的。protected修饰的类成员对同一包中的其他类和所有子类都是可见的,但对不同包中的非子类不可见。这意味着子类可以访问父类中被protected修饰的属性和方法。
(默认)无修饰符(package-private):没有明确指定任何访问修饰符时,属性或方法只对同一包内的其他类可见。如果在不同的包中,则无法访问这些成员。
private:私有的。private修饰的类成员只能在该类内部访问,对同一包或其他包中的任何类都不可见。
五、ArrayList和LinkedList有何不同?在什么场景下更适合使用LinkedList
ArrayList基于动态数组实现,查询速度快,增删慢;LinkedList基于双向链表实现,增删快,查询慢。在频繁进行插入和删除操作且对元素顺序不敏感的情况下,更适合使用LinkedList
六、请解释HashMap的工作原理,包括它的内部结构以及扩容机制。
HashMap基于哈希表实现,内部使用数组+链表/红黑树存储数据,通过key的hashCode计算其在数组中的位置,当哈希冲突时,采用链表或红黑树解决。扩容机制是在负载因子超过阈值时,会自动扩大为原来的2倍大小,并重新散列所有元素
七、反射是什么?
通过反射机制,代码能够在运行时动态地获取类、接口、字段、方法等程序元素的信息,并且可以创建对象实例、调用方法、修改字段值等,这些操作通常在编译时是未知或者未确定的。
八、请描述Java内存区域划分(堆、栈、方法区等),并简述各自作用。
堆存放对象实例,栈存放基本类型变量和对象引用,方法区存放类信息、常量、静态变量等,程序计数器记录当前线程执行的字节码地址,本地方法栈为JNI方法服务。
九、•Java的垃圾回收机制是怎样的?你知道哪些常见的垃圾收集器?
Java的垃圾回收机制主要是自动回收不再使用的对象所占用的内存空间,避免内存泄露。常见的垃圾收集器有Serial、ParNew、Parallel Scavenge(年轻代)、CMS、G1、ZGC和Shenandoah等。
十、如何避免Java中的内存泄漏问题?
及时关闭流、数据库连接等资源;弱引用、软引用合理使用;尽量减少全局变量和大对象的使用,防止长生命周期对象持有短生命周期对象引用。