首页 > java复***纲(精华版)
头像
远无敌
编辑于 2018-09-28 10:35
+ 关注

java复***纲(精华版)

0.java的IO内容(java编程思想)
1.java的集合框架(java编程思想)
2.java的多线程机制(java编程思想)
3.tcp/ip协议,特别的其中的http协议这一块(计算机网络,http权威指南)
4.hibernate(JPA Spring +DATA)(精通HIbernat)
5.spring (基本讲代码的书)
6.spring mvc(跟开涛学MVC)
7.mybatis(课件和下载的那本书)
8.sql数据库这一块。如隔离级别,并发的问题,表链接,子查询,分页
9.具体的业务:增删改查,分页,带查询条件的分页
10.javaweb的三大组件:Servlet Filter Listener
11.Servlet域对象,jsp的隐含对象,EL表达式的隐含对象
12.JDBC这一块,statement prepratedstatemtn callablestateme.....
13.JVM相关的,内存管理,垃圾回收,各种引用的类型,垃圾回收的算法和回收器类型
14.javascript相关的,基础和使用

16.json的处理
17.单例模式
18.事务的性质
20.webservice json ajax
21.String的内存模型
String.intern();
22.==比较的是什么?java的对象在内存中的存放方式?
23.jvm常量池和class文件的常量池
24.多线程的知识
25.sql优化的内容
26.数据库的各种知识
27.线程 集合 io的知识

28.十个Spring mvc注解 十个linux常用命令 nosql中的redis的常见类型***作 git的常见***作 十个常见异常 常用的String的方法
数据库事务的acid属性 事务的隔离级别 事务并发是会出现的问题
29.maven 和 svn
30.linux的常见用法
31.String的内存分析 static final 的内存分析

32.报表和excel  上传下载功能 调度管理功能 石英调度  短信接口 邮件接口 rpc 远程访问

33.webservice git log 远程调用 权限框架

34.crm p2p linux marven协议就是固定的
35.看表的关系主要是看表的主外键关系

36.堆内存里面的对象是怎样管理的呢?
37.String 的 intern()
38.OpenSessionInView
39.JNDI?

40.重写的机制
41.在局部变量上的对象的内存分配?
42.Callable接口
43.维护匿名内部类访问final呢?
44.虚假唤醒的问题?

45.性能优化的方方面面?数据库索引 负载均衡 前端 jvm linux服务器?
46.多种引用的类型


数据库MySQL的性能调优,如何用二维表储存无限扩展的树树结构

不同请求方式对于请求成功的意义如下:

GET: 已经取得资源,并将资源添加到响应的消息体中。
HEAD: 响应的消息体为头部信息。
POST: 响应的消息体中包含此次请求的结果。
TRACE: 响应的消息体中包含服务器接收到的请求信息。

PUT 和 DELETE 的请求成功通常并不是响应200 OK的状态码而是 204 No Content 表示无内容(或者  201  Created表示一个资源首次被创建成功)。

描述MVC设计模式(以Java为例)
mvc设计模式在Java应用中主要体现在讲应用以view、controller、model的层次进行分离,以简单的应用为例就是view(html,jsp)提交一个请求,
controller(servlet)接受请求发给model(业务处理类)进行处理, 最终model将处理的结果返回给controller,然后由controller输出请求结果。
这种模式对开发团队开发有很大的好处,不同的人可以专注去做不同的事情,最终大家一起形成一个完整应用,对开发人员的要求也逐步降低,降低了人力成本。

TCP和UDP区别是什么?
(1). TCP是面向连接的,而UDP是无连接的,区别大致如下:
a. UDP传送的数据单位协议是UDP,TCP传送数据单位的协议是TCP。
b. UDP发送数据之前是不需要建立连接,因此减少了开销和发送之前的时延。
c. TCP提供的是面向连接的服务,不提供广播和多播服务。
(2) 对方的运输层在收到UDP报文后,不需要给出任何确认。 TCP则需要确认。
(3) UDP没有拥塞控制的,它不保证可靠交付;TCP要提供可靠的,面向连接的运输服务。
(4) UDP用户数据报只有8个字节的首部开销,比TCP的20个字节的首部要少。

5. 简述XML在日常开发中的应用?使用XML有哪些优缺点?解析XML文档有哪几种方式?

