SE 基础高频面试题

1、JDK 和 JRE 的区别是什么

  JDK 是 Java 开发工具包,JRE 是 Java 运行时环境

二者的区别在于

JDK
JRE JAVA 开发工具
Jvm 虚拟机和一些 Java 的基础类库

  ​**==​JDK 包含 JRE,如果仅仅是运行 Java 程序,只要有 JRE 即可;如果是要开发 Java 程序,则必须要有 JDK​==**

2、&和&&的区别是什么

  &和&&都是逻辑运算符,都可以实现取并的效果,即符号两边的表达式都为 true,结果才是 true

  不一样的是&&有短路的功能,即当符号前面的表达式为 false 时,后面的表达式将不再执行,而&没有这个功能

  另外,&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作

3、final finally finalize 区别是什么

   final 可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、 修饰变量表示该变量是一个常量不能被重新赋值。

   finally 一般作用在 try-catch 代码块中,在处理异常的时候,无论程序是否出现异常,写在 finally 中的代码都会被执行,一般用来释放一些资源

   finalize 是 Object 类的一个方法,它会在一个对象被垃圾回收的时候自动被垃圾回收器来调用

4、String、StringBuffer、 StringBuilder 的区别

可变性:String 是不可变对象,其它的都是可变对象
线程安全:String 和 StringBuffer 是线程安全的,StringBuilder 是线程不安全的
效率:StringBuilder 最高,StringBuffer 居中,String 效率最低

  使用场景:少量字符串的操作使用 String,大量字符串的频繁操作在多线程下使用 StringBuffer,单线程下可以使用 StringBuilder

方法 功能 示例
length() 获取长度 "Java".length()→ 4
charAt() 获取字符 "Java".charAt(0)→ 'J'
substring() 截取子串 "Hello".substring(1,4)→ "ell"
indexOf() 查找位置 "apple".indexOf('p')→ 1
replace() 替换字符 "aabb".replace('b','c')→ "aacc"
toUpperCase() 转大写 "java".toUpperCase()→ "JAVA"
toLowerCase() 转小写 "JAVA".toLowerCase()→ "java"
split() 分割字符串 "a,b,c".split(",")→ ["a","b","c"]
trim() 去除首尾空白 " hello ".trim()→ "hello"
equals() 比较内容 "Java".equals("java")→ false

5、有哪些创建对象的方式

   1、new 2、反射 3、克隆 4、json 反序列化

6、重写和重载的区别是什么

  重载和重写都是用于描述方法间的关系的,但是他们的含义和场景确大不相同

  重写是存在于子父类之间的,一般用在父类的方法无法满足子类需求时,子类重写方法来自定义方法功能

   它要求子类定义的方法与父类中的方法具有相同的方法名字,相同的参数列表和相同的返回类型

  重载是存在于同一个类中的,一般用在功能相似的方法需要接收不同的参数时,

  它要求多个方法具有相同的名字,但方法具有不同的参数列表

7、this 和 super 的应用场景是什么

  this 代表的是当前对象,一般用于在一个方法中调用本对象的成员变量或其它方法

  supper 代表是父类对象,一般在本对象和父对象出现成员名称冲突时,强行调用父对象的成员,也经常用于调用父类的构造方法

8、throw 和 throws 的区别是什么

  throws:用在方法的声明上,声明当前方法可能抛出的异常

  throw:写在方法里,真正的抛出一个异常,抛出自定义异常。创建对象自定义抛出异常

9、应该使用什么数据类型来计算价格

  1、如果不是特别关心内存和性能的话,使用 BigDecimal

  2、否则使用预定义精度的 double 类型

  3、用 int 也可以,在表中存储的单位是分(元角分的分),比如一个删除两块五,在表中存 250

10、== 与 equals 的区别

  ==是一个运算符,equals 是 Object 类的方法
用于基本类型的变量比较时: ==比较的是值是否相等,equals 不能直接用于基本数据类型的比较,需要转换为其对应的包装类型。
用于引用类型的比较时。==和 equals 都是比较栈内存中的地址是否相等。但是通常会重写 equals 方法去实现对象内容的比较。

11、接口和抽象类的区别

  它们的共同点是:都不能实例化对象

  它们的不同点是:

  1. 抽象类一般用于抽取子类中的共同方法和属性,接口一般用于指定实现类的规范
  2. 抽象类可以有构造方法,作用是用给抽象父类中中的属性赋值;接口中不能有构造方法
  3. 接口中不能含有静态代码块,而抽象类可以有静态代码块
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

12、说出几个常见的异常

  Java 中的异常分为运行时异常和编译时异常两大类:

  运行时异常都是 RuntimeException 类及其子类异常,这类异常的特点是不强行要求程序员进行处理,常见的有

  NullPointerException 空指针异常,调用了未经初始化的对象或者是不存在的对象

  IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生

  ClassCastException 数据类型转换异常

  NoSuchMethodException 方法不存在异常

  非运行时异常,也叫编译异常,是 Exception 的子类但不是 RuntimeException 的子类,类型上都属于及其子类

  它要求程序员在编写代码的过程中提供异常处理方案,否则编译不通过,常见的有:IOException 和 SQLException 等

  ‍

13、Java 反射有了解吗

  反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且可以调用它的任意一个方法

  它主要应用于大量的框架底层,比如 Spring/Spring Boot、MyBatis 等等

14、浅拷贝和深拷贝区别

  前提:比如如下类,注意有一个特殊的属性 tearch 是一个对象属性

  public class Student{

   private int id;

   private String name;

   private Teacher teacher;

  }

  浅拷贝:只复制基础类型的数据,对象属性值复制地址,不复制值

  深拷贝:要复制的对象所引用的对象都复制了一遍,也就是说把 teacher 中的属性和值也会一一复制

  

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...