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

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;
 
 @Autowired
 public CircularDependencyA(@Lazy CircularDependencyB circB) {
    
    
  this.circB = circB;
 }
}

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

5.3 使用Setter/Field注入

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

@Component
public class CircularDependencyA {
    
    
 
 private CircularDependencyB circB;
 
 @Autowired
 public void setCircB(CircularDependencyB circB) {
    
    
  this.circB = circB;
 }
 
 public CircularDependencyB getCircB() {
    
    
  return circB;
 }
}
@Component
public class CircularDependencyB {
    
    
 
 private CircularDependencyA circA;
 
 private String message = "Hi!";
 
 @Autowired
 public void setCircA(CircularDependencyA circA) {
    
    
  this.circA = circA;
 }
 
 public String getMessage() {
    
    
  return message;
 }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
    
     TestConfig.class })
public class CircularDependencyTest {
    
    
 
 @Autowired
 ApplicationContext context;
 
 @Bean
 public CircularDependencyA getCircularDependencyA() {
    
    
  return new CircularDependencyA();
 }
 
 @Bean
 public CircularDependencyB getCircularDependencyB() {
    
    
  return new CircularDependencyB();
 }
 
 @Test
 public void givenCircularDependency_whenSetterInjection_thenItWorks() {
    
    
  CircularDependencyA circA = context.getBean(CircularDependencyA.class);

  Assert.assertEquals("Hi!", circA.getCircB().getMessage());
 }
}

5.4 使用@PostConstruct

@Component
public class CircularDependencyA {
    
    
 
 @Autowired
 private CircularDependencyB circB;
 
 @PostConstruct
 public 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;
 }
 
 @Override
 public void afterPropertiesSet() throws Exception {
    
    
  circB = context.getBean(CircularDependencyB.class);
 }
 
 @Override
 public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
    
    
  context = ctx;
 }
}
@Component
public class CircularDependencyB {
    
    
 
 private CircularDependencyA circA;
 
 private String message = "Hi!";
 
 @Autowired
 public 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 不保证能查询出相关的元素。

总结

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

猜你喜欢

转载自blog.csdn.net/u011397981/article/details/130034374