(1) 用来作为一些配置文件,struts.ibatis,spring 等等。
(2) 作为数据的载体,比较在webservice,Ajax运用中都会用来传递一下数据。
a. 要求web客户机在两个或多个不同的数据库之间传递信息的应用。
b. 要求web客户机把同一数据以不同的表现方式提供给不同的用户应用。
优点:
a. XMl允许各种不同的专业开发和字节的特定领域有关的标记语言,这就使得该领域的人员交流变得可行。
b. XmL具有良好的保值性(数据丢失主要原因是没有人写出如何读取历史数据的节制和文档格式)。
c. 应用间交换数据。

解析的方法:

a.多数解析器提供了至少两种API,通常是一个对象模型API和一个事件API(也称为流API)  DOM / JDOM
b. 第二种是事件API,比如SAX,JAXP。

DOM和SAX的区别:
(1) DOM 文档对象类型。 为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻
内存的树结构,然后代码就可以使用DOM接口来***作这个树结构。
优点:整个文档树在内存中,便于***作; 支持修改,删除,和重新排等多种***作。
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间。
使用场合: 一旦解析了文档还需要多次访问这些数据;硬件资源充足(内存,CPU等)。

(2) 为解决DOM的问题出现了SAX; 事件驱动型,当解析器发现元素开始,元素结束,时发事件,响应事件。
优点: 不用事先加载整个文档,占用资源少;
缺点: 不是持久的;事件过后,若没有保存数据,那么数据就丢了。
无状态行: 从时间汇总只能得到文本,但不知道该文本属于哪个元素。
使用场合: 只需要XML文档的少量类容,很少回头访问;机器内存少。

6. servlet的生命周期
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对
应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。



8.什么是WebService

(1) Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务,
它是一种构建应用程序的普遍模型,可以在任何支持网络通信的***作系统中实施运行;
它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。
(2)Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.
Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。

在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
1.XML:描述数据的标准方法.
2.SOAP:表示信息交换的协议.
3.WSDL:Web服务描述语言.
4.UDDI:找到服务驱动器的的方法;
WebService的主要目标是跨平台的可互***作性。

为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互***作的、分布式应用程序的新平台。

9. Hibernate中get()和load()区别
1.从返回结果上对比load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常;get方法检索不到的话会返回null
2.hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用***来延迟加载,如果在使用过程中发现了问题,只能抛异常;
而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

10 将123 转换成321的编程

int num1 = 123,num2 = 0;
int tmp  = 100;
while(num1 != 0)
{
num2 += num1 %10 * tmp;
后面求个位和十位 相加即可。
}

11. Hibernate 有几级缓存,各有什么用?
有两级缓存,作用如下:
a. 减少数据库的反复问频率,提高访问性能。
b. 保证缓存中的对象和数据库中同步,位于缓存中的对象称为持久化对象。
c. 当持久化对象之间存在关联时,Session保证不出现对象图的死锁。



12. 当有百万用户来访问一个网站时,用什么来优化? 请描述。

a. 考虑使用服务器负载均衡。
b. 存储设备可以使用服务器集群。
c. 尽量避免使用MS SQL server.


13.  序列化有什么用?
系列化是一种用来处理对象流的机制, 所谓对象流也就是将对象的内容进行流化。可以对流化后的对象那个进行读写***作。
也可以将流化后的对象传输与网络之间。 序列化解决了对象流进行读写***作时引发的问题。



17 Struts1.* 和Struts2.*的区别。
a. 在Action实现类方面: Struts1要求Action继承一个抽象基类;struts2可以实现一个Action接口,它也会提供一个ActionSupport基类实现接口。
b. 线程方面: Strtus1 Action是单例模式并且必须是线程安全,因为仅有Action的一个实例来处理所有的请求。
Struts2 Action为每一个请求产生一个实例,因此没有线程安全问题。
3. Servlet依赖方面: struts1 Action依赖ServletAPI(因为struts1 Action的execute方法中有request,response方法)
struts2 Action不再依赖Servlet API,从而允许Action脱离Web容器。

B+树是一个平衡的多叉树。B+树从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动。

哈希索引采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置。

两者的区别:

哈希索引的优势:

(1)等值查询。哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)

哈希索引不适用的场景:

(1)不支持范围查询

(2)不支持索引完成排序

(3)不支持联合索引的最左前缀匹配规则

MySQL中,只有HEAP/MEMORY引擎才显示支持哈希索引。而常用的InnoDB引擎中默认使用的是B+树索引,它会实时监控表上索引的使用情况,如果认为建立哈希索引可以提高查询效率,则自动在内存中的“自适应哈希索引缓冲区”建立哈希索引(在InnoDB中默认开启自适应哈希索引),通过观察搜索模式,MySQL会利用index key的前缀建立哈希索引,如果一个表几乎大部分都在缓冲池中,那么建立一个哈希索引能够加快等值查询。

