欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java常见面试问题总结

程序员文章站 2022-07-10 18:40:29
1.MySQL中索引失效的情况SQL语句中有"or"的时候,索引会失效。模糊查询中以"%"开头时,索引失效。当mysql数据全表扫描的时候,存储的数据比较少时。查询语句中用到了类型转换,索引也会失效(查询的列是字符串,数据没有用双引号)。...

1.MySQL中索引失效的情况

  1. SQL语句中有"or"的时候,索引会失效。
  2. 模糊查询中以"%"开头时,索引失效。
  3. 当mysql数据全表扫描的时候,存储的数据比较少时。
  4. 查询语句中用到了类型转换,索引也会失效(查询的列是字符串,数据没有用双引号)。
  5. where子句中使用了函数或者进行运算,这时也会失效。

2.死锁产生的四个条件

什么是死锁:两个或两个以上的进程执行时,因争夺资源而互相等待的现象,如果没有外力的作用推进,它们都将不会执行下去。

  1. 互斥条件:在一段时间内,某一个资源只能被一个进程使用,其他进程不能使用,进行排斥。
  2. 独占条件:一个进程请求资源时阻塞,对已获得的资源保持不放。
  3. 不可剥夺条件:进程请求获得的资源,没有使用完之前不能强行剥夺,只能有它自己释放资源。
  4. 循环等待条件:若干进程之间形成头尾相接的循环等待资源。

3.线程的五种状态

  1. 新建状态(New):当线程对象创建后,即进入新建状态。
  2. 就绪状态(Runnable):当调用线程对象的start()方法后,线程标志着进入就绪状态。注意:就绪状态线程没有执行,只是做好了准备,等待CPU的调度。
  3. 运行状态(Running):当CPU调度处于就绪状态的线程时,线程才真正的执行,即进入到运行状态。注意:就绪状态是进入运行状态的唯一通道,只有就绪状态的进程才能进入运行状态。
  4. 阻塞状态(Blocked):处于正在运行的线程,由于受到某种原因,暂停对CPU的使用权,进入阻塞状态。注意:只有再次进入就绪状态,CPU才来调度运行。
  5. 死亡状态(Dead):线程正常执行完或者异常结束了run()方法,结束了线程的生命周期。
    对于阻塞状态,又有以下几种情况:
    (1)等待阻塞:处于正在运行状态的线程,执行了wait()方法,使该线程进入等待阻塞。
    (2)同步阻塞:线程在获取同步锁(synchronized)时失败,锁被其他线程占用,它就会进入同步阻塞状态。
    (3)其他阻塞:运行状态的线程调用了sleep()或者join()或者发送了I/O请求,也会进入阻塞状态。

4.数据库事务的四个特性、三个并发读问题、四个隔离级别

  1. 四个特性(ACID):
    (1)原子性(Atomicity):一个事务中的所有操作是不可再分割的原子单位。简单点说就是这个事务中的一系列增删改操作,只要有一个没有执行或者执行失败,就要回滚,全部失败。
    (2)一致性(Consistency):事务执行之前与事务执行之后的数据状态之和保持一致。
    (3)隔离性(Isolation):在并发的操作中,不同的事务分开处理,使它们互相不影响。
    (4)持久性(Durability):事务一旦提交成功之后,事务中对数据的操作(增删改)都必须持久化到数据库中,
  2. 三个并发读问题:
    (1)脏读:一个事务中读取到另一个事务还未提交的数据,读取到的数据就是脏数据。
    (2)不可重复读(针对修改):对于同一个记录两次读取到的数据不一致。这是因为在两次查询期间,有另一个事务对该记录进行了修改。
    (3)幻读(针对增加、删除):对同一张表,两次查询的数据不一样。因为查询期间,另一个事务对这个表进行了插入或者删除操作。
  3. 四个隔离级别:
    (1)读未提交数据(read uncommitted):安全性最差,容易出现脏读、不可重复读、幻读,但性能最好。(一般不推荐使用!)
    (2)读已提交数据(read committed):安全性一般,可防止脏读,但容易出现不可重复读、幻读。(Oracle默认)
    (3)可重复读(repeatable read):安全性较好,可防止脏读、不可重复读,但容易出现幻读。(MySQL默认)
    (4)串行化(serialiable):安全性最好,可防止脏读、不可重复读、幻读,但性能最差。

5.悲观锁、乐观锁

  1. 悲观锁(Synchronized):也叫同步锁、互斥锁,每次获取数据资源进行操作时都会加上锁,为了保证使用时不被其他人修改。加上锁之后,其他线程对该数据资源的操作只能等待,只有该操作完成之后解锁,才能获取数据操作。
  2. 乐观锁(ReentrantReadWriteLock):也叫读写锁。由于不用担心别人对数据的修改,所以每次读取数据时没有加锁,多个线程可以同时读取数据。但在更新数据时,先判断其他线程有没有对该数据修改,有,就不更新,没有,就更新数据。

6.线程池的执行过程

兄弟们,话不多说,一图顶白文:
java常见面试问题总结

7.string、stringBuffer、stringBuilder的区别

  1. 运行速度:stringBuilder>stringBuffer>string
  2. 线程安全:stringBuilder线程是不安全的,stringBuffer线程是安全的。
  3. (1)string:适用于少量的字符串操作情况。
    (2)stringbuffer:适用于多线程下在字符缓冲区进行大量操作的情况。
    (3)stringbuilder:适用于单线程下在字符缓冲区进行大量操作的情况。

8.字符串存储的机制是什么

字符串存储在常量池中。在给字符串赋值时,JVM会检查常量池中是否已经存在该字符串,如果存在则直接引用该地址,如果不存在会在常量池中创建该字符串然后引用地址。

9.内存泄漏

定义:指系统中存在无法回收的内存;有时候会造成内存不足或者系统崩溃。
java中也存在内存泄漏:若无用但垃圾回收器无法回收的对象。即使存在内存泄漏问题,也不一定会表现出来。我们自己实现堆栈的数据结构时可能会存在内存泄漏。

10.多线程有几种实现方法、同步有几种实现方法

  1. 多线程有两种实现方法:继承Thread类、实现Runnable接口。
  2. 同步有两种:一种是同步方法,另一种是同步代码块。
    (1)同步方法:是在方法返回类型前面加上synchronized关键字。
    (2)同步代码块:synchronized(这里写需要同步的对象){…}

11.包装类型的作用

java是一个面向对象的编程语言,基本类型不具有对象的性质,为了让基本数据类型也具有对象的特征,就出现了包装类型。它相当于将基本类型“包装起来”,使它具有对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。如我们使用集合时,存入的都是包装类型,而非基本类型,另外需要往ArrayList、HashMap中放东西时,像long,int这些是放不进去的,因为容器都是object的,这时候就要包装类型了。

本文地址:https://blog.csdn.net/zjw_0907/article/details/107869895

相关标签: java 面试问题