风离不摆烂学习日志Day19 Java 面经整理 京东一面(基础)
风离不摆烂学习日志Day19 Java 面经整理 京东一面(基础)
Q1:方法的重载和覆盖(重写)有什么区别?
A:
首先
我觉得方法重载是一个方法的复用 可以使方法具有多种不同的表现形式 他的方法名相同 形参个数或者 形参类型不同 返回值类型也可以不同 在实际应用中我们经常可以看到有些方法可以有多种的传参 这就是方法重载的典型案例
(方法重载补充 如果参数类型和个数一样,返回值类型不同是不算重载的 并且编译器不会通过)
对于方法覆盖 我的理解是 子类覆盖或者接口的实现 对于该方法的重写 与方法重载不同的点就是 它约束了返回值和传参列表 需要与覆盖前的方法保持一致
Q2:Java的抽象类和接口有什么区别?(经典)
A:
首先 抽象类 是对具体事物的一种抽象 我们可以把某些类的共同特征抽离出来 封装到抽象类中 继承抽象类 会获得抽象类中所有的公共方法和可被访问的参数
接口方法仅仅描述方法能做什么,但是不指定如何去做,所以接口中的方法都是抽象的(abstract方法)
1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰
2.接口中,没有构造方法,不能创建对象
3.接口中,没有静态代码块
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.程序计数区:为线程编号
2.虚拟机栈:Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧
3.本地方法栈:Native方法服务
4.堆区:存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存
5.方法区:存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。包含运行时的常量池
Q:讲一下MySQL索引的数据结构?
A:
在 MySQL 中采用的是 B+ 树
… 经典八股文