讲讲背景

坐标CD
从13年进入互联网公司,15年进入一线开发,一转眼已经5年时间,前后经历了三家公司,从一开始啥也不懂的菜鸟,到现在经历各种项目的沉淀,自认为已经对应用层面的开发滚瓜烂熟,大部分java应用层开发的框架、中间件,微信生态(小程序、公众号、企微、微信支付)下的各种开发也基本熟练运用在了很多不同的项目中,开发过日PV数百万的项目,也为政府开发过百万级用户量的政府项目,还尝试过写一些小而美的工具小程序。
18年下半年起,开始领导公司唯一的研发小组(8人),从需求分析,到项目架构设计,DB设计,模块拆分,团队成员的工作内容安排,项目开发进度把控,陆陆续续也主导了五六个项目的成功落地。
但是,看似还算顺利的职业生涯,总会面临一些突如其来的变故。
今年由于疫情等综合因素,所在公司战略方向调整,导致一线研发团队需要解散,只保留会部分技术的商务人员,因此一个已经快五年没有面试过的面试菜鸟,开发老油条,在这个应该是有史以来甚至未来很多年内,都可能是最难找工作的时间点,投入到了求职大军当中。


2020.04.01,第一次线下面试

一家研发团队应该在百人级别的算是中型规模的公司。
主要是做银行、支付方面的开发工作。
面试官年龄应该跟我差不多。
一开始聊了工作经历,以及项目经历,然后开始问一些技术基础知识。


问了什么?

java的异常分类

两大类,err、exception
err:实际上应该叫错误,硬件或操作系统的错误,是致命的错误,可能会导致程序无法运行。最常见的是内存溢出。
exception:异常,主要分为运行时异常与编译异常,运行时异常常见如null指针,下标越界等,编译异常常见IOException、SQLxception。

常见异常费率


数据类型、集合类型

  • 数据类型
    基本数据类型:byte、short、int、long、double、float、char、boolean
    包装类型
    上面所有首字母大写,是对基本数据类型不足之处的补充提供了一下转换、比较的方法,其中数值型包装类都继承至Number,而字符型和布尔型继承至Object。
    Java1.5 以后可以包装类型、基础类型之间可以自动装箱和拆箱

  • 集合类型

      Collection
      |--List
      |--Set
    

    Collection:顶层次单列集合的根接口,它是一个集合,也是一个接口
    另外说一下Collections(多了一个s),是针对集合操作的工具类,里面包含了一些功能,如随机置换,集合里面的二分查找,将集合的元素进行反转
    List
    有序,可重复,分为ArrayList、LinkedList、Vector:
    ArrayList:底层数据结构是 数组结构.是线程不同步的(不安全的).查询速度很快,但是增删较慢,始容量为 10 ,50%的长度加长集合容器的长度。
    LinkedList:底层数据结构是 链表结构。对元素的增删速度很快。但是查询速度很慢。线程是不同步的。
    Vector:底层数据结构也是数组结构,是线程同步的(安全的),已经被ArrayList取代,JAVA1.2版本以后的集合都是不同步的
    这里可以扩展ArrayList、LinkedList的对比知识。

    Set
    无序,不可重复
    下有HashSet、LinkedHashSe、TreeSet
    HashSet:底层数据结构是 数组结构.是线程不同步的(不安全的).查询速度很快,但是增删较慢,始容量为 10 ,50%的长度加长集合容器的长度。
    LinkedHashSet:底层数据结构由哈希表和链表组成。 哈希表保证元素的唯一性。 链表保证元素有素。(存储和取出是一致)
    TreeSet:能够对元素按照某种规则进行排序。 排序有两种方式 A:自然排序 B:比较器排序。
    Map
    key-val形式的数据集合
    下有HashMap、HashTable、LinkedHashMap、TreeMap
    HashMap:线程不安全,执行效率高,不同步,允许null值和null键,null键排第一个。
    HashTable:线程安全,执行效率低,同步,不允许null值和null键。
    LinkedHashMap:链表保证了元素的有序性(存储和取出一致)。
    TreeMap:提供了一种以排序顺序存储键/值对的有效方法。它是基于红黑树的NavigableMap实现。


讲讲接口的设计中注解的使用,@RequestBody@ResponseBody的使用

聊了下接口设计的一些基础规范,然后问我注解方面的使用,问了前端传递一个json字符串的时候怎么接受,当时有记住如果是json的话,需要使用一个注解去接收,但是居然忘记了是@requestBody现在感觉自己当时肯定傻B极了....
@RequestBody:用于将前台发送过来固定格式的数据(xml 、json等)封装为对应的 JavaBean 对象
@ResponseBody:将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的
body区,通常用来返回JSON数据或者是XML数据,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

   @RequestMapping("/login")
  @ResponseBody
  public User login(Account account){
    return account;
  }
  //account字段:name pwd
  //那么在前台接收到的数据为:'{"name":"xxx","pwd":"xxx"}'
 
  //效果等同于如下代码:
  @RequestMapping("/login")
  public void login(Account account, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(account).toString());
  }

数据库设计范式原则

1.第一范式
确保每列保持原子性
比如地址这个字段,如果应用业务有实际需要,可以考虑拆分成省、市、街道三个字段
2.第二范式
表里的每一行,都要具有唯一的属性(可以作为主键),表中的任何非主键字段都全部依赖于主键字段,即可以由主键字段来唯一的确定一条记录。
比如订单、商品,如果只有一个订单表,那么当一个订单有多个商品时,数据上连续几行就都是同样的订单号-对应不同的商品。因此拆出来一个订单项表,单独记录关联商品信息,这样订单表中,只有订单信息,商品信息在订单项中存储关联一个订单id即可。
3.第三范式
数据表的任何非主键字段之间都不产生函数依赖,即非主键字段之间没有依赖关系,全部只依赖于主键字段。例如将学员姓名和所属班级名称放在同一张表中是不科学的,因为学员依赖于班级,可将学员信息和班级信息单独存放,以满足3NF。


mysql数据库事务隔离级别

由低到高

  • 读取未提交:
    B事务读时,读取到A事务未提交的数据
  • 读取已提交:
    mysql默认的事务隔离级别,A事务未提交时,B事务读取全是未修改的数据,只有A提交修改事务之后,B读取的才是修改后的数据。
  • 可重复读:
    如果事务B在事务A提交之前做了查询操作,然后不管事务A做了什么操作并且提交后,事务B如果执行同样的查询语句,则不会读取到修改后的新数据,会一直重复读取刚开始事务B读取的数据;如果事务B在事务A提交之前不做任何查询操作,则不管事务A做了什么操作并且提交后,事务B查询到的才是修改后的新数据
  • 串行化:
    最高级别,只有当事务A的写操作执行完之后,事务B才能进行写操作,但是读操作是可以正常进行的,相当于给这条操作的数据加了锁

结果?

扑!街!


为什么?

毫!无!准!备!
这次面试非常失败,这段时间正在办理离职交接。
日常工作懈怠了基础知识的复习积累。
因此今天的面试准备非常仓促,基本上对于所有技术点的基础部分没有过相应的准备就去面了,因此扑街也只能怪自己。