从0到1重新认识Java之实战篇(二)

53 阅读4分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

前言

职场人的面试总是特别艰难,其实也不是推崇跳槽,只是对于我自己个人而言,我是一个比较懒的人,要逼迫自己学习就需要靠外力,恰巧我又是羡慕别人高工资的人,所以就顺水推舟去复习面试,偶尔投一两家去面试,看看当前社会的主流技术,保持自己的核心竞争力。

因人历练(围绕简历)

为什么选择Netty 又选择MQTT

答:新的业务系统使用的是Netty框架,而且Netty是框架;MQTT是通信协议;两者并没有比较的意义;
因为新项目是基于GPS的自研定位系统作为集成功能,用的是JT808的部标协议;在不造轮子的情况下,用了网上的开源框架作为使用,所以顺带上Netty,并不是说用Netty去取代MQTT

mybatisPlus的resultMap

  • type: resultMap最终映射的java对象,可以使用别名【如果使用resultMap实际返回的对象类型】
  • id: resultMap的唯一标识【随便起】
  • result: 对普通名映射定义
  • property: type指定的返回的pojo对象中的属性名 写category里的属性名
  • column: 数据库中要查询出的字段【列名】 写要映射的数据库表里的字段名
  • property对应column形成数据库中字段和pojo属性对应关系 日常业务中使用collection,作为子查询,作为一个树状结构输出,但是因为在MYSQL中这样频繁操作对性能并不好,所以一般选择直接查询,然后再业务层用反射机制作为工具类去生成树状结构

Elasticsearch 的使用

Elasticsearch 是离散型的数据库,用的是倒排索引,不同于其他关系型数据库,是先通过Key值 → Value值;Elasticsearch是通过 value → key → Value;

对项目的优化

在一个获取第三方天气API的接口中,需要通过前端传的经纬度,发起两次网络请求,获取城市的详细信息+城市的实时天气;所以运用了多线程的join方法,去生成两个子线程,同步发起网络请求,并让主线程调用join方法,等待两个子线程返回结果

对于这个优化有什么更好的看法吗

有的,除了这个join方法外,还有两种可以让使线程达到同样的方法,CountDownLatch()方法也可以实现,不过这个方法是作为计数器去阻塞,在业务上不需要让主线程等待子线程完全执行就可以提前执行主线程;还有一种是直接用synchronize代码块 + wait/notifAll方法,不过基于业务的需求,所以选择了join方法

额外历练

为什么String的都用了final修饰

那么为什么保证String不可变呢,因为只有当字符串是不可变的,字符串池才有可能实现。而且起作用的不只是final,还有private;因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

是否有使用过Java8的流,为什么foreach比普通for循环性能好

有,foreach/toMap常用;其实在10万以内,普通的for循环会快,但是后面是foreach快,虽然同样是增强型for循环,但是Java8的循环多了初始化数据,所以会慢100ms;但是数据多的时候,会弥补

关于集合

一个都没答出来

数据库事务

ACID

  • 原子性
  • 一致性
  • 持久性
  • 隔离性 另外三个特性都是为了以一致性为目的的手段

Mysql隔离

  • 已读未提交
  • 已读提交
  • 可重复读(默认)
  • 串行

Redis集群

  • 主从模式

    一个主机Reis+若干个从机Redis,主机Redis负责写,从机Redis负责读;主机Redis宕机的话,并不会选一个从机作为主机,而是丧失了写的功能,但不影响读

  • 哨兵

    在主从的基础上,主机宕机后,会选拔一个从机作为主机,当主机醒过来后,并不会重新成为主机,而是成为从机

  • 主从+哨兵