2019-09-07 广大招聘会有感

2019-09-07 广大招聘会有感

感受

​ 先说说这一天的感受吧。一开始就像一只无头苍蝇一样在招聘会里面撞来撞去,看到多人的又不想等下去,到处乱逛。所以以后去招聘会的话,一定要先看好相关信息。找好目标的公司(避免像无头苍蝇一样,到处乱撞),早点去(避免人挤人)。这是最大的感受吧,毕竟感觉因为乱撞,浪费了不少时间。

​ 另外是自己太水了,也没好好准备。感觉这次招聘会凉凉。希望自己多多加油吧。估计秋招与我无缘了,还是老老实实找一份实习做一下,提高自己的水平吧。排队时看到前面的人的简历,再看看自己的简历,我就是一直小菜鸡。

给问到的问题

​ 说完了总结。现在说说给问到的问题吧。(凭着一些记忆写出来,附上一些答案【网上找来的,加上自己的一些理解】)

1.有上过Spring的官网吗,通过官网我们能了解到什么。

​ 官网嘛,肯定上过的啦。只不过比较少罢了。因为我遇到问题一般是先百度,根据百度查,不过到了后面发现官网才是最好的。

​ 在官网,我们能找到官方文档【官网文档是最好的入门书,只要你英语够好,看得下去】,也能找到一些demo,了解一些技术相关的用法。

​ 在最后,面试官说在官网上能找到它的博客、它以后发展的方向什么的。这些是我没说出来的。

​ 以后,最好还是多看看官网吧。

2.hibernate 与 mybatis 的区别

​ 在这个问题上。我只回答了他们的移植性不同。hibernate方便移植,因为用HQL语句的话不需要考虑用的是哪一个数据库,不用自己手写sql语句,而mybatis的移植性较差,因为每个数据库都有自己不同的方言,比如MySQL和oracle的分页操作不同。(回答道这里,我就给自己挖坑了,后面再说)。另外,由于mybatis的sql语句是自己手写的,所以我们可以很方便的对sql语句进行优化,虽然hibernate也可以使用sql语句,但是这样就丢失了良好的移植性。

====================================================================

​ 百度了之后发现,还可以加上缓存机制以及开发难度及日志方面来说。【以下答案来自https://blog.csdn.net/qq_41378597/article/details/88070335】

​ 1.两者最大的区别:

​ 针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。

​ 针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。

​ 2.开发难度对比

​ Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。

​ 而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。

​ 3.日志方面

​ mybatis没有自己的日志统计,需要借助log4j来记录日志,而hibernate具有自己的日志统计。

​ 4.缓存机制比较

​ 相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

​ 不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

​ MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

​ 两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

​ 而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

​ 看完这些之后,我觉得应该也可以加上一对多,多对多等方面的映射配置进行说明。

3.前面说到移植性的。后面就给问了如果用mybatis时,需要切换数据库应该怎么办。【在这里,我不断给自己挖坑】

​ 因为我之前看的一个视频,里面有用到mysql和oracle的。所以我就说了配置两个数据源,然后针对不同的数据库写不同的sql语句。【https://www.nowcoder.com/questionTerminal/a483360a35894810bb0cbd93fc173257?source=relative】 方法大概此网站所示。
在这里插入图片描述

​ 然后,面试官就说还有其他方法吗。我就想到了尽量写通用的sql语句。(够暴力吧,哈哈哈哈)。毕竟大部分查询语句都是一样的。就分页可能有点差别,然后就问了我分页了。 我就说用插件pagehelper(不断给自己挖坑),问我有没有了解过pagehelper里的原理,他是如何实现根据不同的数据库来实现分页的,我。。。瞬间懵逼了,怪给自己挖坑。我这个菜鸡也不懂,看了一些文章还是懵懵的。

​ 留坑,待补。【https://blog.csdn.net/lvdou1120101985/article/details/81184871 这个网站似乎不错。】

【https://www.jianshu.com/p/687de634c8f0】 还有这个。

4.SpringBoot相关内容
4.1 SpringBoot的容器

​ 一开始我是懵逼的,回答了ApplicationContext。然后后面面试官说SpringBoot能启动web项目,肯定是有一些容器的吧。后面我就回答了tomcat。回来之后百度之后发现,原来还有其他容器的:Spring Boot内嵌容器支持Tomcat、Jetty、Undertow。【来源于https://www.jianshu.com/p/10ba7a7406ad】。

​ 还有一个网站看起来挺好的。spring容器和上下文的理解

4.2 平时打包成什么格式

​ 我就说打包成jar包。没问详细。如果详细问下去,我觉得可以问如何部署。

5.redis的数据结构

Redis有5个基本数据结构,string、list、hash、set和zset

Redis数据类型StringListHashSetZSet
底层数据结构数组双向链表二维结构第一维度:数组第二维度:链表HashHash+跳跃表

