数据库
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的区别?
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();
}
}
}