title: 2021.4.7 美团买菜后端开发实习生(二面)
tags: 面经
2021.4.7 美团买菜后端开发实习生(二面)
自我介绍
Java学习时长
final关键字的作用(见下文)
注解有什么作用?怎么来实现一个注解?(见下文)(当时回答不会)
Java中的内部类和静态内部类的区别?(见下文)
MySQL的存储文本有哪些呢?(当时回答不会)(见下文)
MySQL的存储时间?(见下文)(当时回答不会)
手撕算法题---求解立方根(见下文)
你为什么想学习Java呢?
你能介绍一下hadoop吗?
你了解python如何去处理二进制数据的方法呢?(当时回答不会)
反问环节。
1.1 final 关键字的作用
① final 修饰变量:如果是基本数据类型的变量,则其数值⼀旦在初始化之后便不能更改;如果是引⽤类型的变量,则在对其初始化之后便不能再让其指向另⼀个对象。
② final 修饰类:表明这个类不能被继承。
③ final 修饰方法:将方法锁定,以防任何继承类修改它的含义。
1.2 注解的作用以及如何来实现一个注解?
参考博客:JAVA 注解的几大作用及使用方法详解
(1)注解的作用:
1.生成文档。这是最常见的,也是java 最早提供的注解。**常用的有@see @param @return 等;
2.跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
3.在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
(2)如何实现一个注解:
注解这一块只能跟着java中的反射机制一起去看!(更多的参考上面的博客)
1. 要用好注解,必须熟悉java 的反射机制,从上面的例子可以看出,注解的解析完全依赖于反射。
2. 不要滥用注解。平常我们编程过程很少接触和使用注解,只有做设计,且不想让设计有过多的配置时。
1.3 MySQL的存储文本有哪些呢?
有三种类型:char、varchar、text、BLOB
① CHAR(M): 为固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。M 表示列的长度,范围是 0~255 个字符。
例如,CHAR(4) 定义了一个固定长度的字符串列,包含的字符个数最大为 4。当检索到 CHAR 值时,尾部的空格将被删除。
② VARCHAR(M):是长度可变的字符串,M 表示最大列的长度,M 的范围是 0~65535。VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。
例如,VARCHAR(50) 定义了一个最大长度为 50 的字符串,如果插入的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和一个字符串结束字符。VARCHAR 在值保存和检索时尾部的空格仍保留。
③ TEXT:TEXT 列保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。
TEXT 类型分为 4 种:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。
TINYTEXT 表示长度为 255(28-1)字符的 TEXT 列。
TEXT 表示长度为 65535(216-1)字符的 TEXT 列。
MEDIUMTEXT 表示长度为 16777215(224-1)字符的 TEXT 列。
LONGTEXT 表示长度为 4294967295 或 4GB(232-1)字符的 TEXT 列。
④ BLOB:blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。
1.4 MySQL的存储时间?
DateTime:没有时区信息,一旦时区更换,时间就会发生错误。DateTime耗费空间更大,耗费8个字节。
Timestamp:和时区有关。会随服务器时区的变化而变化。TimeStamp耗费4个字节,但是表示时间范围更小。
在《高性能MySQL》一文中推荐使用Timestamp。
1.5 手撕算法题—求解立方根
这种类型的题目的解法可以参考我的博客:题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)
import java.util.Scanner;
public class MeiTuan {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
double num = sc.nextDouble();
System.out.println(String.format("%.8f", Solution1(num)));
System.out.println(String.format("%.8f", Solution(num)));
}
}
//根据二分法进行解题
public static double Solution1(double num){
double min = 0;
double max = num;
double mid = 0;
while((max - min) > 0.000001){
mid = min + (max - min) / 2;
if(mid * mid * mid > num){
max = mid;
}else if(mid * mid * mid < num){
min = mid;
}else{
return mid;
}
}
return mid;
}
//根据牛顿迭代法进行解题
public static double Solution(double num){
double x = 1;
double x1 = x - (x * x * x - num) / (3 * x * x);
while((x - x1) > 0.000001 || (x - x1) < -0.000001){
x = x1;
x1 = x - (x * x * x - num) / (3 * x * x);
}
return x1;
}
}
输出结果:
3
1.44224954
1.44224957
56
3.82586277
3.82586237
9
2.08008367
2.08008382
8
2.00000000
2.00000000