风离不摆烂学习日志Day19 Java 面经整理 京东一面(基础)

Q1:方法的重载和覆盖(重写)有什么区别?

A:

首先

我觉得方法重载是一个方法的复用 可以使方法具有多种不同的表现形式 他的方法名相同 形参个数或者 形参类型不同 返回值类型也可以不同 在实际应用中我们经常可以看到有些方法可以有多种的传参 这就是方法重载的典型案例

(方法重载补充 如果参数类型和个数一样,返回值类型不同是不算重载的 并且编译器不会通过)

image-20230112104026095

对于方法覆盖 我的理解是 子类覆盖或者接口的实现 对于该方法的重写 与方法重载不同的点就是 它约束了返回值和传参列表 需要与覆盖前的方法保持一致


Q2:Java的抽象类和接口有什么区别?(经典)

A:

首先 抽象类 是对具体事物的一种抽象 我们可以把某些类的共同特征抽离出来 封装到抽象类中 继承抽象类 会获得抽象类中所有的公共方法和可被访问的参数

接口方法仅仅描述方法能做什么,但是不指定如何去做,所以接口中的方法都是抽象的(abstract方法)

​ 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰

2.接口中,没有构造方法,不能创建对象

3.接口中,没有静态代码块

img


Q3:Java里面的集合有哪些?

A:

首先 我们可以根据实现的接口来划分

一种是 Collection接口 一种是 Map接口

在实现Collection接口中 又分出 两类 实现 List接口(ArrayList)和实现 Set (HashSet) 接口的类

在实现Map接口中 有 如 HashMap HashTable 等类

还可以根据 是否线程安全来划分

目前常用的集合 都是非线程安全的 如果要转化成线程安全的集合 可以使用Collections包装方法 如

Collections.synchronizedList(new ArrayList());

然后就是线程安全的集合 例如java.util.concurrent包中的集合 ConcurrentHashMap


Q:说一下HashTable和ConcurrentHashMap有哪些区别?

A:

ConcurrentHashMap 是java.util.concurrent包中的集合 是线程安全的集合

HashTable 也是 但是我们看HashTable的底层实现 是通过给每个方法都用synchronized关键字进行加锁,这样我们的整个哈希表只有一把锁,当我们有十个线程竞争锁的时候,只要有一个线程的到锁,其他九个线程就需要阻塞等待,这会导致整个效率比较低效。所以我们使用ConcurrentHashMap这样的线程安全的哈希表更好。

ConcurrentHashMap对读操作不加锁,只对写操作进行加锁


Q:说到多线程,讲一下如果有三个线程ABC,如果要ABC依次执行,应该怎么做?

A:

我平时业务中最常使用的是 CompletableFuture 的.thenRun()方法 可以链式依次执行

然后信号量也可以实现 Semaphore(信号量) ab bc 需要两个信号量 一个来抢占 执行完毕后释放

ReentrantLock-Condition(重入锁)

SingleThreadExecutor单线程池先进先出


Q:sleep()和wait()有什么区别?

A:

一、sleep()和wait()的区别
1、相同点
sleep()和wait()都可以暂停线程的执行。
2、不同点
所在类不同
sleep()是Thread类的静态方法。
wait()是Object类的方法。

锁释放不同
sleep()是不释放锁的。
wait()是释放锁的。

用途不同
sleep()常用于一定时间内暂停线程执行。
wait()常用于线程间交互和通信。

用法不同
sleep()方法睡眠指定时间之后,线程会自动苏醒。
wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。


Q:讲一下Java的内存机制?

A:

  1. 1.程序计数区:为线程编号

    2.虚拟机栈:Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧

    3.本地方法栈:Native方法服务

    4.堆区:存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存

    5.方法区:存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。包含运行时的常量池


Q:讲一下MySQL索引的数据结构?

A:

在 MySQL 中采用的是 B+ 树

… 经典八股文