一、Java基础面试题

Java Se

Java语言有哪些特点?

  1. 简单易学;
  2. 面向对象(封装、继承、多态);
  3. 平台无关性
  4. 支持多线程
  5. 可靠性(具备异常处理和自动内存管理机制)

JVM 、JDK 、JRE三者之间的关系?

JDK(Java Develoment Kit): 是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。

JRE(JavaRuntime Environment): 是Java的运行环境,包含JVM标准实现及Java核心类库。

JVM (Java Virtual Machine) :是Java虚拟机,是整个Java 实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。

面向对象有哪些特性?

封装:封装把一个对象的属性私有化,访问它可以通过特定的接口。

继承:通过已有的类来创建新类的过程,已有的类称为基类/父类,新类称为子类/派生类,新类可以继承父类的方法和属性,也可以新增自己的方法和属性。

多态:分为编译时多态(方法重载)和运行时多态(方法重写)。要实现多态需要做两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。在 Java 中有两种形式可以实现多态:继承(多个⼦类对同⼀⽅法的重写)和接⼝(实现接⼝并覆盖接⼝中同⼀⽅法)。

重载和重写的区别?

  1. 定义和实现方式:
    • 重载:在同一个类中定义多个同名但参数列表不同的函数,可以有不同的返回类型。
    • 重写:在派生类中重新定义基类中已经定义的函数,函数名、参数列表和返回类型都必须相同。
  2. 触发条件:
    • 重载:在同一个类中定义多个同名但参数列表不同的函数。
    • 重写:需要有继承关系,派生类中重新定义基类中已经定义的函数。
  3. 调用方式:
    • 重载:根据调用时提供的参数类型和数量,调用对应的重载方法。
    • 重写:根据对象的实际类型,调用对应的重写方法。

构造方法有什么特性?

  1. 名字与类名相同
  2. 没有返回值,但不能用void声明构造函数
  3. 成类的对象时自动执行,无需调用。

Java中创建对象的几种方式?

  1. 使用new 关键字

  2. 使用Class类的newInstance方法,该方法调用无参的构造器创建对象(反射)

    Class.forName.newInstance();
    
  3. 使用克隆clone()方法;

  4. 反序列化,比如调用ObjectInputStream 类的readObject()方法

抽象类和接口的区别?

  1. 抽象类中可以包含抽象方法和具体方法,可以有成员变量和构造方法,可以被继承; 接口中只能由抽象方法,在JDK1.8以后包含默认方法(具体实现的方法)。
  2. 抽象类中可以定义构造函数,接口中不能定义构造函数。
  3. 抽象类中的成员权限可以是public、默认、protected、抽象类中的抽象方法就是为了重写,(所以不能被private修饰),接口中的方法默认public abstrat、成员变量默认:public static final
  4. 抽象类可以被其他类继承,子类可以继承抽象类的属性和方法,并可以覆盖其中的方法。接口可以被类实现,类必须实现接口中定义的所有的方法,实现类可以实现多个接口。

Integer和int的区别?

  1. int是Java的八种基本数据类型之一,而integer是Java为Int提供的封装类;
  2. int 型变量的默认值是0,Integer变量的默认值是null,这一点说明Integer可以区分未赋值和为0的区分;
  3. Integer变量必须实例化才可以使用,而int不需要实例;

由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的,因为其内存地址是不同的;

如果Integer和int比较时,只要两个变量值相等,则结果就是true,因为包装类Integer和基本数据类型比较时,会自动进行拆箱操作,实际是两个int型变量在进行比较;

final、finally、finalize的区别?

final:用于声明属性、方法和类;表示属性不可变、方法不可覆盖、被其修饰的类不可继承;

finally: 异常处理语句结构一部分,表示总是执行;

finalize:Object类的一个方法,在垃圾回收时会调用被回收对象的finalize

==和equals的区别?

==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是应用数据类型,则比较的是对象的地址值是否相等。

equals方法:用法比较两个对象的内容是否相等。注意:equals 方法不能用于比较基本数据类型的变量。如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址(很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等)。

两个对象的hashCode()相同,则equals()也一定为true吗?

两个对象的hashCode()相同,equals()不一定为true.因为在散列表中,hashCoding()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等【散列冲突】

&和&&的区别?

Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true的时候,整个运算结果才为true, 否则为false.

&&:有短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式。

&:不管第一个表示式结果是否为true,第二个都会执行。除此之外,&还可以用作位运算符:当&两边的表达式不是Boolean类型的时候,&表示按位操作。

switch是否能作用在byte/long/String上?

Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。

从 Java 5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型。

从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

break,continue,return的区别及作用?

break 跳出整个循环,不再执行循环(结束当前的循环体)

continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

Java中的参数传递时传值呢?还是传引用?

Java 的参数是以值传递的形式传入方法中,而不是引用传递。

当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。

当传递方法参数类型为引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。即使 Java 函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。

Java的泛型是如何工作的?什么是类型擦除?

泛型是通过类型参数来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息,

类型擦除:泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 < T > 则会被转译成普通的 Object 类型,如果指定了上限如 < T extends String > 则类型参数就被替换成类型上限。

深拷贝和浅拷贝的区别?

​ 深拷贝

​ 直接复制了一个对象,并且用新指针指向新对象

​ 所以深拷贝是安全的

​ 浅拷贝

​ 仅拷贝基本数据类型对象,对于引用数据类型,创建了一个指针指向原有对象的地址值

​ 浅拷贝不安全,如果是引用数据类型对象,修改后会影响原数据

Java中反射是什么意思?有哪些应用场景?

在运行状态,对于任何一个类,都可以获得整个类的所有属性和方法,对于任何一个对象都可以调用它的任何方法和属性。简单来说就是动态获取类的信息以及动态调用类的属性和方法的功能。

Stream流用过吗?

Stream 流,简单来说,使用 java.util.Stream 对一个包含一个或多个元素的集合做各种操作。这些操作可能是 中间操作 亦或是 终端操作。 终端操作会返回一个结果,而中间操作会返回一个 Stream 流。

你可能感兴趣的:(面试总结,java,开发语言,面试)