java面试必背题。建议收藏哦。回答的可能不太好。见谅见谅
一、==,equals区别?
- ==在原生类(8个基本类型)中比较值,强类型比较地址
- 不重写默认equals和==是一样的.
- String类的equals方法是比较内容,因为重写了Object的该方法.
- Javabean语义建议重写equals方法的时候,也重写hashcode方法,
因为要保持一致性,否则在使用hash算法的对象的时候会出现问题.
二、String这个类的理解?
- String 是final修饰的类,代表不可被继承
- String还是jdk中一个特殊的类,代表不可变.
所以当字符串要频繁修改的时候不建议使用,对性能有影响,
因为每次修改都会创建新的对象.
三、什么是值传递,和引用传递?
- 原生类(8基本类型) 属于值传递,
值传递代表复制一份新的数据给到对方, 对方修改,不影响
自己. - 引用类型 属于引用传递, 传递的时候是把地址传递过去,
如果对方修改了该地址内的内容, 会影响到所有指向该
地址的变量. (PS:String由于其特殊性不可变,所以不会修改到原始地址中的值)
四、 hashcode的理解?
-
hashcode是一个native本地方法,是虚拟机运行的时候会去调用操作系统
的库获取数据的方法。 -
hashcode返回的是一个逻辑地址,
不同的对象的有可能重复hashcode(简称hash冲突)。 -
但是equals相等的对象,我们一定要保证它们hashcode也相等,
因为java中含hash算法的对象,判断对象是否相等会调用hashcode和equals两个方法.
五、 创建线程的几种方式?
- extends(e得死等死)继承Thread类,重写run方法
- interface 实现Runnable接口,重写run方法
- 实现Callable接口,重写call方法,使用FutureTask类封装获取返回结果
推荐使用后面两种, 因为接口是可以多实现的, 对线程实现类扩展性更强. - 使用线程池
4.1 线程池有四种:分别对应
Cached(缓存不设线程数量上限),Single(单个线程),
Fixed(固定数量),Scheduled(固定数量周期任务)
六、 线程的生命周期
- 线程实例化/初始化
- 线程start.进入 就绪/可运行 状态
- cpu选中该线程并执行 进入 运行 状态
- 进入同步方法,或wait,或sleep 进入 阻塞/等待 状态
- 线程执行完毕, 结束/死亡 状态
七、 什么是线程安全问题, 怎么解决?
- 线程安全指多个线程同时访问和修改同一资源发生数据不安全的情况。
- 为每个线程单独创建一个新的资源对象。(但是不可取,浪费内存空间)
- 使用局部变量传参,因为局部变量不存在线程安全的问题。
- 使用synchronize关键字锁住共享资源(性能较差)
- 使用ReentrantLock(瑞圈特绕克)重入锁对象.比synchronize灵活度高(性能较差)
- 使用ReentrantReadWriteLock对象,灵活度高,性能较好,读的时候可以一起读
八、 sleep和wait的区别?
- sleep是一个Thread类的静态本地方法,调用后进入阻塞状态
- sleep不会去释放对象锁
- sleep需要设置一个睡眠等待时间, 时间到了进入就绪状态
- wait是Object类的方法,调用后进入等待状态
- wait方法必须由锁池对象来调用,否则会抛出监视器异常
- wait会释放对象锁
- wait需要被notify唤醒或者设置时间自动唤醒,唤醒后进入抢占锁/锁池状态
然后进入可运行状态.
九、什么情况下你会考虑使用接口,什么情况下你会考虑使用抽象类?
- 如果考虑扩展性更强的时候,使用接口,因为可以多实现
- 如果要使用到父类的构造器,那么使用抽象类,因为接口没有构造器
- 如果要子类要继承一些公用字段和属性的时候,考虑使用抽象类,因为接口中不可以有
实例属性和静态属性,接口中的属性都是静态常量。 - 如果要继承一些已经写好的普通方法,那么可以使用抽象类, 因为接口中的方法都是
抽象方法(jdk1.8之后,接口中也可以有默认已经完成的方法供子类直接调用) - 如果不希望方法被子类覆盖,那么可以使用抽象类,因为接口中不可以有final的方法.
- 补充: 一般情况下,符合 is a关系使用extends, like a使用implement.
十、servlet是否线程安全?为什么?
- servlet本身不存在线程安全的问题,但是程序员要注意避免造成线程的不安全.
比如在servlet中新加了实例变量,就会造成不安全. - 因为doGet,doPost都为局部变量,局部变量不存在线程安全的问题,每次进入方法
都会单独的开辟新的方法内存空间存储当前的局部变量数据.
十一、 ajax运行原理?
- 根据不同的浏览器创建ajax对象
- 执行open,设置url,请求方式,参数,是否异步等等…
- 设置callback(口白可)回调
- 执行send发送
- 执行回调函数,根据请求状态(4代表已完成)和服务器响应状态(200),处理结果
十二、 JDBC运行流程?
- 加载数据库驱动 Class.forName
- 建立数据库连接 DriverManager.getConnection(url,username,pwd)
- 创建指令 connection.createStatement()/connection.prepedStatement(sql)
- 执行sql语句 statement.executeQuery(sql)/executeUpdate
- 解析ResultSet结果 rs.get…
- 释放数据库资源 rs statement connection 不为null关闭
…
十三、 谈谈你对异常的理解?
- java中异常的基类为Throwable(符肉a波),该类下面有两个子类Exception(e普赛可限),Error
- Exception代表的是程序运行中可能出现的异常, 一般可以通过代码避免和解决
- Error代表错误,比如编译错误,内存溢出,硬件等,这类错误一般代码自身无法修复,
需要联系管理员具体问题具体分析 - Exception下面又分为RuntimeException(运行时异常)和非运行时异常,
也称检查性异常CheckedException.
运行时异常程序不要求处理,检查性异常程序要求必须处理
(try-catch或throws在方法上声明抛出)
throws :声明异常
throw:抛出一个具体的异常
try-catch:捕获异常 - 常见的异常有:
NullPointException(空指针异常)
IndexOutOfBoundsException(索引越界异常)
SQLException(数据库异常)
IOException(IO异常,一般指输入输出流或文件错误的时候抛出)
ClassCastException(类型转换异常)
IllegalArgumentException(参数不匹配异常)
SerializationException(序列化异常)
FileNotFoundException(文件找不到异常)
ClassNotFoundException(类找不到异常)
十四、JSP九大内置对象
- application
应用服务器级别对象,获取Servlet的一些信息,也可以setAttribute存储对象
,存储的数据所有用户都能访问,所以是共享的,使用的时候要注意. - session
会话级别, 存储的数据在一次会话中有效, 多个用户之间是隔离的.
但考虑到是会话期间数据一直保存在服务器,所有使用的时候要注意性能问题. - request
请求级别,一次请求中的数据有效,一般传值用的较多. - page 当前页面对象,等价于servlet中的this
- pageContext 页面上下文,存储的数据在当前页面有效
- exception jsp页面异常信息
- config 获取servlet配置信息
- response 服务器响应,和重定向
- out 输出对象
十五、谈谈你对反射的理解?
- java的反射机制代表的是:
给任意一个类,可以知道它的所有属性和方法,当然还有其他(构造器,注解)
给任意一个对象,可以执行它的属性和方法,获取到属性值和执行方法的结果 - 反射一般用在通用功能模块的地方,当每个模块都需要用到类似的功能的时候,
可以考虑用反射写一个通用的方法来处理。 - 常用的第三方组件或框架就是大量使用反射来完成的.
比如spring ioc aop,hibernate和mybatis的orm.
十六、 JDK,JRE,JVM区别?
- jdk java开发工具 有一些常用的类库,供开发者使用,其中包含了jre.
- jre java运行环境 运行java程序所需的环境,其中包含了jvm
- jvm java虚拟机 编译和运行java程序,跨平台, 管理java内存.
十七、 truncate(强K特),delete,drop区别?
- drop和truncate属于DDL语句, delete属性DML语句.
- drop会删除定义和数据.
- truncate代表截断,会删除数据和日志,删除速度快,不能带条件,无法还原.
- delete可带条件删除数据,会记录日志可还原,删除速度慢.
十八、 SQL中包含哪些语句?
- DML 数据操纵语言 update insert delete
- DQL 数据查询语言 select
- DDL 数据定义语言 create,alter,drop
- DCL 数据控制语言 grant(授权), revoke瑞我克(收回权)
十九、 是否了解数据库索引?
- Oracle中索引类型分为三类:
unique index唯一索引, 该索引创建在唯一键或主键上,需要数据是唯一的
bit map位图索引, 该索引创建在规则性重复的字段上,比如省市区
index B-TREE索引 该索引创建在不规则重复的字段上,比如姓名 - 索引可以提升数据查询的性能,但是要避免不执行索引的sql语句,比如
2.1 不要在索引字段上使用函数
2.2 不要在索引字段上使用 != ,<>,not, is null
2.3 不要使用or
…等等,参考吴彦祖
以上会导致即使创建了索引, 也不会使用到索引,使得查询效率变慢. - 索引本身占用内存空间,且对插入和修改数据的性能有所影响,效率变低,
所以索引一般一个表不能太多(如果问具体几个,一般5个以内),
且应该用在经常查询的字段上,而非经常修改的字段. - 创建语法: create [unique/bitmap] index on table(column1, column2, …);
删除语法: drop index 索引名称
二十、 主键,唯一键,外键的区别?
- 主键一个表只能有一个,不能为null,不能重复
- 唯一键,一个表可以有多个,可以为null,不能重复
- 外键, 必须是其他表的主键或唯一键, 可以有多个,也可以为null.
开发中一般使用逻辑外键, 不会去创建物理外键,因为分布式项目或数据库的迁移都不方便
二十三、 表连接有哪些?
- 外连接,包含了
left [outer] join左外连接, 以左边为主表,左表的内容全部显示,右边表符合条件的显示,不符合的显示为null
right [outer] join右外连接,以右边为主表,右表的内容全部显示,左边表符合条件的显示,不符合的显示为null
full [outer] join全外连接, 两个表的数据都会显示,匹配的直接显示在同一行, 不匹配的连接表各自行显示为null - 内连接inner join, 两个表匹配的显示, 不匹配的都不显示
- 交叉连接cross join, 笛卡尔积, 即第一张表的每一条数据会和第二张表的每一条数据匹配一次,
如: A表有3条, B表有4条. 那么结果为: 12条.
二十四、 怎么获取数据的并集, 交集 , 差集?
- 并集可以使用union和union all. 区别是: union会去除重复记录,且会默认排序.
union all直接合并. - 交集使用intersect
- 差集使用minus
二十五、 行转列和列转行?
行转列:
SELECT
uname,
MIN(CASE cname WHEN ‘语文’ THEN cval END) 语文,
MIN(CASE cname WHEN ‘英语’ THEN cval END) 英语,
MIN(CASE cname WHEN ‘数学’ THEN cval END) 数学
FROM C
GROUP BY uname;
列转行:
union all
二十六、 堆栈的区别?
- 栈的性能较高, 但是大小固定.
- 堆的性能没有栈高, 但是大小可扩展.
- new出来的对象都是存储在堆中.
- 基本数据类型存储在栈中.
- 方法调用存储在栈中.
二十七、 TCP和UDP区别
- TCP 性能较差, 但是安全稳定, 需要三次握手,每次数据交互需要确认。
- UDP 性能较高,发送数据无需对方确认, 所以可能会丢包。
TCP:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
二十八、 Comparable和Comparator
- Comparable属于内部比较, 需要在比较的类上去实现该接口,
实现后,可以调用sort直接排序,且该类的对象排序规则都是一致的. - Comparator属于外部比较, 对需要比较的类无侵入(不需要实现接口), 而是在比较的
时候传入一个Comparator比较器, 每次比较的算法都可以更改.
二十九、hibernate和mybatis的区别?
- hibernate是面向对象方式来操作数据库,支持跨数据库;
mybatis由于自己写sql,所以不支持跨数据库. - hibernate是全自动ORM框架,而mybatis是半自动ORM框架
- hibernate入门容易,掌握和精通难, mybatis就相对hibernate容易掌握。
- mybatis由于是手写sql,所以可以完成sql优化. hibernate一般不写SQL,sql优化
做不了或者没有mybatis方便.
相同点:
- 运行流程类似…
- 都支持一二级缓存,且二级缓存可以自定义规则.
三十、 什么是事务?
事务是数据库保证一系列指令执行得到安全保障的一种机制,让我们的指令要么都
成功执行,要么都回滚,它有ACID四个特性.
- 原子性: 所有操作为一个最小化原子操作,要么都成功,要么都失败.
- 一致性: 所有操作在执行的前后数据的状态始终是一致的.
- 隔离性: 事务与事务之间相互隔离, 互不影响
- 持久性: 事务执行结束, 对数据的提交或回滚是持久的.
三十一、 hibernate对象的三态/ hibernate对象有哪些状态?
- 瞬时态 刚实例化的对象,session中没有该对象的缓存,DB中也没有该记录.
- 持久态 session中有该对象的缓存,DB中也有该记录.
调用get,save,update等方法会进入持久态.
持久态的对象做任何修改,最终会持久到DB. - 游离态/托管态 session中没有该对象,DB中有.调用session.close,clear,evict
会使对象进入托管态.托管态对对象操作,不会影响DB.
三十二、什么是一级缓存和二级缓存?
- 一级缓存默认已经打开, 在同一个session中有效,当session缓存中有对象
那么查询不会去访问数据库,而是直接使用本地数据。 - 二级缓存属于sessionFactory/(mybatis:mapper)级别的缓存, 多个session可以共享.默认关闭,需要手动
打开…
二级缓存一般使用在不怎么修改,但是经常可能查询数据上.比如:地区表,字典表
三十三、hibernate运行流程/原理?
- 读取hibernate.cfg.xml核心配置
- 创建sessionFactory对象
- 创建session
- 创建Transaction
- 提交/回滚事务
- 关闭资源
三十四、load和get的区别?什么是延迟加载?
-
延迟加载是指当用户访问对象数据的时候,才会去查询数据库.用于提升性能.
-
缺点是只能在session范围内去使用.session如果关闭了,那么延迟加载会抛出加载异常.
-
get即时加载,load是支持延迟加载.
-
get查询不到返回null, load由于还没有查询,所以默认不加载的时候返回代理对象,
加载的时候查询不到返回ObjectNotFoundException对象找不到异常. -
当Class的lazy设置为false,那么lazy也会立即加载,只是找不到返回异常.
三十五、 什么是ORM
1). Object Relational Mapping 对象关系映射
2). 类名对应表名
3). 字段名对应数据库列名
4). 对象对应一行数据
5). 类的属性类型对应数据库的字段类型
三十六、悲观锁和乐观锁
- 悲观锁是使用数据库的锁进制, 被锁住的数据, 其他线程无法修改,
悲观锁性能很差,一般不建议使用.
悲观锁有三种:
for update(尝试获取数据锁,获取不到一直等待),
for update nowait(尝试获取数据锁,获取不到抛出异常)
for update skip locked(尝试获取数据锁,获取不到跳过) - 乐观锁是代码实现的一种算法, 通过cas机制防止ABA问题,不依赖数据库锁机制
,提升性能.有效防止一个线程在读取和修改数据的同时,其他线程并发修改的问题.
乐观锁缺点是: 只能在单机应用上.
三十七、什么是脏读、幻读、不可重复读?
脏读: 读取到一个未提交的事务的数据, 该数据随时有可能被回滚,所以数据无效.
不可重复读: 事务A 多次读取一个数据,前后读取返回的不一致
(因为中间有事务BCDEFG)修改并提交了该数据.
幻读: 当事务A删除或修改所有数据,最后查询发现还有一/N条数据没有删除或修改
(其实是中间有其他事务BCDEFG插入了新的数据),
导致事务A这个人好像发生幻觉一样(我不是全删的么?)
三十八、SpringMvc运行原理?
- 客户端发送请求, 被web.xml中DispatcherServlet接住.
(如果没有配置load-on-start,这里还要去实例化DispatcherServlet并加载配置文件) - DispatcherServlet会调用HandlerMapping(处理器映射)对象寻找与之匹配的
Controller返回给到DispatcherServlet. - DispatcherServlet调用HandlerAdapter(处理器适配器)去执行该Controller.
- controller方法执行完成返回一个ModelAndView对象给到DispatcherServlet
- DispatcherServlet调用ViewResolver(视图解析器)解析ModelAndView.
- 解析完成的结果响应给到客户端.
三十九、什么是IOC和DI?
- IOC 代表控制反转, 或者IOC容器. 用于spring管理程序中所有对象的生命周期.
- DI 代表依赖注入. 从IOC容器中获取要注入的对象,注入到接口或对象中.
注入方式有五种:(AutoWrite注解注入,set方法注入,构造器注入,静态工厂注入,实例工厂注入)
这种思想提升了代码的可维护性, 使得我们代码的结构上下层之间完全解耦,
可以动态的装配对象.
四十、spring事务隔离级别有哪些?
有五种.
- default, spring不参与设置级别, 使用数据库默认的隔离级别
- READ_UNCOMITTED 读未提交 脏读, 幻读, 不可重复读 (Oracle不支持)
- READ_COMMITED 读已提交 幻读, 不可重复读
- REPEATABLE_READ 不可重复读 幻读 (Oracle不支持)
- SERLALIZABLE 序列化/串行化 绝对安全
四十一、 谈谈你用过的常用注解有哪些?
- @Controller @RestController @Service @Component @Repository
- @Qualifier 告诉IOC在DI的时候 @Scope springioc容器创建对象的方式,四种(单例,多例,request,session)
- @ResponsBody 返回json/xml对象 @RequestBody 接受请求JSON转化为对象
- @RequestMapping(get/post/delete/put.Mapping)
- @DateTimeFormat 传入字符串转换为日期格式
- @MapperScan 扫描mybatis的接口包,创建代理对象
- @ComponentScan 扫描支持IOC容器管理对象的包
- @JsonIgnore 返回JSON对象的时候忽略该属性
- @Configuration 让spring启动时候加载这个类,装载配置
四十二、 spring事务的传播特性?
- REQUIRED 默认值
代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就新建一个事务。
类比解释:如果马路上面有车就搭车,没有车就自己造一个车。(反正走路是不可能的) - REQUIRES_NEW
代表新建事务,如果已经存在一个事务,就把这个事务挂起。
类比解释:如果马路上有车也不搭车,还要自己造车。 - SUPPORTS
代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就以非事务方式执行。
类比解释:如果马路上面有车就搭车,没有车就自己走路回去,节能环保。 - NOT_SUPPORTS
代表如果已经存在一个事务,就把这个事务挂起,并以非事务方式执行。
类比解释:如果马路上有车也不搭车,自己走绿色环保(就是穷啊) - MANDATORY
代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就以抛出异常。
类比解释:如果马路上面有车就搭车,没有车就很愤怒。 - NEVER
代表如果已经存在一个事务,就抛出异常。如果当前没有事务,以非事务方式执行。
类比解释:马路上有车就愤怒的爆炸,一个车没有就自己走绿色环保。 - NESTED
代表创建当前事务的子事务
水和鱼的关系,鱼(子事务)没有了但不影响水(父事务),
但是水(父事务)没有了则影响了鱼(子事务)
四十三、volatile关键字的作用?
- 不能够保证线程安全.只是让线程之间共享变量的时候,确保拿到的是最新的值.
- 禁止变量重排序
四十四、HashMap的底层存储原理?
- 通过数组加链表的方式
- put存储的时候,会根据key的hashcode计算出要存储的位置,
如果该位置有值,那么会调用equals判断key值是否相等,如果相等则覆盖原来的值,
并返回旧的值.如果equals不等, 那么代表出现hash冲突,会把该值存储到链表
已有对象的next位置. - get取值的时候,会根据key的hashcode计算出位置,如果该位置为null,则返回null.
如果不为null,则调用equals判断是否相等, 相等则返回该value.
不相等则继续去判断链表的next是否与之相等, 直到匹配后返回该next的值.
如果链表中没有一个和该key相等的, 那么返回null.
四十五、什么是序列化和反序列化? 哪些属性无法被序列化?
- 序列化是指把程序内存中的对象, 保存到外部存储介质上存储(比如硬盘上).
- 反序列化是指把外部存储介质上的内容, 加载到程序内存中.
- transient(瞬时的),static(静态的)属性无法被序列化.
- 序列化需要实现Serializable接口.否则会抛出NotSerializableException.
四十六、怎么创建正则表达式验证?
Matcher matcher = Pattern.compile(reg).matcher(password);
matcher.matches() 匹配返回true, 不匹配返回false
四十七、谈谈对AOP的理解?
- AOP 为面向切面编程
- 使用AOP让我们业务代码只需关注本身功能, 对公共组件功能可以单独
封装到aop中. 比如(异常,验证,事务,日志,监控等等)都为通用功能,是不需要每个
模块的业务去重复编写的. - 使用AOP可以提供代码的复用性,降低耦合性.
- spring aop有五种通知: 分别为: 前置,后置,异常,最终,环绕.
四十八,数据库函数和存储过程的区别?
1,函数可以有返回值和输入输出参数,存储过程只能有输入输出参数
2,函数一般使用DQL,DML语句中,存储过程一般单独调用用于完成某类业务功能,
相同点:一次编译,多次执行。
四十九,什么是同步,异步?堵塞。非堵塞?什么是BIO,NIO,AIO?
1,同步:客户端发送请求到服务器,假设服务器处理请求需要n秒时间。那么客服端会一直等待(无法做其他任务)。
2,异步:客户端发送请求到服务器假设服务器处理请求需要秒时间,那么客户端不会等待。可以先做其他任务,服务器响应后。会执行回调处理结果。
3,堵塞:服务器只能处理一个客户端请求,处理完后接收第二个请求。
4,非堵塞:服务器可以同时接受多个请求,
IO分为BIO,NIO,AIO
BIO:同步堵塞,客户端和服务器一对一交互,效率比较低。
NIO:同步非堵塞,客户端和服务器多对一交互,服务器效率提升。
AIO:异步非堵塞,客户端和服务器多对多交互。性能卓越
五十、LOCK与synchronized的区别?
1、lock是接口,synchronized是java中的关键字,synchronized是内置语言实现,lock是代码层次实现。
lock可以选择性的获取锁,一段时间获取不到锁,会自动放弃,而synchronized不同,他会一根筋的执行下去,借助lock这个特性,来规避死锁的发生,synchronized必须通过严谨的设计,才能减少死锁发生。
synchronized在执行同步和异步快结束的时候,会自动释放锁,而lock需要手动释放锁,如果忘记,同样会导致死锁发生
五十一、转发和重定向的区别?
1.转发属于服务器内部跳转,只能跳转内部页面,属于一次请求
重定向是向客户响应一个指令,客户端二次重新跳转,可以跳转到外部页面
2.转发可以通过request传递数据,重定向不能
3.转发性能比重定向好
4.转发地址栏不会改变,重定向因为属于二次请求,所有地址栏会变
五十二、页面传递数据方式有哪些?
1、如果是前后端分离项目
1.1可以通过url传递数据
1.2可以通过cookie传递
1.3可以通过第三方中间性,如redis。后端放置数据到redis中,前端通过异步请求后台获取
2、如果是模板引擎,非前后端分离的项目:
1.1可以通过form表单隐藏域
1.2可以通过request,但只限于转发
1.3可以通过session
1.4可以通过application,不建议使用,application是应用级别,所有用户共享
五十三 springmvc和struts2的优略点
共同点:他们都是表现层框架,基本mvc模型编写的
他们底层都离不开原始servletapi
tam处理请求的机制都是一个核心的控制器
区别
spring mvc的入口是servlet,而struts2是filter
spring mvc是基于方法设计的而struts是基于类,struts2每次
执行都会创建一个动作类,所以spring mvc会比struts2快些
spring mvc会稍微比struts2快些
springmvc 使用更加简洁处理ajax的请求更方便
五十四 springmvc中的器
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性
五十五过滤器和拦截器
拦截器和过滤器的功能比较类似,有区别
- 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
- 拦截器是SpringMVC框架独有的。
- 过滤器配置了/*,可以拦截任何资源。
- 拦截器只会对控制器中的方法进行拦截。
- 拦截器也是AOP思想的一种实现方式
- 想要自定义拦截器,需要实现HandlerInterceptor接口。
controller方法执行前,进行拦截的方法
- return true放行
- return false拦截
- 可以使用转发或者重定向直接跳转到指定的页面
- preHandle方法是controller方法执行前拦截的方法
- 可以使用request或者response跳转到指定的页面
- return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
- return false不放行,不会执行controller中的方法。
- postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
- postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
五十六final,
final修饰的类,方法,变量的特性?
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
五十七:静态变量和实例变量的区别?
五十八jdk1.8的新特性?
五十九:11:String,StringBuffer,StringBuilder的区别?
六十ArrayList和Vector的区别/联系ArrayList,LInkedList的区别
六十一:描述一下JVM加载class文件的原理机制?
加载
把类的.class文件中的数据读入内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的class对象。此时的对象还不稳重,类还不可以使用。
连接
当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤
初始化
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
2)如果类中存在初始化语句,就依次执行这些初始化语句
六十二:GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,
Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
六十三:http,https,tcp/ip的区别?
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
六十四:如何优化大数据量的查询?
六十五:你对Spring的理解。
六十七:你对springboot的理解?
六十八:如何部署项目?
六十九:项目开发流程
七十:rabbitmq的理解?
1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
七十一:如何解决高并发问题?
七十二:springcloud的理解?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发
便利性巧妙地简化了分布式系统基础设施的开发,
如服务发现注册、配置中心、消息总线、负载均衡、断路器、
数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
七十三、spring的事务
1.声明式事务
1.1@基于@Tranctional注解
2.2基于TranctionProxyFactoryBean
1.3基于@Aspactj切面 AOP
2编程式事务
七十四、jsp执行原理
1.jsp本质也是一个servlet,首先会翻译成servlet文件
2.servlet文件编译为.class文件
3.服务器虚拟机执行.class文件
4.request返回静态内容给前端页面
七十五 redis是什么,什么场景使用?
1.redis是一个nosql基于内存的高性能缓存数据库
经常查询的数据,可以缓存到redis,程序不用每次访问数据库查询,
提升服务器性能和用户体验
对于会修改的数据要及时更新redis缓存,或者设置有效时间
七十六 redis缓存持久化方式有几种,有什么区别
1.RDB 优点:易备份,缺点:当不满足save条件时候可能丢失数据
2.AOF 每一次写入的指令都会以日志方式存储到aof文件中,数据的完整性和一致性更高 ,因为日志是相对实时的(默认每秒执行一次)。
缺点 :因为aof每次都记录,aof记录的内容过多,文件越来越大,数据恢复时候效率慢
若只打算用redis做缓存,可以关系持久化
若打算使用redis做持久化。建议在从节点上ROB和AOF都开启
其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB
七十七:jq
//1.获取b1按钮
$("#b1").click(function(){
alert(“abc”);
});
2. 入口函数
$(function () {
});
window.onload 和 $(function) 区别
* window.onload 只能定义一次,如果定义多次,后边的会将前边的覆盖掉
* $(function)可以定义多次的。
jquery对象.each(function(index,element){});
* index:就是元素在集合中的索引
* element:就是集合中的每一个元素对象
* this:集合中的每一个元素对象
七十八:创建一张表
CREATE TABLE test
.tscore
(
id
INT NOT NULL AUTO_INCREMENT COMMENT ‘考试记录ID’,
sno
INT NULL COMMENT ‘学号,外键,关联自student表的主键’,
score
INT NULL COMMENT ‘分数’,
PRIMARY KEY (id
));
七十九
新增数据的语法:
insert into 表名(列名1,列名2) values(值1, 值2)
修改数据的语法:
update 表名 set 列名1=新值1,列名2=新值2 [ where 条件 ]
八十 spring cloud 的核心组件有哪些?
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
八十一spring cloud 断路器的作用是什么?
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元
发生故障(类似用电器发生短路)之后,通过断路器的故障监控
(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间
的等待。这样就不会使得线程因调用故障服务被长时间占用不释放
,避免了故障在分布式系统中的蔓延。