1.重写重载区别?
特性 | 重写(Override) | 重载(Overload) |
---|---|---|
定义 | 子类定义一个与父类方法签名完全相同的方法,实现特定的行为。 | 在同一个类中定义多个同名方法,参数列表不同。 |
方法名 | 必须相同 | 必须相同 |
参数列表 | 必须相同 | 必须不同 |
返回类型 | 必须与父类相同或为父类返回类型的子类型(协变返回类型) | 可以不同 |
访问级别 | 不能比父类更严格(可以相同或更宽松) | 可以不同 |
异常 | 不能抛出新的检查型异常,或者抛出的异常类型应该是父类方法抛出异常类型的子类型。 | 可以抛出不同的异常。 |
发生地点 | 发生在继承关系中的子类和父类之间 | 发生在同一个类的不同方法之间 |
主要目的 | 改变父类行为的一部分以适应新的情况 | 根据不同的参数执行不同的逻辑 |
多态的表现 | 是多态的表现,调用方法时实际执行的是子类的实现。 | 不是多态的表现,调用哪个方法取决于参数列表。 |
使用场景 | 当子类需要提供特定的实现时使用 | 当需要根据不同的输入参数执行不同的操作时使用 |
总结 | 重写是子类实现父类方法的特定行为,重载是同一个类中定义多个同名方法,参数列表不同。 | 重写是改变父类行为的一部分以适应新的情况,重载是根据不同的参数执行不同的操作。 |
2.Map有什么特点?
Java中的Map
接口用于存储键值对,具有以下特点:
- 键值对映射:键(key)与值(value)一一对应。
- 键的唯一性:每个键在
Map
中是唯一的。 - 无序集合:
Map
不保证元素的顺序,除非使用SortedMap
。 - 快速检索:通过键可以快速检索到对应的值。
- 操作方法:提供添加、更新、删除和检查键值对的方法。
- 视图操作:提供键集、值集和映射项集的视图。
- 集合操作:支持将另一个
Map
的所有键值对添加到当前Map
中。 - 映射关系:通过
entrySet()
访问映射项的集合视图。 - null值:某些
Map
实现允许null键和null值。 - 多种实现:如
HashMap
、TreeMap
、LinkedHashMap
等。 - 线程安全:不同实现有不同的线程安全特性。
Map
是Java集合框架的一部分,适用于需要通过键快速访问值的场景。
3.HashMap底层实现原理?
-
底层实现原理:
HashMap
是基于哈希表实现的,它存储键值对(key-value pairs)。 -
数据结构: 数组 + 链表 + 红黑树:
HashMap
使用数组来存储数据,每个数组元素指向一个链表或红黑树。 -
节点:每个键值对被封装成一个节点(
Node
),包含键、值、哈希值和下一个节点。 -
存储和检索
- 哈希函数:用于计算键的哈希码,然后转换为数组索引。
put
操作:插入键值对时,使用哈希函数计算索引,处理哈希冲突,链表长度超过阈值时转换为红黑树。get
操作:检索键对应的值时,使用哈希函数计算索引,遍历链表或红黑树找到匹配的键。
-
扩容机制
resize
操作:当元素数量达到容量和装载因子的乘积时,HashMap
会进行扩容,新容量是旧容量的两倍,并重新分布所有节点。 -
线程不安全:
HashMap
不是线程安全的,多线程环境下需要外部同步或使用ConcurrentHashMap
。 -
迭代器:
HashMap
提供迭代器来遍历所有键值对,但如果在迭代过程中修改结构,会导致迭代器快速失败。
4.Java中实现多线程有几种方法?
1. 继承Thread类:通过扩展java.lang.Thread类创建一个新类,并重写其run()方法,然后创建该类的实例并调用start()方法来启动线程。
class MyThread extends Thread {
public void run(){
// 线程执行的代码
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2. 实现Runnable接口:创建一个实现java.lang.Runnable接口的类,并实现run()方法,然后将该类的实例传递给Thread构造函数来创建线程。
class MyRunnable implements Runnable {
public void run(){
// 线程执行的代码
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
3. 实现Callable接口:与Runnable类似,但Callable接口的call()方法可以返回一个结果或抛出异常。通常与Future对象一起使用来获取线程的执行结果。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyCallable implements Callable<Integer> {
public Integer call() throws Exception {
// 线程执行的代码
return 1; // 返回结果
}
}
public class Main {
public static void main(String[] args) {
FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
try {
Integer result = futureTask.get();
// 处理结果
} catch (Exception e) {
e.printStackTrace();
}
}
}
除了上述三种基本方式,Java还提供了Executor框架来管理和控制线程,包括线程池等高级功能。使用Executor框架可以更有效地管理和重用线程,提高程序的性能和可维护性。
5.Java中synchronized 和 ReentrantLock 有什么不同?
特性 | synchronized | ReentrantLock |
---|---|---|
实现方式 | Java内置特性,基于监视器对象 | java.util.concurrent.locks 中的类,提供了更丰富的功能 |
锁的获取与释放 | 自动获取和释放 | 需要显式调用lock() 和unlock() |
公平性 | 非公平锁 | 可构造为公平锁 |
条件变量 | 使用wait() 、notify() 、notifyAll() | 提供Condition 对象,支持多个条件变量 |
可中断的锁获取 | 不可中断 | 支持可中断的锁获取 |
尝试非阻塞获取锁 | 不支持 | 支持tryLock() |
性能 | 早期版本性能较差,但JVM优化后有所提升 | 在某些情况下可能提供更好的性能 |
6.线程池核心的参数?
7.线程池拒绝策略?
8.数据库事务四个属性?
9.SQL优化?
10.索引、组合索引、覆盖索引?
11.数据库读写分离优化方案?
12.事务隔离级别有哪些?MySQL的默认隔离级别是?
13.MySQL中有哪几种锁?
14.Spring Cloud和dubbo区别?
15.微服务网关做什么的?
16.说说你对分布式事务的了解?
17.你知道哪些分布式事务解决方案?
18.分布式锁哪些实现方案?
19.Jdk1.8的新特性?
20.如何提高系统的并发能力?
21.Springboot常用注解?
注解 | 描述 |
---|---|
@SpringBootApplication | 标记一个应用为Spring Boot应用,通常放在主类上,用于启动应用 |
@Component | 表示一个类是Spring容器的组件,通常用于类级别注解 |
@Configuration | 标记一个类为配置类,用于定义Bean |
@Bean | 在配置类中,标记一个方法为Bean定义 |
@RestController | 组合了@Controller和@ResponseBody,表示一个控制器类,其所有方法的返回值都会直接作为响应体 |
@Controller | 表示一个类是控制器类,用于处理HTTP请求 |
@RequestMapping | 用于映射HTTP请求到控制器方法 |
@GetMapping | 用于映射HTTP GET请求到控制器方法 |
@PostMapping | 用于映射HTTP POST请求到控制器方法 |
@PutMapping | 用于映射HTTP PUT请求到控制器方法 |
@DeleteMapping | 用于映射HTTP DELETE请求到控制器方法 |
@PathVariable | 用于将请求URL中的模板变量映射到功能处理方法的参数上 |
@RequestParam | 用于将请求参数区数据映射到功能处理方法的参数上 |
@RequestBody | 用于将HTTP请求体映射到功能处理方法的参数上 |
@ResponseBody | 表示该方法的返回值直接作为HTTP响应体 |
@Service | 表示一个类是业务逻辑组件,用于服务层 |
@Autowired | 用于自动注入Bean |
@Qualifier | 与@Autowired配合使用,按名称注入Bean |
@ComponentScan | 指定Spring自动扫描组件的路径 |
@Repository | 表示一个类是数据仓库组件,用于数据访问层 |
@Transactional | 用于声明事务边界 |
@EnableAutoConfiguration | 启用自动配置,通常与@SpringBootApplication一起使用 |
@EnableWebMvc | 启用Spring MVC的默认配置 |
@MapperScan | 指定MyBatis Mapper接口的扫描路径 |
22.SpringCloud组件?
23.Springboot启动流程?
24.Redis哨兵模式
25.Redis集群模式
26.Redis哨兵模式和集群模式区别
27.什么是缓存雪崩?
28.什么是缓存击穿?
29.什么是缓存穿透?
30.什么是缓存预热?
31.什么是缓存更新?
32.什么是缓存降级?
33.Mybatis #{}和${}的区别是什么?
34.使用 rabbitmq 的场景?
35.自定义注释作用?
36.String、StringBuffer 和 StringBuilder 的区别?
37.dubbo的工作原理?
38.springcloud 与springboot的关系?
39.== 和 equals 的区别?
40.Linux 常用的命令?
41.Springbatch它的介绍和原理?
42.说一下你理解的多态?
43.谈谈使用spring的优点?
44.怎么实现线程安全?
45.单例模式的好处?
46.地理位置存储怎么存储?
47.多线程中sleep() 和 wait()的区别?
48.SpringMVC执行流程?
49.Springboot启动流程?
50.Try()小括号写法作用?
51.平衡二叉树的特点?
52.Maven是干什么用的?
53.有了解过领域驱动设计吗?
54.hibernate和mybatis的区别
55.Orcale 和mysql的区别吗?
56.Consul有没有用过?
57.mybatis的动态sql实现原理
58.Mybatis常用sql标签?
59.Java语言有哪些特点
60.面向对象和面向过程的区别
61.instanceof 关键字的作用
62.Java自动装箱与拆箱
63.Hashcode的作用
64.ArrayList和linkedList的区别
65.HashMap和HashTable的区别
66.Java的四种引用,强弱软虚
67.泛型常用特点
68.Java创建对象有几种方式?
69.有没有可能两个不相等的对象有相同的hashcode
70.深拷贝和浅拷贝的区别是什么?
71.static都有哪些用法?
72.Excption与Error包结构
73.OOM你遇到过哪些情况,SOF你遇到过哪些情况
74.简述线程、程序、进程的基本概念。以及他们之间关系是什么?
75.Java 序列化中如果有些字段不想进行序列化,怎么办?
76.说说Java 中 IO 流
77.java反射的作用于原理
78.说说List,Set,Map三者的区别?
79.Object 有哪些常用方法?大致说一下每个方法的含义
80.Java 创建对象有几种方式?
81.获取一个类Class对象的方式有哪些?
82.ArrayList 和 LinkedList 的区别有哪些?
83.HashMap 与 ConcurrentHashMap 的异同
84.红黑树有哪几个特征?
85.说说你平时是怎么处理 Java 异常的
86.说说深拷贝和浅拷贝?
87.说说类加载与卸载
88.简述一下JVM的内存模型
89.说说堆和栈的区别
90.什么时候会触发FullGC
91.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
92.说说对象分配规则
93.描述一下JVM加载class文件的原理机制?
94.说说Java对象创建过程
95.知道类的生命周期吗?
96.简述Java的对象结构
97.如何判断对象可以被回收?
98.JVM的永久代中会发生垃圾回收么?
99.你知道哪些垃圾收集算法
100.调优命令有哪些?
101.常见调优工具有哪些
102.Minor GC与Full GC分别在什么时候发生?
103.你知道哪些JVM性能调优参数?
104.对象一定分配在堆中吗?有没有了解逃逸分析技术?
105.虚拟机为什么使用元空间替换了永久代?
106.说一下JVM 的主要组成部分及其作用?
107.什么是指针碰撞?
108.什么是空闲列表?
109.什么是TLAB?
110.对象头具体都包含哪些内容?
111.你知道哪些JVM调优参数?
112.说一下 JVM 有哪些垃圾回收器?
113.如何选择垃圾收集器?
114.什么是类加载器?
115.说说Java中实现多线程有几种方法
116.如何停止一个正在运行的线程
117.notify()和notifyAll()有什么区别?
118.volatile 是什么?可以保证有序性吗?
119.Thread 类中的start() 和 run() 方法有什么区别?
120.为什么wait, notify 和 notifyAll这些方法不在thread类里面?
121.为什么wait和notify方法要在同步块中调用?
122.Java中synchronized 和 ReentrantLock 有什么不同?
123.SynchronizedMap和ConcurrentHashMap有什么区别?
124.什么是线程安全
125.Thread类中的yield方法有什么作用?
126.Java线程池中submit() 和 execute()方法有什么区别?
127.说一说自己对于 synchronized 关键字的了解
128.说说自己是怎么使用 synchronized 关键字?
synchronized关键字在Java中用于实现同步控制,它主要用于确保线程安全,防止数据的不一致性问题。synchronized可以应用于方法或代码块,以下是几种典型的使用方式:
- 同步方法
当将synchronized修饰符应用于实例方法时,它会锁定当前对象实例(即this),确保同一时间只有一>个线程可以访问该方法。
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在这个例子中,increment()和getCount()方法都被声明为synchronized,这意味着在同一时间只有一个线程能够调用这两个方法中的任意一个,防止了并发访问导致的计数错误。
- 同步代码块
相比于同步整个方法,同步代码块提供了更细粒度的控制,只锁定必要的代码部分,减少锁的范围,提高并发效率。
public class Counter {
private int count = 0;
private Object lock = new Object();
public void increment() {
synchronized(lock) {
count++;
}
}
public int getCount() {
synchronized(lock) {
return count;
}
}
}
这里使用了一个独立的锁对象lock,而不是直接锁定this,这样可以更灵活地控制同步区域,并且可以在不同方法中使用同一个锁对象,实现跨方法的同步。
- 类级别的同步
当synchronized修饰静态方法时,它锁定的是类的Class对象,这意味着无论创建了多少个该类的实例,所有实例在访问该静态方法时都将同步。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在这个单例模式的实现中,getInstance()方法是静态且同步的,确保了即使在多线程环境下,Singleton的实例也只会被创建一次。
- 注意事项
– 使用synchronized时要谨慎,因为它会阻塞线程,可能影响程序的性能。
– 尽量减小同步代码块的范围,以减少锁的竞争,提高并发度。
– 考虑使用java.util.concurrent包下的高级并发工具类(如ReentrantLock, Semaphore, CountDownLatch等),它们提供了更灵活的同步机制和更高的性能。
129.什么是线程安全?Vector是一个线程安全类吗?
130.volatile关键字的作用?
以下回答volatile和synchronized的区别
关键字 | 作用范围 | 描述 |
---|---|---|
volatile | 属性 | 无法描述同步处理,它只是一种直接内存的处理,避免了副本操作 |
synchronized | 代码块或方法 | 是实现同步的 |
它们没有本质的关联,但是使用volatile的时候,要出现synchronized.