JAVA中级面经

9 篇文章 0 订阅
2 篇文章 0 订阅

自我介绍
离职原因
最近项目
1.String方法取后三位,日期转换
subString lenth()-3 SimpleDateFormat
2.int与integer 区别、项目中的使用
基本数据类型 包装类
3.map的遍历
map.keyset map.getkey
Iterator迭代器遍历
entrySet遍历 entry.getkey()
4.hashmap为什么不安全 key可以为空吗
①.多个线程某一时刻同时操作HashMap并执行put,hash值同,需解决 冲突。②.put()方法不是同步的 ③.addEntry()方法不是同步的 ④.resize()扩容方法不是同步的
5.讲一下微信登录验证 单点登录 token是如何管理的

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
    点单登录:单点登录有三种方式 ①:以Cookie作为凭证媒介 最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。 ②通过JSONP实现 用户在父应用中登录后,跟Session匹配的Cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的Cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。 ③ 通过页面重定向的方式 父应用提供一个GET方式的登录接口,用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个的登录页面,用户输入账号密码进行登录。如果用户已经登录了,则生成加密的Token,并且重定向到子应用提供的验证Token的接口,通过解密和校验之后,子应用登录当前用户。

6.项目中aop是怎么应用的?IOC与AOP各自讲一下?spring的事物?
a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。
b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

7.controller的注解有哪些?
@RestController @RequestMapping @Autowired @ResponseBody
8.接口404原因?
Web 服务器找不到您所请求的文件或脚本…这个饼子怎么吃??前端url写错了?
9.关于的tomcat的配置,你配置过哪些?如何配两个?
①端口号 ②maxThreads,最大并发数,默认设置 200
③minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25
④maxQueueSize,最大的等待队列数,超过则拒绝请求 ⑤最大等待时长
10.讲一下分布式锁?

首先三种实现方式
①基于数据库实现分布式锁;
在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁
②基于缓存(Redis等)实现分布式锁;
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
③基于Zookeeper实现分布式锁;
(1)创建一个目录mylock;
(2)线程A想获取锁就在mylock目录下创建临时顺序节点;
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。
11.zookeeper有哪些配置?
ClientPort:zk服务器监听的端口,客户端通过该端口建立连接,每台zk服务器也允许设置为不同的值。默认配置文件设定的是2181
dataDir:zk用于保存内存数据库的快照的目录
dataLogDir: zk的事务日志路径
tickTime:zk使用的基本时间单位是tick,这个参数用于配置一个tick的长度,单位为毫秒,默认配置文件设定的是3000

autopurge.snapRetainCount:3.4.0及之后版本zk提供了自动清理快照文件和事务日志文件的功能,该参数指定了保留文件的个数,默认为3,这里我设置为10.
autopurge.purgeInterval:和上一个参数配合使用,设置自动清理的频率,单位为小时,默认为0表示不清理,建议设为6或12之类的值。这里我设置了48,意思是48小时自动清理一次。

12.mysql int的类型有哪些?
TINYINT=1字节(8位)
SMALLINT=2字节(16位)
MEDIUMINT=3字节(24位)
INT=4字节(32位)
BIGINT=8字节(64位)
13.io与nio的区别?
IO(BIO)是面向流的,NIO是面向缓冲区的
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
14.elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段。elasticsearch 的倒排索引是什么。
ElasticSearch(简称ES)是一个分布式、Restful的搜索及分析服务器,设计用于分布式计算;能够达到实时搜索,稳定,可靠,快速。和Apache Solr一样,它也是基于Lucence的索引服务器,而ElasticSearch对比Solr的优点在于:
1.轻量级:安装启动方便,下载文件之后一条命令就可以启动。
2.Schema free:可以向服务器提交任意结构的JSON对象,Solr中使用schema.xml指定了索引结构。
3.多索引文件支持:使用不同的index参数就能创建另一个索引文件,Solr中需要另行配置。
4.分布式:Solr Cloud的配置比较复杂。
倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
##elasticsearch 索引数据多了怎么办,如何调优,部署。
使用bulk API
初次索引的时候,把 replica 设置为 0