注意:在某些工作负载下,通过哈希索引查找带来的性能提升远大于额外的监控索引搜索情况和保持这个哈希表结构所带来的开销。但某些时候,在负载高的情况下,自适应哈希索引中添加的read/write锁也会带来竞争,比如高并发的join***作。like***作和%的通配符***作也不适用于自适应哈希索引,可能要关闭自适应哈希索引。

链表排序(快排)
*/
import java.util.*;
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null)
return null;
quickSort(head,null);
return head;
}
public void quickSort(ListNode head,ListNode end){
if(head==null || head==end)
return ;
ListNode curNode=partition(head,end);
quickSort(head,curNode);
quickSort(curNode.next,end);
}
public ListNode partition(ListNode head,ListNode end){
ListNode cur=head;//从head到cur小于目标值得,cur到nextNode大于目标值
ListNode nextNode=head.next;
int target=head.val;
while(nextNode!=end){//交换,cur得下一个指针与nextNode值交换,因为cur对应的值肯定小于目标值
if(nextNode.val<target){
cur=cur.next;
int t=cur.val;
cur.val=nextNode.val;
nextNode.val=t;
}
nextNode=nextNode.next;//cur不动,nextNode移动,所以cur到nextNode中间的值都大于目标值
}
if(cur!=head){//如果cur位置改变了,交换目标值与cur对应的值
int t=cur.val;
cur.val=target;
head.val=t;
}
return cur;
}
}


排他锁(Exclusive Lock)
排他锁(Exclusive Lock) ,   简称X锁。

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

规则1:写一个数据之前加X锁, 事务提交之后释放该X锁。

共享锁(Share lock)
共享锁(Share lock) ,简称S锁, 这个锁和之前的排他锁X锁有区别, 主要用于读取数据。

如果一个数据加了X锁, 就没法加S锁,没法再加X锁。

如果一个数据加了S锁, 就可以加S锁,没法再加X锁。

规则1:读一个数据之前加S锁, 读完之后立刻释放该S锁。

规则2:读一个数据之前加S锁, 事务提交之后立刻释放该S锁。


1、锁的两种分类方式

(1)从数据库系统的角度来看,锁分为以下三种类型:

独占锁(Exclusive Lock)
独占锁锁定的资源只允许进行锁定***作的程序使用,其它任何对它的***作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。
共享锁(Shared Lock)
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
更新锁(Update Lock)
更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据***作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

(2)从程序员的角度看,锁分为以下两种类型:

悲观锁(Pessimistic Lock)
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

乐观锁(Optimistic Lock)
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证***作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
在乐观锁中,我们有3种常用的做法来实现:

a. 在数据取得的时候把整个数据都copy到应用中,在进行提交的时候比对当前数据库中的数据和开始的时候更新前取得的数据。
当发现两个数据一模一样以后,就表示没有冲突可以提交,否则则是并发冲突,需要去用业务逻辑进行解决。

b. 版本戳:乐观锁的做法就是采用版本戳,这个在hibernate中得到了使用。
采用版本戳的话,首先需要在你有乐观锁的数据库table上建立一个新的column,比如为number型,当你数据每更新一次的时候,版本数就会往上增加1。
比如同样有2个session同样对某条数据进行***作。两者都取到当前的数据的版本号为1,当第一个session进行数据更新后,在提交的时候查看到当前数据的版本还为1,和自己一开始取到的版本相同。就正式提交,然后把版本号增加1,这个时候当前数据的版本为2。当第二个session也更新了数据提交的时候,发现数据库中版本为2,和一开始这个session取到的版本号不一致,就知道别人更新过此条数据,这个时候再进行业务处理,比如整个Transaction都Rollback等等***作。
在用版本戳的时候,可以在应用程序侧使用版本戳的验证,也可以在数据库侧采用Trigger(触发器)来进行验证。不过数据库的Trigger的性能开销还是比较的大,所以能在应用侧进行验证的话还是推荐不用Trigger。

c. 时间戳:第三种做法和第二种做法有点类似,就是也新增一个Table的Column,不过这次这个column是采用timestamp型,存储数据最后更新的时间。
在Oracle9i以后可以采用新的数据类型,也就是timestamp with time zone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的,精确到微秒(还没与到纳秒的级别),一般来说,加上数据库处理时间和人的思考动作时间,微秒级别是非常非常够了,其实只要精确到毫秒甚至秒都应该没有什么问题。
和刚才的版本戳类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中,也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中。

更多模拟面试

全部评论

(20) 回帖
加载中...
话题 回帖