找工作还是看运气,楼主这三天总共面试了8家,得到一份不太满意的offer,总的来说,面试还是失败的。
这几天找工作经历,我的总结就是,把平时用到的东西,研究透彻,知其然还要知其所以然,不要简单的复制,觉得功能实现了就好了。如果一直这样的,技术水平根本一点都没有提升,面试绝对会给你一榔头,楼主现在完全清醒。
最重要的一点:简历上的东西,必须是你非常熟悉的东西,面试官会根据你给他提供的信息来提问。自己不懂的东西,不要体现在简历上!!!
面试官感觉很年轻,但是绝对是非常牛逼的人,虽然挂了楼主,但是楼主依然觉得人家牛逼。
面试官直接默写了一道小的不能再小的算法题:在一个字符串中,找到第一个不重复的字符。
非常简单了吧?楼主写了比较水的办实现程序,哎,楼主的算法真的是非常水,在这里,楼主想给自己定个目标,JAVA的基础算法,必须要用的通透,比如:排序算法,查找算法等。
a.自动配置:比如以前需要配置web.xml,jdbcTemplate,事务管理这些东西,复杂且模板化,还提高了开发成本,springboot自动将这些东西配置好了。
b.起步依赖:想要实现什么功能,只需要配置起步依赖就可以,而且起步依赖稳定。SpringBoot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型,定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
c.Actuator:提供运行时监视应用程序内部情况的能力。
d.内嵌容器:可以通过配置插件,为springboot提供不同类型的容器,如Tomcat
e.YML配置文件:传统项目中使用properties文件作为key-value的载体,缺点非常明显,会重复进行链式配置,而YML文件则避免了这个问题。
a.spring-boot-starter-aop:项目AOP引用的依赖
b.spring-boot-starter-web:web项目必须要引入的依赖
c.spring-boot-starter-test:测试依赖
d.spring-boot-starter-parent:parent是springboot最最核心的引入,所有的配置都在里面,并且是springboot项目必须引入的。
等。。。
SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象的生命周期,为简化日常开发,提供了很大便利。
SpringMVC提供了总开关DispatcherServlet;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理;动作处理器Controller接口(包含ModelAndView,以及处理请求响应对象request和response),配置灵活,支持文件上传,数据简单转化等强大功能。
a.用户发送请求至前端控制器DispatcherServlet。
b.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
c.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
d.DispatcherServlet调用HandlerAdapter处理器适配器。
e.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
f.Controller执行完成返回ModelAndView。
g. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
h.DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
i.ViewReslover解析后返回具体View。
j.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
k.DispatcherServlet响应用户。
日常业务中存在大量的try/catch来捕获异常,导致整个控制层代码可读性很差,如果通过使用AOP统一处理异常,统一返回后端的接口结果,使用一个自定义异常和一个错误前端提示枚举来逐层传递消息,一个错误枚举来代替新建异常信息类,减少业务异常信息文件的数量。
a.首先引入AOP包。
b.报文的实体类,主要存储错误报文
c.创建一个枚举类,来记录一些我们已知的错误信息,可以在代码中直接使用。
d.定义一个工具类。
(1)在注解方式中
a.通过HttpServletResponse的API直接输出(不需要配置渲染器)
b.使用HttpServletResponse 重定向到另一个视图(其他不变)
c.使用HttpServletRequest 转发(默认访问/下的index.jsp页面 不受渲染器的影响)
d.直接返回jsp页面的名称(无渲染器)
(2)使用view
a.使用modelandview
b.使用modelview
@Controller
@RequestMapping
事务的7种传播属性:
a.PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
b.PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
c.PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
d.PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
e.PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
f.PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
g.PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与h.PROPAGATION_REQUIRED类似的操作。
AOP主要应用于日志记录,性能统计,安全控制,事务处理,异常处理等。
Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
在配置文件中要配置如下:
a.配置切入点类
b.配置通知类
c.配置动态代理工厂类
最后在类中使用@Transactional(propagation=Propagation.REQUIRED)注解
a.什么是驱动表?
从哪个表开始检索,哪个表就是驱动表
b.如何确定驱动表?
驱动表一定是小表,指的是根据条件获得的子集合一定要小,而不是说实体表本身一定要小,大表如果获得的子集合小,一样可以简称这个大表为驱动表。
在insert节点的userGeneratedKeys = true 设置向生成主键,然后keyProperty=”id” 把生成的主键指向属性
(1)cookie:
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
(2)session:
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
(3)cookie和session结合使用:
web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
a.存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
b.将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。
这家公司主要是做大数据处理的,面试官年龄不大,但是技术水平非常牛逼,在面试中,遇到不清楚的东西,也会引导你思考,至少在照顾面试者情绪方面,做的非常好,要不然我也不会在这里说好话,即使面试失败了,面试官也会给很多建议,受益匪浅。
有5种:
a.DEFAULT:使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
b.READ_UNCOMMITTED:这是事务最低的隔离级别,充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
c.READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
d.REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
e.SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
百度吧
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
详细百度
find,grep,normal模式下/查找,
这家公司怎么说呢,跟面试官也没有太多交流,就是面试官问,然后我答,面试官也不深入的继续问,楼主本人也不知道答得对不对,反正面试官一顿问之后,面试官告知等待通知,然后安排一个小HR带面试官离开,然后就没有然后了......,怎么说呢,就是说不上来是什么感觉。问的其实很基础
a.什么情况下使用枚举类?
一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便.
进门要先做几页全英文的面试题,然后机试答题。楼主英文差,就拍了面试题,然后主动撤了。
进门做三道算法题,楼主算法非常弱,主动撤退。
一道排序题,一道查找题,还有一道楼主记不清了。
这家公司是外包公司,一面是他们公司自己人来面,二面是泰康本部的人面,三面就是谈薪资了,楼主水平比较差,但马马虎虎的也算过了一二面,三面的时候,等了半天,那个姓张的经理才过来,谈了一堆东西,最后给了10k。外包公司,也给不了多少。
a.加载和实例化
b.初始化
c.请求处理
d.服务终止
2.ORACLE数据库查询前5条数据
a. 最佳选择:利用分析函数
row_number() over ( partition by col1 order by col2 )
b.使用rownum 虚列
通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)
缓存击穿表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。
解决方案:
a.使用互斥锁排队
b.接口限流与熔断、降级
c.布隆过滤器
分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。
a.也是像解决缓存穿透一样加锁排队,实现同上;
b.建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存;
c.设置缓存超时时间的时候加上一个随机的时间长度,比如这个缓存key的超时时间是固定的5分钟加上随机的2分钟,酱紫可从一定程度上避免雪崩问题;
百融金服的办公环境还是非常好的,面试官比较年轻,也比较好说话,最后认定楼主为初级,但是他们公司不缺初级,所以楼主最后被PASS。
(1)springboot实现事务只需要在头上加上@Transactional注解
-@Transactional 默认只捕获RuntimeException.class
-对Exception异常得需要 @Transactional(rollbackFor = {Exception.class}) 捕获回滚。
(2)使用@Configuration注解一个类,定义事务控制类
在容器初始化时会建立所有url和controller的对应关系,保存到Map
这样就可以根据request快速定位到controller,因为最终处理request的是controller中的方法,Map中只保留了url和controller中的对应关系,所以要根据request的url进一步确认controller中的method,这一步工作的原理就是拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法;
是单例的,为了保证线程安全,当springmvc初始化时,会实例化bean的类,并向全局提供该类,如果是多例的,线程就会不安全。
集合分为Map和Collection两大类,Map下面的分类有三个HashTable,HashMap,SortedMap,Collection下面分类为List和set两大类,List下面分为ArrayList,LinkedList,Vector,set下面分为HashSet和SortedSet;
List下面的三个子集合的区别
|–Vector 底层数据结构是数组、查询快、增删慢、线程安全、效率低、默认长度是10、超过就会100%延长、变成20、浪费空间
|–ArrayList 底层数据结构是数组、查询快、增删慢、线程不安全、效率高、默认长度是10、超过就会new一个新的数组 50%延长 节省空间
|–LinkedList 底层数据结构是链表(双向链表)、 查询慢、增删快、线程不安全、效率高
Set下面有两个子集合
|–HashSet 特点:
按照哈希算法来存取集合中的对象 存取速度比较快,当程序向HashSet中 add()的一个对象的时候, 先用hashCode方法计算出该对象的哈希码,哈希码不一致,添加。哈希码一致 ,不添加,相同对象不添加,然后用equals判断对象的属性是否一致,比较结果为false,就添加,true,就不添加。
LinkedHashSet 特点:
1.有序(存取一致)
是Set集合中唯一一个能保证怎么存就怎么取的集合对象
2.排重
3.底层是双向链表 HashSet的方法怎么用 LinkedHashSet就怎么用 TreeSet 二叉树 实现了SortedSet接口 能够对集合中对象进行排序
(1)set为什么不能存放重复的数据?
-比如HashSet内部存储的时候,是以Map的信息存放的,存放的数据放在Map的Key中,所以不允许放重复的数据
(2)HashSet为什么是无序的,而TreeSet是有序的?
-HashSet的底层存储数据结构是哈希表,保存的是对象的哈希值,而保存的顺序是由HashCode值决定的,并不一定是按照我们新建对象顺序保存的而是按照哈希值的大小顺序存的,就说在哈希值的表中是有顺序的,而这个顺序与新建对象的顺序没有关系
-TreeSet的底层数据结构是二叉树,存储数据的时候,构造二叉树只根据compareTo的返回值判断,TreeSet的两种排序方式:第一种排序方式,元素自身(普通类型的变量)具备比较性;二实现Comparable接口,覆盖compareTo方法
(3)为什么list是有序的?
(4)HashMap 的数据结构?
-HashMap是一个“链表散列”的数据结构,即数组和链表的结合体。
(5)集合各个实现类的数据结构?
-ArrayList是List接口的可变数组非同步实现,底层使用数组实现
-LinkedList是List接口的双向链表非同步实现,底层的数据结构是基于双向链表的
-HashSet由哈希表(实际上是一个HashMap实例)支持,不保证set的迭代顺序
-对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同。
-LinkedHashMap继承于HashMap,底层使用哈希表和双向链表来保存所有元素,并且它是非同步,允许使用null值和null键。
-HashMap是基于哈希表的Map接口的非同步实现,底层的数据结构是“链表散列”的数据结构,即数组和链表的结合体。
-Hashtable是基于哈希表的Map接口的同步实现,底层的数据结构是“链表散列”的数据结构,即数组和链表的结合体
-ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。
(1) 区别
throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。
(1)ROWNUM子查询
(2)ORDER BY 分页查询
(3)ROW_NUMBER OVER函数
(1)程序计数器
(2)虚拟机栈
(3)本地方法栈
(4)方法区
(5)堆
Hash碰撞:两个不同的原始值在经过哈希运算后得到同样的结果,这样就是哈希碰撞。
解决办法:
(1)开放地址法:
(2)再哈希法:当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
(3)链地址法(拉链法):这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:
(1)封装JDBC操作
(2)利用反射打通Java类与SQL语句之间的相互转换
MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。
(1)more:分页显示一个文件或任何输出结果
(2)less:分页显示一个文件并且可以回头
(3)whereis:寻找文件工具
(4)find:寻找文件工具
(5)grep:寻找某字串内容工具
(1)java -jar shareniu.jar:特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出。
(2)java -jar shareniu.jar & :特点:当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。
(3)nohup java -jar shareniu.jar &:nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。
(4)nohup java -jar shareniu.jar >/dev/null & :将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
(1)联系
-jsp是对servlet的一种高级封装。本质还是servlet。
(2)区别
-servlet在java代码中通过httpservletresponse来动态的生成一个html页面
-jsp是通过吧java代码嵌入到html中去生成一个动态的html页面
列表散列
MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。
(1)扩容必须满足两个条件:
-存放新值的时候当前已有元素的个数必须大于等于阈值
-存放新值的时候当前存放数据发生hash碰撞
使用resize()方法建立新的entry数组,然后通过transfer()方法把原来数组中的值保存到新数组中
redis有两种持久化功能,一种是“快照持久化”,一种是“AOF持久化”,快照持久化和AOF持久化是一种互补的关系,快照持久化用来做大的备份,而AOF持久化用来做做精细备份。
(1):加载Servlet
web容器负责加载Servlet,当web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的类名称,成功加载后,web容器会通过反射的方式对Servlet进行实例化。
(2):初始化
当一个Servlet初始化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等,如果初始化失败,则次Servlet将被直接卸载。
(3):进入服务
当有请求提交时,Servlet将调用service()方法进行处理,常用的是service根据请求类型调用doGet()或者doPost()方法进行处理;在service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息。
(4):销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
(5):卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
反射机制
这个面试机会是HR推荐的,埃森哲大连招聘,为他们天津的项目招人,待遇还是不错的,楼主一面已经过了,现在等着二面,二面说是比一面要更难,楼主心里慌慌啊,不过无所谓了,有所求才有所畏嘛,保持心态无欲无求就好了
1.常用的JAVA容器类有哪些?他们的特点是什么?为什么有这些特点?
2.如果想要排序,那么用哪个集合?
3.linkedList和ArrayList的区别?
4.HashMap的底层数据结构,如何存储数据?
5.HashMap是如何扩容?
6.HashMap是线程安全的么?
7.correntHashMap和HashTable的区别,为什么correntHashMap是线程安全的?哪个效率高?为什么?
8.多线程的锁有哪些?
9.CAS是什么?
10.Mybatis的插件有哪些?如何写插件?
11.oracle的分页方法?
12.MyBatis如何分页?
13.SpringMVC的流程?
14.SpringMVC常用的设计模式?
15.动态代理模式介绍?
16.分布式系统的架构是什么?
17.几台服务器实现?
18.业务如何分拆?
19.redis为什么要持久化?
20.缓存层数据丢失如何处理?
21.Spring常用的注解?如何使用?
还有其他的就想不起