java常见面试问题总结
程序员文章站
2022-07-10 18:40:29
1.MySQL中索引失效的情况SQL语句中有"or"的时候,索引会失效。模糊查询中以"%"开头时,索引失效。当mysql数据全表扫描的时候,存储的数据比较少时。查询语句中用到了类型转换,索引也会失效(查询的列是字符串,数据没有用双引号)。...
1.MySQL中索引失效的情况
- SQL语句中有"or"的时候,索引会失效。
- 模糊查询中以"%"开头时,索引失效。
- 当mysql数据全表扫描的时候,存储的数据比较少时。
- 查询语句中用到了类型转换,索引也会失效(查询的列是字符串,数据没有用双引号)。
- where子句中使用了函数或者进行运算,这时也会失效。
2.死锁产生的四个条件
什么是死锁:两个或两个以上的进程执行时,因争夺资源而互相等待的现象,如果没有外力的作用推进,它们都将不会执行下去。
- 互斥条件:在一段时间内,某一个资源只能被一个进程使用,其他进程不能使用,进行排斥。
- 独占条件:一个进程请求资源时阻塞,对已获得的资源保持不放。
- 不可剥夺条件:进程请求获得的资源,没有使用完之前不能强行剥夺,只能有它自己释放资源。
- 循环等待条件:若干进程之间形成头尾相接的循环等待资源。
3.线程的五种状态
- 新建状态(New):当线程对象创建后,即进入新建状态。
- 就绪状态(Runnable):当调用线程对象的start()方法后,线程标志着进入就绪状态。注意:就绪状态线程没有执行,只是做好了准备,等待CPU的调度。
- 运行状态(Running):当CPU调度处于就绪状态的线程时,线程才真正的执行,即进入到运行状态。注意:就绪状态是进入运行状态的唯一通道,只有就绪状态的进程才能进入运行状态。
- 阻塞状态(Blocked):处于正在运行的线程,由于受到某种原因,暂停对CPU的使用权,进入阻塞状态。注意:只有再次进入就绪状态,CPU才来调度运行。
-
死亡状态(Dead):线程正常执行完或者异常结束了run()方法,结束了线程的生命周期。
对于阻塞状态,又有以下几种情况:
(1)等待阻塞:处于正在运行状态的线程,执行了wait()方法,使该线程进入等待阻塞。
(2)同步阻塞:线程在获取同步锁(synchronized)时失败,锁被其他线程占用,它就会进入同步阻塞状态。
(3)其他阻塞:运行状态的线程调用了sleep()或者join()或者发送了I/O请求,也会进入阻塞状态。
4.数据库事务的四个特性、三个并发读问题、四个隔离级别
-
四个特性(ACID):
(1)原子性(Atomicity):一个事务中的所有操作是不可再分割的原子单位。简单点说就是这个事务中的一系列增删改操作,只要有一个没有执行或者执行失败,就要回滚,全部失败。
(2)一致性(Consistency):事务执行之前与事务执行之后的数据状态之和保持一致。
(3)隔离性(Isolation):在并发的操作中,不同的事务分开处理,使它们互相不影响。
(4)持久性(Durability):事务一旦提交成功之后,事务中对数据的操作(增删改)都必须持久化到数据库中, -
三个并发读问题:
(1)脏读:一个事务中读取到另一个事务还未提交的数据,读取到的数据就是脏数据。
(2)不可重复读(针对修改):对于同一个记录两次读取到的数据不一致。这是因为在两次查询期间,有另一个事务对该记录进行了修改。
(3)幻读(针对增加、删除):对同一张表,两次查询的数据不一样。因为查询期间,另一个事务对这个表进行了插入或者删除操作。 -
四个隔离级别:
(1)读未提交数据(read uncommitted):安全性最差,容易出现脏读、不可重复读、幻读,但性能最好。(一般不推荐使用!)
(2)读已提交数据(read committed):安全性一般,可防止脏读,但容易出现不可重复读、幻读。(Oracle默认)
(3)可重复读(repeatable read):安全性较好,可防止脏读、不可重复读,但容易出现幻读。(MySQL默认)
(4)串行化(serialiable):安全性最好,可防止脏读、不可重复读、幻读,但性能最差。
5.悲观锁、乐观锁
- 悲观锁(Synchronized):也叫同步锁、互斥锁,每次获取数据资源进行操作时都会加上锁,为了保证使用时不被其他人修改。加上锁之后,其他线程对该数据资源的操作只能等待,只有该操作完成之后解锁,才能获取数据操作。
- 乐观锁(ReentrantReadWriteLock):也叫读写锁。由于不用担心别人对数据的修改,所以每次读取数据时没有加锁,多个线程可以同时读取数据。但在更新数据时,先判断其他线程有没有对该数据修改,有,就不更新,没有,就更新数据。
6.线程池的执行过程
兄弟们,话不多说,一图顶白文:
7.string、stringBuffer、stringBuilder的区别
- 运行速度:stringBuilder>stringBuffer>string
- 线程安全:stringBuilder线程是不安全的,stringBuffer线程是安全的。
-
(1)string:适用于少量的字符串操作情况。
(2)stringbuffer:适用于多线程下在字符缓冲区进行大量操作的情况。
(3)stringbuilder:适用于单线程下在字符缓冲区进行大量操作的情况。
8.字符串存储的机制是什么
字符串存储在常量池中。在给字符串赋值时,JVM会检查常量池中是否已经存在该字符串,如果存在则直接引用该地址,如果不存在会在常量池中创建该字符串然后引用地址。
9.内存泄漏
定义:指系统中存在无法回收的内存;有时候会造成内存不足或者系统崩溃。
java中也存在内存泄漏:若无用但垃圾回收器无法回收的对象。即使存在内存泄漏问题,也不一定会表现出来。我们自己实现堆栈的数据结构时可能会存在内存泄漏。
10.多线程有几种实现方法、同步有几种实现方法
- 多线程有两种实现方法:继承Thread类、实现Runnable接口。
-
同步有两种:一种是同步方法,另一种是同步代码块。
(1)同步方法:是在方法返回类型前面加上synchronized关键字。
(2)同步代码块:synchronized(这里写需要同步的对象){…}
11.包装类型的作用
java是一个面向对象的编程语言,基本类型不具有对象的性质,为了让基本数据类型也具有对象的特征,就出现了包装类型。它相当于将基本类型“包装起来”,使它具有对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。如我们使用集合时,存入的都是包装类型,而非基本类型,另外需要往ArrayList、HashMap中放东西时,像long,int这些是放不进去的,因为容器都是object的,这时候就要包装类型了。
本文地址:https://blog.csdn.net/zjw_0907/article/details/107869895