15.servlet生命周期
16.mybatis #{} ${}区别 如何避免
17.mysql 横表转竖表
18.mysql varchar转date
19.一个项目的整个过程

20.JSP 三大指令
page、include、taglib
jsp中@include和jsp:include的区别:前者静态加载内容,后者动态加载内容。前者编译成同一个servlet文件,后者编译成两个servlet。

21.SSH框架
对ssh的理解:
先说说hibernate
hibernate是一个ORM框架,是对JDBC的一个封装。目的也是很明显,就是为了简化对数据表访问得一个操作。
ORM得意思是对象关系映射,通过实体类与数据表建立映射,就可以通过持久层操作来代替SQL语句访问数据库。
那么hibernate得核心原理是什么呢?就是ORM,通过JAVA反射机制来实现。
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类得所有属性和方法;对于任意一个对象,
都能够调用它的任意一个方法和属性;这种动态得获取信息以及动态调用对象的方法得功能就是java得反射机制.
说了核心原理 接下来说配置文件.
配置文件包括:
hibernate.cfg.xml 用来存储连接数据库得信息(包括要指定连接数据库用的驱动,常用的ORACLE,MYSQL,sqlserver;分别对应得
是oracle.jdbc.driver,com.mysql.jdbc.Driver,com.microsoft.sqlserver.jdbc.SQLServerDriver.加载好驱动后设置路径,端口号分别是1521,3306,1433,接下里就是数据库得用户名和密码)
如果用注解得话就可以直接在实体类中@Entity @Table @Id等直接映射数据库表
否则得话就得用一个XML来配置一下,tablename.hbm.xml配置实体类和数据表得关联关系.
hibernate得核心类
Session接口:负责持久化对象得CRUD操作(也就是增删改查)
SessionFactory接口:负责初始化Hibernate
configuration接口:负责配置并启动Hibernate
Transcation接口: 负责事务
query接口和criteria接口:负责执行各种查询
接下来说一下对象得几个状态:
我是怎么理解得 第一种 和数据库表建立好关系得 也就是持久化状态
第二章 没有建立好关系得,瞬时状态。
第三章 因为某种操作 数据库没有了想对象得表,但是已经进行过持久化,那么这个时候就是游离状态

说完了hibernate 谈一谈STRUTS2
它是一个MVC框架,它得核心控制器filterDispatch充当了一个控制器的角色
相对于struts1来说,2得框架结构变化非常大。1是对原生servlet得封装,而2是对webwork得改进和封装.webwork得实质就是一个拦截器.所以2得核心机制就是拦截器原理,也是基于反射机制的实现
通过url解析出action名和方法名,检索并执行处相应得action类以及拦截器.
它得配置文件为stauts.xml名字必须这么叫,不能更改.
创建好它之后一定要去配置web.xml 把下面这段话粘贴进去

struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2
/*

核心类
一个请求在struts2框架中得处理是到底是什么样子呢?
1.客户端初始化一个指向servlet容器(我到现在为止就用过tomcat)得请求;
2.这个请求先经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp得可选过滤器,这个过滤器对于STRUS2和其他框架得集中很有帮助)
3.接着FilterDispatchar被调用,它会询问ActionMapper来决定这个请求是否需要调用某个Action;
4.如果ActionMaper决定需要调用某个Action,它会吧请求得处理交给ActionProxy代理类,然后这个类通过询问配置文件找到需要调用的Action类;
5.ActionProxy会创建一个ActionInvocation得实例。这个实例是用命名模式来调用,在条用Action得过程前后会涉及到相关的Intercepter得调用.
6.一点Action执行完毕,ActionInvocation负责跟进配置文件找到相应得返回结果。通常都是JSP,当然也可以是另外一个Action。
对于Struts2得了解我就知道这么多了。
该SPRING了。
Spring是一个免费开源得容器框架,它得两大核心思想;IOC 和AOP
IOC称为控制反转,也叫依赖注入.其实不管什么叫什么,他们都可以这样理解:当某个Java实例需要另一个Java实例时,在传统的程序设计过程中,通常有调用者来创建被调用者得实例。但是在IOC模式下,创建被调用者得工作不再是调用者来完成,而是由Spring容器来完成,然后注入调用者。
注入方式有三种:使用属性的setter方法来注入被依赖的实例和使用构造器来注入被依赖的实例.以及我现在常用得注解进行注入。
IOC容器有3个基本要点:第一个就是程序得各个组件面向接口编程。这样可以将各个组件的耦合提升到接口层次,从而有利于项目后期得扩展。
第二个就是程序得各组件不再有程序主动产生,而是由Spring容器来负责产生,并初始化。
第三个Spring采用配置文件,或者注解来关联Bean得实现类和依赖关系
AOP 面向切面编程。
我的理解是这样得,比如说你每做一次对数据库操作,都要生成一句日志。如果你对数据库得操作有很多,那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你就可以写一个方法,在这个方法用写有关于数据库操作得方法,每一次调用这个方法得时候,就加上生成日志的操作。

①Hibernate工作原理?
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
②spring中的@resource和@component区别
resource默认按照名称注入,只有当匹配不到bean时才按类型注入 component按照类型注入,如果想名称注入需要结合@qualifier
③struts配置文件
常用配置 constant
包配置package
(1)name :指定包名,标识作用,不可以与其他包名重复(必填属性)
(2)namespace :指定action访问路径一个命名空间(可选属性)
(3)extends :继承一个指定包,通常设置继承struts-default,将继承里面的拦截器(可选属性)
(4)abstract :标识作用,指定该包是否为一个抽象包(可选属性);指定为true,别人可以继承,否则不能继承
Action配置
1.action标签
(1)name :标识action,指定了Action所处理请求的URL(必填属性)
(2)class :指定action对应的Action类,需要写Action类的全包名(可选属性)
(3)method :指定请求Action类时,调用的方法(可选属性);默认为execute
2.result标签
(1)name :标识结果处理的名称,与action方法的返回值对应
(2)type :指定调用哪一个result类处理结果,默认使用转发dispatcher;常用type还有redirect(页面重定向,跳转到jsp页面,丢失传递的信息)、redirect-action(action重定向,跳转到action,丢失传递的信息)、chain(将请求转发到一个action,被跳转的Action中仍能获取上个页面的值)
(3)标签体 :指定跳转页面的相对路径
④IOC AOP的具体使用
ioc就是其实就是依赖注入,在程序中不出现new关键字,而是用接口来命名引用,把接口的某个实现类的实例注入到引用里,从而实现与接口具体实现类的松耦合。
aop方式就理解起来就简单了,其方式很类似j2ee中的filter,就是在程序正常的业务流中间像切面一样插入很多其他需要执行的代码,比如登陆时候在进入登录页面前写入日志,登录以后查看cookie等类似的操作,很常用的,尤其是跟数据库有关的,或者跟支付有关的程序肯定会在每一步前面插入日志,还有某些国际化项目会在每次跳转时候都转换字符集之类。
22.数据结构:栈 先进后出,堆,树,队列,数组,链表
23.索引:排好序的用于快速查找的数据结构 索引的种类:普通索引,唯一索引,主键索引,组合索引,组合索引,全文索引。索引类型:全文,hash,btree,rtree
24.new一个ArrayList它的长度
ArrayList构造一个默认初始容量为10的空列表,size为0
25.spring cloud 组件
1、Eureka:各个服务启动时,(服务端) 都会将服务注册到(注册机),
并且 (服务端) 还可以反过来从 (注册机) 拉取注册表,从而知道其他服务在哪里。(注册中心)
2、Ribbon:服务间发起请求的时候,基于 Ribbon去做这个负载均衡,从一个服务的集群机器中根据策略选择一台执行作业。
3、Feign:基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起作业请求。
4、Hystrix:发起请求是通过 Hystrix 的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
5、Zuul:如果前端、移动端要调用后端系统,统一从 Zuul 网关进入,由 Zuul 网关转发请求给对应的服务。
26.springboot原理简单说下
在这里插入图片描述
待更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值