整理一下面试中遇到的技术问题

  1. redis的数据类型 共5种: string、hashset、list、set、zset string:字符串类型 hashset: 一个string类型的field和value的映射表,注意一个key中可以包含多个field和value的映射。 list: 字符串列表,有序集合 set: 一个不可重复的无序集合 zset:一个不可重复的有序集合,每个元素拥有double类型的评分,通过该评分实现排序。
  2. Java8的新特性 接口中新增了default和static方法,这两种方法可以有方法体 Lambda表达式——声明匿名内部类的新形势,接口必须是函数式接口 函数式接口——接口只有一个抽象方法(default方法不算)则称为函数式接口。用@FunctionalInterface注解可以报错提醒。 Java8中对许多接口都添加了一些default默认方法 Java8新增了一组全新的时间日期API——LocalDate、LocalDateTime、LocalTime等等、格式器类DateTimeFormater。ps:Date类是很糟糕的设计,官方推荐用Calendar工具类。 Java8新增Stream流API——数据渠道,用来操作数据源生成的元素序列 它自己不会存储元素 它不会改变源数据 它的操作有延迟性,需要结果时才执行 Stream流的操作分为三部分: 创建stream -> 中间操作(map、filter、distinct、limit、skip、sorted) -> 终端操作(collect、reduce、各种match)
  3. 数据库索引失效场景 有or时必全有索引,否则索引不生效 复合索引未用左列字段,索引不生效。在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。 like以%开头时,索引不生效 需要类型转换时,索引不生效。比如datetime与date字段类型 where中有加减乘除计算、函数等,索引不生效 若mysql觉得全表扫描更快,索引不生效
  4. 什么情况下没必要建立索引 唯一性差。比如性别,这意味着索引的二叉树级别少,二叉树查找无异于全表扫描。 更新频繁的字段。比如登录次数count。 where中不用的字段。 索引字段使用<> 、!= 时,效果很一般。
  5. Java中的锁 乐观锁VS悲观锁 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。synchronized关键字和Lock的实现类都是悲观锁 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。通过CAS自旋实现无锁编程。 观锁中的公平锁VS非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。 非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待,相当于人们一起哄抢而不是排队。 悲观锁中的可重入锁VS非可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。 悲观锁中的独享锁VS共享锁 独享锁只能被一个线程所持有,允许读写操作。 共享锁可被多个线程所持有,只能读数据,不能修改数据。
  6. spring启动流程 web容器(tomcat)启动时触发容器初始化事件(contextLoaderListener->contextInitialized),在该方法中,spring初始化上下文容器,执行spring容器启动流程。 spring容器启动流程中经过资源定位、内容加载、信息注册,然后实例化Bean,其中不乏就是spring bean的生命周期了。ps: @ComponentScan > @Import > @Bean 等监听到初始化完毕后,开始初始化servlet(DispatcherServlet),这个上下文会建立自己的Ioc上下文,用来持有spring的bean,它主要负责处理映射、视图解析等。
经验分享 程序员 微信小程序 职场和发展