登陆

章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了

admin 2020-02-14 242人围观 ,发现0个评论

一 往常常常运用外键和外键和级联吗,能够说说你对它们的了解吗?

关于外键和级联,阿里巴巴开发手册这样说到:

【强制】不得运用外键与级联,全部外键概念有必要在运用层处理。

阐明:以学生和成果的联络为例,学生表中的 student_id 是主键,那么成果表中的 student_id 则为外键。假设更新学生表中的 student_id,一起触发成果表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不合适分布式、高并发集群;级联更新是强堵塞,存在数据库更新风暴的风 险;外键影响数据库的刺进速度

为什么不要用外键呢?大部分人可能会这样答复:

  • 添加了凌乱性: a.每次做DELETE 或许UPDATE都有必要章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了考虑外键束缚,会导致开发的时分很苦楚,测试数据极为不便利;b.外键的主从联络是定的,假设那天需求有改变,数据库中的这个字段底子不需求和其他表有相关的话就会添加许多费事。
  • 添加了额定作业: 数据库需求添加保护外键的作业,比方当咱们做一些触及外键字段的增,删,更新操作之后,需求触发相关操作去查看,确保数据的的一致性和正确性,这样会不得不耗费资源;(个人觉得这个不是不用外键的原因,由于即便你不运用外键,你在运用层面也仍是要确保的。所以,我觉得这个影响能够忽略不计。)
  • 外键还会由于需求恳求对其他表内部加锁而简单呈现死锁状况;
  • 对分不分表不友好 :由于分库分表下外键是无法收效的。
  • ......

我个人觉得上面这种答复不是特别的全面,仅仅说了外键存在的一个常见的问题。实际上,咱们知道外键也是有许多优点的,比方:

  1. 确保了数据库数据的一致性和完整性;
  2. 级联操作便利,减轻了程序代码量;
  3. ......

所以说,不要一股脑的就扔掉了外键这个概念,已然它存在就有它存在的道理,假设体系不触及分不分表,并发量不是很高的状况仍是能够考虑运用外键的。

我个人是不太喜爱外键束缚,比较喜爱在运用层去进行相关操作。

二 解释一下什么是池化规划思维。什么是数据库衔接池?为什么需求数据库衔接池?

池话规划应该不是一个新名词。咱们常见的如java线程池、jdbc衔接池、redis衔接池等便是这类规划的代表完成。这种规划会初始预设资源,处理的问题便是抵消每次获取资源的耗费,如创立线程的开支,获取长途衔接的开支等。就好比你去食堂打饭,打饭的大妈会先把饭盛好几份放那里,你来了就直接拿着饭盒加菜即可,不用再暂时又盛饭又打菜,功率就高了。除了初始化资源,池化规划还包含如下这些特征:池子的初始值、池子的活泼值、池子的最大值等,这些特征能够直接映射到java线程池和数据库衔接池的成员特点中。

数据库衔接实质便是一个 socket 的衔接。数据库服务端还要保护一些缓存和用户权限信息之类的 所以占用了一些内存。咱们能够把数据库衔接池是看做是保护的数据库衔接的缓存,以便将来需求对数据库的恳求时能够重用这些衔接。为每个用户翻开和保护数据库衔接,尤其章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了是对动态数据库驱动的网站运用程序的恳求,既贵重又浪费资源。在衔接池中,创立衔接后,将其放置在池中,并再次运用它,因而不用树立新的衔接。假设运用了一切衔接,则会树立一个新衔接并将其添加到池中。衔接池还减少了用户有必要等候树立与数据库的衔接的时刻。


三 分库分表之逍遥军神后,id 主键怎么处理?

由于要是分红多个表之后,每个表都是从 1 开端累加,这样是不对的,咱们需求一个大局仅有的 id 来支撑。

