兴业数金Java8月24日面试
数据库
-
where和having区别,执行顺序的前后?
where子句在group by分组和聚合函数之前对数据进行过滤,having子句对group by分组聚合函数之后的数据进行过滤。
-
DateTime和TimeStamp哪个类型有保存时区信息?
TimeStamp有保存时区信息
-
不可重复读和幻读的区别?
- 幻读是读取到其他事务插入的数据,侧重于新增。(可串行化解决幻读)
- 不可重复读,一个事务前后两次读取到的数据不一致,侧重于修改与删除。(可重复读解决这个)
- 脏读:读取到的是其他事务未提交的数据。(已提交读解决脏读)
-
MySQL索引的最左匹配原则?
最左前缀匹配原则指的是,在使用联合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询,如 >、<、between 和 以%开头的like查询 等条件,才会停止匹配。
所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。
-
介绍下索引用的数据结构,优缺点。
B+树
-
Java中存储金额的数据类型?
BigDecimal类。
new BigDecimal对象的时候,使用字符串创建和double创建的区别?
传入double入参,实际上是调用了double的toString方法,造成了精度截断。
//BigDecimal, 使用字符串创建,而不是double,传入double表示不准确 BigDecimal bigDecimal = new BigDecimal(12.1); //输出12.09999 BigDecimal quoteBigDecimal = new BigDecimal("12.1"); //输出12.1
-
Long类型可以用==比较吗?
包装类型-128到127 可以用==比较,其他用equal比较,基础类型可以用==比较,因为Long包对常用的数做了缓存。
//long的大小是64位,int是32位 Long pos127 = Long.valueOf(127L); Long pos127_1 = Long.valueOf(127L); System.out.println(pos127 == pos127_1); //true
-
线程池介绍下
-
信号量介绍下,用过吗?
Semaphore类,用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公共资源。
主要两个方法acquire和release方法,分别为消耗信号量和增加信号量。
package xingye; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; public class SemaphoreDemo { //信号量 private static final Semaphore semaphore = new Semaphore(10); private static AtomicInteger t = new AtomicInteger(0); public static void main(String[] args) { //保证了最多同时只有10个线程在运行 for(int i=0;i<30;i++){ Thread th = new Thread(() -> { try { //申请信号量 semaphore.acquire(); System.out.println(t.getAndIncrement()); //模拟线程处理一些任务 Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } //释放信号量 semaphore.release(); }); th.start(); } } }
-
wait和sleep的区别?
- wait和sleep都可以暂停线程。
- sleep()方法没有释放锁,而wait()方法释放了锁 。
- wait()通常被用于线程间交互/通信,sleep()通常被用于暂停执行。
- wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒,或者也可以使用wait(long timeout)超时后线程会自动苏醒。
- sleep()是Thread类的静态本地方法,wait()则是Object类的本地方法。为什么这样设计呢?
public class WaitDemo { private static Object object = new Object(); public static void main(String[] args) throws InterruptedException { Thread th = new Thread(()->{ try { System.out.println("进入子线程"); synchronized (object){ //Thread.sleep(2000); object.wait(); } System.out.println("子线程被唤醒"); } catch (InterruptedException e) { throw new RuntimeException(e); } }); th.start(); Thread.sleep(200); synchronized (object){ System.out.println("主线程唤醒一个wait的线程"); object.notify(); } } }
- Redis如何实现分布式ID?
- 如何实现分布式锁?