发表于: 2019-11-05 19:22:25
1 889
今天做了什么
收获
学习了面试常见知识点:
44.XML
XML文档定义有几种形式,有何区别,解析XML文档的方式
XML文档定义分为DTD和Schema两种形式.二者都是对XML语法的约束. 区别??
DOM( Document Object Model),SAX( Simple API for XML)和StAX( Streaming API for XML)
DOM 处理大型文件时其性能下降的非常厉害,因为 DOM树结构占用的内存较多, DOM解析方式必须在解析文件之前把整个文档装入内存,适合对XML的随机访问 (典型的用空间换取时间的策略)
SAX是事件驱动型的XML解析方式(当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理XML文件),它顺序读取XML文件,不需要一次全部装载整个文件。适合对XML的顺序访问;
StAX把重点放在流上,实际上StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理。
xml作用
数据交换和信息配置.但前者已被JSON取代. 且已有一些软件开始将配置文件写成JSON格式.
45.JDBC
JDBC操作数据库的步骤
驱动,连接
创建语句,执行语句,处理结果
关闭资源
//加载驱动(在jdbc4.0中可省略.但建议保留)
Class.forName("oracle.jdbc.driver.OracleDriver");
//创建连接
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
//创建语句
PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
ps.setInt(1, 1000);
ps.setInt(2, 3000);
//执行语句
ResultSet rs = ps.executeQuery();
//处理结果
while(rs.next()) {
System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
}
//关闭资源(关闭顺序和打开顺序相反.可以只关闭连接.)
finally {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Statement和PreparedStatement有什么区别
PreparedStatement接口代表预编译的语句,主要优势在于可以减少SQL编译错误并增加SQL的安全性(防止SQL注入)
PreparedStatement中SQL语句可以带参数,避免拼接.
批量处理SQL或频繁执行相同的查询时,后者有明显的性能上的优势(数据库可以将编译优化后的SQL语句缓存下来,不用再次编译和生成执行计划).
存储过程 Stored Procedure
数据库中一组为了完成特定功能的SQL语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.JDBC API中提供了CallableStatemant接口来提供对存储过程的调用.
如何提升读写数据的性能.
读取:通过结果集ResultSet对象的setFetchSize()方法执行每次抓取的记录数(空间换取时间).
更新:使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行.
连接池
创建连接和释放连接有很大开销( 尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的).可事先 创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销(空间换取时间).
C3P0,Proxool,DBCP,BoenCP,Druid.
DAO模式
Data Access Object是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。
在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的实现类来实现这个接口,在逻辑上该类对应一个特定的数据存储。
DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
事务
ACID是什么
原子性Atomic:事务中各项操作,要么全做要么全不做,其中一项操作的失败会导致整个事务的失败.
一致性Consistent: 应用系统从一个正确的状态到另一个正确的状态.正确的状态是指满足预定约束的状态.
隔离性Isolated:并发执行的事务 彼此无法看到对方的中间众泰.
持久性Durable :事务完成后所做的改动都会被持久化,即使发生错误,通过日志和同步备份也可以在故障发生后重建数据.
只有存在并发数据访问时才需要事务.多个事务访问同一数据时的问题:
3类数据读取问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新和第二类丢失更新)
脏读, 读取其他事务尚未提交的数据并在此基础上操作, 这个数据就是脏数据.
不可重复读,两次读取间隔中,该数据已被另一提交的事务修改过.
幻读:某一次读取得到的结果所表征的数据状态无法支撑后续的业务操作.例如: select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
第一类丢失更新:撤销时,把其他事务已提交的更新覆盖了.
第二类丢失更新:提交时,把其他事务已提交的更新覆盖了.
解决:
通过锁机制来解决数据并发访问问题,按锁定对象不同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁
数据库为用户提供了自动锁机制,只要用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来说都是透明的
JDBC如何进行事务处理
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务,当事务完成后用commit()显示提交事务.如果在事务处理 过程中发生异常则通过rollback()进行事务回滚.
从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。
JDBC处理Blob和Clob.
Blob指大二进制对象,Clob指大字符对象.
46.正则表达式
编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是记录文本规则的代码.
47.反射
获得一个类的类对象
方法1:类型.class,例如:String.class
方法2:对象.getClass(),例如:"hello".getClass()
方法3:Class.forName(),例如:Class.forName("java.lang.String")
通过反射创建对象
方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");
通过反射获取和设置对象私有字段的值
通过反射调用对象的方法
Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke("hello)); //output: HELLO
48.设计模式
设计模式是指一套被反复使用的代码设计经验的总结
是为了提高代码的可读性,复用性,健壮性.
三类 创建型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象化])
用java写一个单例类
饿汉式
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉式
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
49.什么是UML
统一建模语言Unified Modeling Language.是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持.
可帮助沟通和交流,辅助应用设计和文档生成.
有哪些常用的图
例图,类图,时序图,协作图,状态图,活动图,构件图,部署图
最重要:例图: 用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系
类图: 描述类以及类与类之间的关系,通过该图可以快速了解系统
时序图: 描述执行特定任务时对象之间的交互关系以及执行顺序,通过该图可以了解对象能接收的消息也就是说对象能够向外界提供的服务
50.算法
写一个冒泡排序
二分查找
JavaWeb和WebService
常用web服务器
Linux平台下使用最广泛的免费HTTP服务器是Apache服务器,而Windows平台的服务器通常使用IIS作为Web服务器
IIS
Kangle
WebSphere
WebLogic
Apache
Tomcat
Nginx
servlet和CGI区别
servlet处于服务器进程中,通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁.
CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet.( 以前CGI经常因为性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题, 事实上CGI技术还是有挺广的应用面)
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()
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet初始化,请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求队形的doGet或doPost等方法. 当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
转发forward和重定向redirect区别
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。(A找B要东西,B找C要来再交给A)
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源(A找B要东西,B让A自己去找C)
forward好处:更加高效,也有助于隐藏实际的链接;
但在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向
jsp有哪些内置对象及其作用
9个内置对象
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web应用的配置对象;
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象。
jsp与servlet
JSP页面其实是一个Servlet,能够运行Servlet的服务器(Servlet容器)通常也是JSP容器,可以提供JSP页面的运行环境
jsp侧重于视图,而Servlet侧重于控制逻辑
在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)
jsp四种作用域
page,request,session,application
- page代表与一个页面相关的对象和属性。
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
会话跟踪的实现
url重写: 在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。
设置表单隐藏域: 将和会话跟踪相关的字段添加到隐式表单域中,这些信息不会在浏览器中显示但是提交表单时会提交给服务器。
此两种方式很难处理跨多页面的信息传递.
cookie : 基于窗口的/存储于文件的 注意1不存放敏感信息 2cookie大小有限4k 3cookie数量有限,一个站点允许最多存放20个 4浏览器可禁用
HttpSession :
过滤器作用和用法:
截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤.
在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
用途:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
监听器作用和用法:
监听器是application,session,request三个对象创建,销毁或者往其中添加修改属性时自动执行代码的功能组件.
问题
明天计划
评论