生成大局 id 有下面这几种办法:

  • UUID:不合适作为主键,由于太长了,而且无序章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了不可读,查询功率低。比较合适用于生成仅有的姓名的标明比方文件的姓名。
  • 数据库自增 id : 两台数章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了据库别离设置不同步长,生成不重复ID的战略来完成高可用。这种办法生成的 id 有序,可是需求独立布置数据库实例,本钱高,还会有功能瓶颈。
  • 运用 redis 生成 id : 功能比较好,灵敏便利,不依靠于数据库。可是,引入了新的组件形成体系愈加凌乱,可用性下降,编码愈加凌乱,添加了体系本钱。
  • Twitter的snowflake算法 :Github 地址:https://github.com/twitter-archive/snowflake。
  • 美团的Leaf分布式ID生成体系 :Leaf 是美团开源的分布式ID生成器,能确保大局仅有性、趋势递加、单调递加、信息安全,里边也说到了几种分布式计划的比照,但也需求依靠联络数据库、Zookeeper等中间件。感觉还不错。美团技能团队的一篇文章:https://tech.meituan.com/2017/04/21/mt-leaf.html 。
  • ......

四 用过 BigDecimal 吗?为啥要用它?

4.1 BigDecimal 的用途

《阿里巴巴Java开发手册》中说到:浮点数之间的等值判别,根本数据类型不能用==来比较,包装数据类型不能用 equals 来判别。详细原理和浮点数的编码办法有关,这儿就不多提了,咱们下面直接上实例:

float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999964
System.out.println(a == b);// false

具有根本数学知识的咱们很清楚的知道输出并不是咱们想要的成果(精度丢掉),咱们怎么处理这个问题呢?一种很常用的办章鱼彩票app-阿里巴巴,美团等大厂面试官最喜欢问的面试难点,太难了法是:运用运用 BigDecimal 来界说浮点数的值,再进行浮点数的运算操作。


BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);// 0.1
BigDecimal y = b.subtract(c);// 0.1
System.out.println(x.equals(y));// true

4.2 BigDecimal 的巨细比较

a.compareTo(b) : 回来 -1 表明小于,0 表明 等于, 1表明 大于。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.compareTo(b));// 1

4.3 BigDecimal 保存几位小数

经过 setScale办法设置保存几位小数以及保存规矩。保存规矩有挺多种,不需求记,IDEA会提示。

BigDecimal m = new BigDecimal("1.255433");
BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN);
System.out.println(n);// 1.255

4.4 BigDecimal 的运用留意事项

留意:咱们在运用BigDecimal时,为了避免精度丢掉,引荐运用它的 BigDecimal(String) 结构办法来创立目标。《阿里巴巴Java开发手册》对这部分内容也有说到如下图所示。



《阿里巴巴Java开发手册》对这部分BigDecimal的描绘


4.5 总结

BigDecimal 首要用来操作(大)浮点数,BigInteger 首要用来操作大整数(超越 long 类型)。

BigDecimal 的完成运用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念

五 Java 中 IO 流分为几种?

  • 依照流的流向分,能够分为输入流和输出流;
  • 依照操作单元区分,能够区分为字节省和字符流;
  • 依照流的人物区分为节点流和处理流。

Java Io流共触及40多个类,这些类看上去很凌乱,但实际上很有规矩,而且彼此之间存在十分严密的联络, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。

  • InputStream/Reader: 一切的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 一切输出流的基类,前者是字节输出流,后者是字符输出流。

按操作办法分类结构图:


IO-操作办法分类


按操作目标分类结构图:


IO-操作目标分类


六 已然有了字节省,为什么还要有字符流?

问题实质想问:不管是文件读写仍是网络发送接纳,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节省操作和字符流操作呢?

答复:字符流是由 Java 虚拟机将字节转化得到的,问题就出在这个进程还算是十分耗时,而且,假设咱们不知道编码类型就很简单呈现乱码问题。所以, I/O 流就爽性供给了一个直接操作字符的接口,便利咱们平常对字符进行流操作。假设音频文件、图片等媒体文件用字节省比较好,假设触及到字符的话运用字符流比较好。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP