> 文章列表 > 【面试】记一次中小公司某一次面试题

【面试】记一次中小公司某一次面试题

【面试】记一次中小公司某一次面试题

文章目录

  • 1. MySQL中explain执行计划你比较关注哪些字段
  • 2.char、varchar 和 text的区别
  • 3. int(3)和int(11)查询的区别?
  • 4. 字段里NULL和空值的区别?
  • 5. spring中怎么解决循环依赖问题?
    • 5.1 重新设计
    • 5.2 使用注解 @Lazy
    • 5.3 使用Setter/Field注入
    • 5.4 使用@PostConstruct
    • 5.5 实现ApplicationContextAware与InitializingBean
  • 6. jdk动态代理与CGlib代理的区别?
  • 7. 强引用,软引用,弱引用,虚引用的区别?
  • 8. 自定义注解的实现?
  • 9. redis场景题:从海量数据中查询某一固定的前缀的key?
  • 总结

1. MySQL中explain执行计划你比较关注哪些字段?

mysql> explain select * from staff;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | staff | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set

type(重要)
这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型依次为:

system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL

2.char、varchar 和 text的区别?

  • 在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。
  • 存储方式和检索方式
    存储方式和数据的检索方式也都不一样。
  • 按照查询速度:
    char最快, varchar次之,text最慢。
  • 储存长度:
    【面试】记一次中小公司某一次面试题

3. int(3)和int(11)查询的区别?

这里的3或11代表的是存储在数据库中的具体的长度,总以为int(3)只能存储3个长度的数字,int(11)只会存储11个长度的数字,其实,当我们在选择使用int类型时,不论是选择int(3)还是int(11),它在数据库里面存储的都是4个字节的长度。

4. 字段里NULL和空值的区别?

  • 从本质上区别:
    1、空值不占空间
    2、null值占空间

  • 通俗的讲:
    空值就像是一个真空转态杯子,什么都没有,而null值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

5. spring中怎么解决循环依赖问题?

5.1 重新设计

重新设计结构,消除循环依赖。

5.2 使用注解 @Lazy

一种最简单的消除循环依赖的方式是通过延迟加载。在注入依赖时,先注入代理对象,当首次使用时再创建对象完成注入。

@Component
public class CircularDependencyA {private CircularDependencyB circB;@Autowiredpublic CircularDependencyA(@Lazy CircularDependencyB circB) {this.circB = circB;}
}

使用@Lazy后,运行代码,可以看到异常消除。

5.3 使用Setter/Field注入

Spring文档建议的一种方式是使用setter注入。当依赖最终被使用时才进行注入。对前文的样例代码少做修改,来观察测试效果。

@Component
public class CircularDependencyA {private CircularDependencyB circB;@Autowiredpublic void setCircB(CircularDependencyB circB) {this.circB = circB;}public CircularDependencyB getCircB() {return circB;}
}
@Component
public class CircularDependencyB {private CircularDependencyA circA;private String message = "Hi!";@Autowiredpublic void setCircA(CircularDependencyA circA) {this.circA = circA;}public String getMessage() {return message;}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestConfig.class })
public class CircularDependencyTest {@AutowiredApplicationContext context;@Beanpublic CircularDependencyA getCircularDependencyA() {return new CircularDependencyA();}@Beanpublic CircularDependencyB getCircularDependencyB() {return new CircularDependencyB();}@Testpublic void givenCircularDependency_whenSetterInjection_thenItWorks() {CircularDependencyA circA = context.getBean(CircularDependencyA.class);Assert.assertEquals("Hi!", circA.getCircB().getMessage());}
}

5.4 使用@PostConstruct

@Component
public class CircularDependencyA {@Autowiredprivate CircularDependencyB circB;@PostConstructpublic void init() {circB.setCircA(this);}public CircularDependencyB getCircB() {return circB;}
}
@Component
public class CircularDependencyB {private CircularDependencyA circA;private String message = "Hi!";public void setCircA(CircularDependencyA circA) {this.circA = circA;}public String getMessage() {return message;}

5.5 实现ApplicationContextAware与InitializingBean

@Component
public class CircularDependencyA implements ApplicationContextAware, InitializingBean {private CircularDependencyB circB;private ApplicationContext context;public CircularDependencyB getCircB() {return circB;}@Overridepublic void afterPropertiesSet() throws Exception {circB = context.getBean(CircularDependencyB.class);}@Overridepublic void setApplicationContext(final ApplicationContext ctx) throws BeansException {context = ctx;}
}
@Component
public class CircularDependencyB {private CircularDependencyA circA;private String message = "Hi!";@Autowiredpublic void setCircA(CircularDependencyA circA) {this.circA = circA;}public String getMessage() {return message;}
}

6. jdk动态代理与CGlib代理的区别?

  • jdk动态代理 利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用。InvokeHandler来处理。
  • 利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理。

7. 强引用,软引用,弱引用,虚引用的区别?

【面试】记一次中小公司某一次面试题

8. 自定义注解的实现?

java中有四种元注解:@Retention、@Inherited、@Documented、@Target

9. redis场景题:从海量数据中查询某一固定的前缀的key?

Redis 中如果要在海量的数据数据中,查询某个数据应该使用 Scan,Scan 具有以下特征:

  • Scan 可以实现 keys 的匹配功能;
  • Scan 是通过游标进行查询的不会导致 Redis 假死;
  • Scan 提供了 count 参数,可以规定遍历的数量;
  • Scan 会把游标返回给客户端,用户客户端继续遍历查询;
  • Scan 返回的结果可能会有重复数据,需要客户端去重;
  • 单次返回空值且游标不为 0,说明遍历还没结束;
  • Scan 可以保证在开始检索之前,被删除的元素一定不会被查询出来;
  • 在迭代过程中如果有元素被修改, Scan 不保证能查询出相关的元素。

总结

希望对你有帮助,欢迎评论区讨论。

环球雅思