兴业数金Java8月24日面试

数据库

  1. where和having区别,执行顺序的前后?

    where子句在group by分组和聚合函数之前对数据进行过滤,having子句对group by分组聚合函数之后的数据进行过滤。

  2. DateTime和TimeStamp哪个类型有保存时区信息?

    TimeStamp有保存时区信息

  3. 不可重复读和幻读的区别?

  • 幻读是读取到其他事务插入的数据,侧重于新增。(可串行化解决幻读)
  • 不可重复读,一个事务前后两次读取到的数据不一致,侧重于修改与删除。(可重复读解决这个)
  • 脏读:读取到的是其他事务未提交的数据。(已提交读解决脏读)
  1. MySQL索引的最左匹配原则?

    最左前缀匹配原则指的是,在使用联合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询,如 ><between以%开头的like查询 等条件,才会停止匹配。

    所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。

  2. 介绍下索引用的数据结构,优缺点。

    B+树

  3. 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
  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
  2. 线程池介绍下

  3. 信号量介绍下,用过吗?

    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();
            }
        }
    }
  4. 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();
        }
    }
}
  1. Redis如何实现分布式ID?
  • 如何实现分布式锁?
全部评论
说下后续,9月6号发了内审。面试的贼烂,把long类型长度说成128位也没谁了
点赞
送花
回复 分享
发布于 2022-09-07 10:42 四川
现在怎么样了,hxd准备去哪
点赞
送花
回复 分享
发布于 2022-10-11 15:04 重庆
国泰君安
校招火热招聘中
官网直投

相关推荐

6 26 评论
分享
牛客网
牛客企业服务