Java基础面试题

基础

陆陆续续收集到的一些Java基础面试题,后续加更

1什么是逃逸分析

指JVM可以分析新创建对象的使用范围,以此来决定是否在Java堆上分配内存的技术

逃逸分析使用的算法引入了连通图,来构建对象和对象引用之间的可达性关系,以此为基础提出一种组合数据流分析法。

这种算法是上下文相关和流敏感的,分析精度相对较高,但是时间、内存开销相对较大。

逃逸的几种状态

  1. 全局逃逸

    即一个对象的作用范围逃出了当前方法或当前范围,有以下几种:

    • 对象是静态变量
    • 对象作为当前方法的返回值
    • 对象是一个已经逃逸的对象
  2. 参数逃逸

    即一个对象被作为方法参数传递或被参数引用,但不会发生全局逃逸,这个状态通过被调用方法的字节码确定

  3. 没有逃逸

逃逸分析优化

  1. 锁清除

    线程同步锁是很牺牲性能的。锁清除就是如果编译器知道当前对象只有当前线程使用,那么就会移除该对象的同步锁。

    比如StringBuffer和Vector都是用synchronized修饰线程安全的,但是大部分时候只在当前线程中使用,故编译器可以优化它

  2. 标量替换

    标量和聚合量:

    基础类型和对象引用可以说是标量,不能被进一步分解;能进一步分解的量就是聚合量,比如对象。

    对象可以被进一步分解为标量,分散的成员变量,这就是标量替换

    如果一个对象没有逃逸,那么不用创建它,只需要创建它的成员标量并存在栈中或者寄存器,节省内存空间也提升性能。

  3. 栈上分配

    当对象没有逃逸时,该对象可以通过分解为成员标量分配在栈内存,和方法的生命周期一致,随着栈帧出栈销毁,从而减少GC的压力,提高性能。

逃逸分析即是为了优化JVM内存和提升性能的。故开发当中要尽可能控制变量的作用域,作用域越小越好,

2 ==和equals()的区别

==:如果比较基本数据类型,比较数值是否相等

​ 如果比较引用类型,比较对象的地址是否相等

equals():默认比较对象地址是否相等,不能用于比较基本数据类型

为什么用equals()比较String的内容是否相等

对于String、Date、Integer灯类型重写了equals()方法,使其比较对象存储的内容是否相等

3 &和&&的区别?

& 可以作位运算符,进行位与运算;还可以进行逻辑与运算,作逻辑与时为长路与,即是说就算左边的表达式为假,右边的表达式也会运算

&& 是逻辑与,是短路与,若左边表达式为假,则右边表达式不运算

4 怎么理解值传递和引用传递?

值传递:形参传递的是基本数据类型的字面量值的拷贝,方法对形参的修改不影响实参的值

引用传递:形参传递的是该参数引用的对象在堆中地址值的拷贝,对形参的修改直接作用在实参

5 static可以修饰局部变量么?

不能,可以是内部类、全局变量、方法、代码块

6 私有方法可以重载或者重写吗?

可以重载,不能重写

7 String可变吗?

不可变,String是final类型的,其值value是char[],而且是private final的,故不可修改

8 transient关键字的作用

被transient修饰的变量不能被序列化

transient只作用于实现了Serializable接口的类

transient只能用来修饰普通成员变量字段

不管有无transient修饰,静态变量都不能被序列化

9 Class.forName和ClassLoader的区别

Class.forName除了将类的.class文件加载到JVM之外,还可以对类进行初始化

ClassLoader只会将.class文件加载到JVM中,不会进行初始化

10 main方法可以重载或者重写吗?

可以重载,但是JVM始终调用原始的main方法,不会调用重载的main

不能重写。因为main方法是static的,在Java中不能被覆盖

11 throw 和throws的区别

throw是真实抛出异常

throws是声明可能抛出异常

12 int和Integer的区别

Integer是int的包装类,int则是Java的基本数据类型

Integer必须实例化在能使用,int不需要

Integer是对象引用,new一个Integer时,实际上生成一个指针指向此对象,而int直接存储数据值

Integer默认值是null,int默认是0

13 switch case语句

case里必须跟break,否则会一个一个case执行下去,直到最后一个break的case或default出现

case条件里只能是常量或者字面常量

default可有可无,最多有一个

switch支持类型:

基本数据类型:byte short int char

包装类型:上面四个的

枚举类型: Enum

字符串类型 String

14 不能用➕拼接字符串的时候:

通过多个表达式完成一个字符串拼接时不行

一次性拼接一个字符串时就可以用➕

15 Java金额计算怎么避免精度丢失?

金额运算尽量使用BigDecimal(String val)进行计算

数据库存储金额,一般是整形和浮点型两种,如果有汇率转换,建议用decimal进行存储,可以灵活控制精度,decimal直接对应Java 类型BigDecimal。

16 怎么理解Java的类型提升?

所谓类型提升,就是在含有多种数据类型的表达式中,类型会自动向范围表示大的数据类型提升。比如:

long count=100000000;
int price=1999;
long totalPrice=price*count;   //运算结果为long型,没有溢出

17 String有没有长度限制?

有,65534个字节,超过的话编译报错

18 Java语法糖是什么意思?

也称糖衣语法,指在计算机语言中添加的某种语法,对语言本身功能没有影响,只是为了便于程序员开发,提高效率。就是对现有语法的封装。

Java语法糖主要有:

泛型与类型擦除

自动装箱与拆箱

变长参数

增强for循环

内部类

枚举类

19 transient关键字的作用

  1. transient修饰的变量不能被序列化
  2. transient只作用于实现Serializable接口
  3. transient只能用来修饰普通成员变量字段
  4. 不管有无transient修饰,静态变量不能被序列化

20 如何实现对象克隆?

可以通过实现Cloneable接口,然后重写其clone()方法

21 Java8 添加的新特性

  • Lambda表达式
  • 函数式接口
  • 接口默认方法和静态方法
  • Optional类
  • 重复注解
  • BASE64编码解码已经加入jdk8
  • JVM内存取消永久代

22 String、StringBuffer、StringBuilder有什么区别?

String、StringBuffer、StringBuilder最大的不同是String不可变,后者可变。StringBuffer是线程安全的,StringBuilder线程不安全速度较快。

23 String与byte[]两者相互之间如何转换?

String > byte[] 通过String类的getBytes方法;byte[] > String通过new String(byte[])构造器。

24 普通类和抽象类有什么区别?

  • 普通类不能包含抽象方法,抽象类可以
  • 抽象类不能直接实例化,普通类可以直接实例化

25

你可能感兴趣的:(java,编程语言,面试)