1.JavaSE基础(32) 遍历数组的3种方式?
第一种:for循环
第二种:增强for循环foreach
第三种:利用jdk自带的方法 --> java.util.Arrays.toString()
2.JAVA中循环遍历list有三种方式?
JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历。
3.面向对象特征有哪些方面?
1. 封装,隐藏内部实现,只暴露公共行为
2. 继承,提高代码的重用性
3. 多态,体现现实生活中相似对象的差异性
4. 抽象,抽取现实世界中相似对象的共同点
4.Java实现多态机制是什么?
通过继承父类或实现接口。不同子类或实现类对同一父类方法有不同的实现。根据对象调用相应的实现方法。另外对于相似的方法,可以使用重载。
5、HashMap和Hashtable的区别
1. 线程同步,Hashtable线程安全,HashMap线程不安全
2. 效率问题,Hashtable效率低,HashMap效率高
3. HashMap可以使用null作为key,Hashtable不可以使用null为key
4. HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老
5. Hash算不同,HashMap的hash算法比Hashtable的hash算法效率高
6. HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。
7. 取值不同,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口
6、List和 Map区别?
一个是存储单列数据的集合,另一个是存储键和值的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
- List有重复值,Map没有重复key,但可以有重复值
- List有序,Map不一定有序
- List只能存单列值,Map可以存双列值
7、List, Set, Map是否继承自Collection接口?
List,Set是,Map不是
8、List、Map、Set三个接口,存取元素时,各有什么特点?
List使用get(index)取值,也可以使用Iterator、toArray取值
Set只能通过Iterator、toArray取值
Map取值使用get(key)取值,也可以使用keySet取键值集合,也可使用values取值集合,entrySet取全部映射。
9.谈谈tomcat的优化经验?
加大tomcat使用的jvm的内存。
解决JRE内存泄漏
更新到最新版本的Tomcat来获得较好性能和可扩展。
线程池设置。
利用缓存和压缩,采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存。
采用集群:采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。
去掉对web.xml的监视;
将jsp提前编辑成servlet,在服务器下运行时,把jsp都打开一遍
10、什么是Servlet?
可以从两个方面去看Servlet:
a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。
b、组件:服务器端用来处理客户端请求的组件,需要在web.xml文件中进行配置。
11、Servlet的生命周期?
servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。
12、Servlet接口中有哪些方法?
Servlet接口定义了5个方法:
-
void init(ServletConfig config) throws ServletException
-
void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
-
void destory()
-
java.lang.String getServletInfo()
-
ServletConfig getServletConfig()
13、什么情况下调用doGet()和doPost()?
默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法;为get的时候,调用deGet()方法。
14、转发(Forward)和重定向(Redirect)的区别?
转发是服务器行为,重定向是客户端行为。
从效率来说
forward:高.
redirect:低.
15.自动刷新(Refresh)?
Response.setHeader()
16.Servlet与线程安全
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。 解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类Servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是java和HTML可以组合成一个扩展名为.jsp的文件。JSP偏重于视图,Servlet偏重于业务逻辑。
18、JSP工作原理?
JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里面。
19、Request对象的主要方法有哪些?
-
setAttribute(String name,Object):设置名字为name的request 的参数值
-
getAttribute(String name):返回由name指定的属性值
-
getAttributeNames():返回request 对象所有属性的名字集合,结果是一个枚举的实例
-
getCookies():返回客户端的所有 Cookie 对象,结果是一个Cookie 数组
-
getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body的长度
-
getHeader(String name) :获得HTTP协议定义的文件头信息
-
getHeaders(String name) :返回指定名字的request Header 的所有值,结果是一个枚举的实例
-
getHeaderNames() :返回所以request Header 的名字,结果是一个枚举的实例
-
getInputStream() :返回请求的输入流,用于获得请求中的数据
-
getMethod() :获得客户端向服务器端传送数据的方法
-
getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值
-
getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
-
getParameterValues(String name):获得有name指定的参数的所有值
-
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
-
getQueryString() :获得查询字符串
-
getRequestURI() :获取发出请求字符串的客户端地址
-
getRemoteAddr():获取客户端的 IP 地址
-
getRemoteHost() :获取客户端的名字
-
getSession([Boolean create]) :返回和请求相关 Session
-
getServerName() :获取服务器的名字
-
getServletPath():获取客户端所请求的脚本文件的路径
-
getServerPort():获取服务器的端口号
-
removeAttribute(String name):删除请求中的一个属性
12、request.getAttribute()和 request.getParameter()有何区别?
request.getParameter()获取的类型是String;request.getAttribute()获取的类型是Object
request.getPrameter()获取的是POST/GET传递的参数值和URL中的参数;request.getAttribute()获取的是对象容器中的数据值/对象。
13、JSP有哪些内置对象?作用分别是什么?
JSP一共有9个内置对象:
-
request:负责得到客户端请求的信息,对应类型:javax.servlet.http.HttpServletRequest
-
response:负责向客户端发出响应,对应类型:javax.servlet.http.HttpServletResponse
-
session:负责保存同一客户端一次会话过程中的一些信息,对应类型:javax.servlet.http.httpsession
-
out:负责管理对客户端的输出,对应类型:javax.serlvet.jsp.jspwriter
-
application:表示整个应用环境的信息,对应类型:javax.servlet.servletcontext
-
config:表示ServletConfig,对应类型:javax.servlet.servletconfig
-
exception:表示页面中发生的异常,可以通过它获得页面异常信息,对应类型:java.lang.exception
-
pagecontext:表示这个JSP页面上下文,对应类型:javax.servlet.jsp.pagecontext
-
page:表示当前JSP页面本身。
14、JSP有哪些动作?作用分别是什么?
JSP一共有以下6中基本动作:
-
JSP:include (当页面被请求的时候引入一个文件)
-
JSP:forward (将请求转到另一个页面)
-
JSP:useBean (获得JavaBean的一个实例)
-
JSP:setProperty (设置JavaBean的属性)
-
JSP:getProperty (获得JavaBean的属性)
-
JSP:plugin (根据浏览器类型为Java插件生成object或者embed两种标记)
15、JSP常用指令有哪些?
page、include、taglib
16、讲解JSP中的四种作用域
JSP中的四种作用域包括page、request、session和application,具体来说:
a、page是代表一个页面相关的对象和属性。一个页面由一个编译好的java servlet类(可以带有include指令,但不可以带有include动作)表示。这既包括servlet又包括编译成servlet的jsp页面。
b、request是代表与web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个web组件(由于forware指令和include动作的关系)
c、session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个web回话也可以经常跨域多个客户机请求。
d、application是代表与整个web应用程序相关的对象和属性。这实质上是跨域整个web应用程序,包括多个页面、请求和回话的一个全局作用域。
19、JSP乱码如何解决?
a、JSP页面乱码:<%@page contentType="text/html;charset=utf-8" %>
b、表单提交时出现乱码:request.setCharacterEncoding("utf-8");
c、数据库出现乱码:jdbc:mysql://localhost:3306:/user?useSSL=false&useUnicode=true&characterEncoding=utf-8;
其实我一般的处理的方法就是配置一个过滤器对每个JSP页面进行字符集处理。
20、实现会话跟踪的技术有哪些?
1. 使用Cookie
优点: 数据可以持久保存,不需要服务器资源,简单,基于文本的Key-Value
缺点: 大小受到限制,用户可以禁用Cookie功能,由于保存在本地,有一定的安全风险。
2. URL 重写
在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。
优点: 在Cookie被禁用的时候依然可以使用
缺点: 必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问。
3. 隐藏的表单域
<input type="hidden" name ="session" value="..."/>
优点: Cookie被禁时可以使用
缺点: 所有页面必须是表单提交之后的结果。
4. HttpSession
在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。
21、Cookie和Session的的区别?
1.由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景。
2.思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的。
3.Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。
22、什么是Tomcat?
Tomcat是一种web服务器,java编写的web项目可以部署在上面,用户在客户端请求时,都是将请求发到Tomcat上,Tomcat在将请求发到对应的项目上。
23、 详细描述MVC
基于java的web应用系统采用MVC设计模型,即用Model(模型)、View(视图)和Controller(控制)分离设计,这是目前web应用服务系统的主流设置方向。
Model:处理业务逻辑的模块。
View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。
Controller:负责每个请求的分发,把Form数据传递给Model进行处理,处理完成后,把处理结果返回给相应的View显示给用户。
数据库常见面试题:
1.事务四大特性?
原子性,要么执行,要么不执行
隔离性,所有操作全部执行完以前其它会话不能看到过程
一致性,事务前后,数据总额一致
持久性,一旦事务提交,对数据的改变就是永久的。
2.索引有B+索引和hash索引
索引 | 区别 |
---|---|
Hash | hash索引,等值查询效率高,不能排序,不能进行范围查询 |
B+ | 数据有序,范围查询 |
3.索引的优缺点,什么时候使用索引,什么时候不能使用索引?
索引最大的好处是提高查询速度,
缺点是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。
4.索引的底层实现(B+树,为何不采用红黑树,B树)重点
树 | 区别 |
---|---|
红黑树 | 增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间 |
B树也就是B-树 | B树,查询性能不稳定,查询结果高度不致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。 |
B+树 | B+树相比较于另外两种树,显得更矮更宽,查询层次更浅 |
5.B+树的实现
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素
6.为什么使用B+Tree?
索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。
根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,
将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入局部性原理与磁盘预读
7.索引分类,索引失效条件
8.varchar和char的使用场景
类型 | 使用场景 |
---|---|
varchar | 字符长度经常变的 |
char | 用字符长度固定的 |
9.数据库连接池的作用?
维护一定数量的连接,减少创建连接的时间、更快的响应时间、统一的管理
10.数据库三范式
级别 | 概念 |
---|---|
1NF | 属性不可分 |
2NF | 非主键属性,完全依赖于主键属性 |
3NF | 非主键属性无传递依赖 |
10.关系型数据库和非关系型数据库区别
关系型数据库:
优点
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询。
5.支持事务
缺点
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、不支持高并发读写需求;
4、不支持海量数据的高效率读写
非关系型数据库:
1、使用键值对存储数据;
2、分布式;
优点
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点
不提供sql支持
11.有哪些锁,select时怎么加排它锁?
锁 | 概念 |
---|---|
乐观锁 | 自己实现,通过版本号 |
悲观锁 | 共享锁,多个事务,只能读不能写,加 lock in share mode |
排它锁 | 一个事务,只能写,for update |
行锁 | 作用于数据行 |
表锁 | 作于用表 |
12.死锁怎么解决
找到进程号,kill 进程