没问深入,就问了这个问题。另贴2个网站。

6.数据库相关
6.1MySql的引擎。他们之间的区别。

​ 我只回答了MyIsam和InnoDb,他们的区别我没说到索引不同。(ps:我觉得这个问题最好还是结合MySql的版本回答)

​ MyISAM不支持事务,只支持表级锁,不支持外键,物理结构(3个文件),非聚簇索引。

​ InooDB:支持事务和行级锁,支持外键,物理结构(2个文件),聚簇索引

​ 如果系统读多写少,对原子性要求低,那么MyISAM最好的选择。且MyISAM恢复速度快,可直接用备份覆盖恢复。如果系统读少写多的时候,尤其是并发写入高的时候,InnoDB就是首选了。

​ 下面的图片是MySql的所有引擎。

在这里插入图片描述

6.2MySql的锁

​ 我只回答了表级锁、行级锁。(这方面需要好好复习,一开始我还打算说悲观锁、乐观锁的。可是想了想,这好像不是MySql的,就没加上去了)

​ 附上文章。浅谈MySQL的七种锁

6.3事务相关。MySql的默认事务级别

在这里插入图片描述

(1)【读未提交 Read uncommitted】这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。

(2)【读已提交 Read commited】保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。

(3)【重复读 Repeatable read】读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。是MySql的默认级别

(4)【序列化 serializable】花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。在每个读的数据行上加锁,使之不可能相互冲突,会导致大量的超时现象

6.4解释一下ACID

​ A(原子性):当数据发生修改时, 要么全部执行,要么全部不执行

​ C(一致性):一个事务在执行前后,数据库的数据必须保持一致状态。比如在转账中:转账前后两个账户的金额之和需要保持不变

​ I(隔离性):多个事务分开执行,互不干扰

​ D(持久性):事务完成后,对数据的修改是永久的,当系统或存储介质发生变化时,数据不能发生变化。

7.junit 断言**

​ 了解断言吗。能说说怎么用吗。

​ 我这里只回答了assert。没有具体展开其他。毕竟用得太少了。

====================================================

assertEquals断言:

它的作用是比较实际的值和用户预期的值是否一样

assertTrue与assertFalse断言:

assertTrue与assertFalse可以判断某个条件是真还是假,如果和预期的值相同则测试成功,否则将失败

assertNull与assertNotNull断言:

assertNull与assertNotNull可以验证所测试的对象是否为空或不为空,如果和预期的相同则测试成功,否则测试失败

assertSame与assertNotSame断言

assertSame和assertEquals不同,assertSame测试预期的值和实际的值是否为同一个参数(即判断是否为相同的引用)。assertNotSame则测试预期的值和实际的值是不为同一个参数。而assertEquals则判断两个值是否相等,通过对象的equals方法比较,可以相同引用的对象,也可以不同。

fail断言:

“fail”断言能使测试立即失败,这种断言通常用于标记某个不应该被到达的分支。例如assertTrue断言中,condition为false时就是正常情况下不应该出现的,所以测试将立即失败
————————————————
版权声明:本文为CSDN博主「QQ玉」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qinyf2015/article/details/78111376

=============================================================

8.简历上的项目的一些问题

​ 这里就不展开了。

=============================================================

还有一些问的其他问题。另一家公司的。也有一些题目是同学提供的。【待补坑,毕竟和JVM相关,我这方面复习的比较浅。】

1.system.gc发生什么

​ 并不会发生什么。执行玩这句话后,也不一定会马上执行垃圾回收,仅仅只是建议进行垃圾回收罢了。

2.jvm内存结构

JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;答案来自于----公众号上的有赞一面

3.垃圾收集算法【内容来源于深入理解JVM虚拟机】

标记清除算法

先标记可以回收的对象。然后统一回收这些被标记过的对象。

不足

  • 效率问题。标记和清除2个效率都不高
  • 空间问题。会产生大量的连续碎片。

复制算法

将内存按容量划分为大小相等的2块。每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后再把使用过的内存空间一次清理掉。

在这里插入图片描述

不足

  • 将内存缩小了原来的一半。

标记整理算法

与标记清除算法那差不多。只是在清理之前抢所有存活的对象都向一段移动。示意图如下:

在这里插入图片描述

分代收集算法

根据对象存活周期将内存划分为几块。一般是把java堆分成新生代和老年代。新生代中,每次垃圾收集都会死一大堆对象,因此采用复制算法。老年代的对象存活率高,就采用“标记----清理 ”或者“标记—整理”算法

4.java映射机制

我同学问面试官,是反射机制吗,结果面试官摇头说不是。我同学也有点懵逼,结束后问我,我也是第一次听说映射。后面,他查了一些资料后,给了我一篇文章 java映射机制。这篇文章也算历史悠久了。。

5.使用jvm调优过吗
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值