Java2016年面试整理_第1页
Java2016年面试整理_第2页
Java2016年面试整理_第3页
Java2016年面试整理_第4页
Java2016年面试整理_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一 Java基础1. JVM(原理,加载过程)(1). Java类的加载是动态的:为了节省内存开销。它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。(2). Java的类加载器有三个,对应Java的三种类: BootstrapLoader / 负责加载系统类 ExtClassLoader /负责加载扩展类(就是继承类和实现类)AppClassLoader /负责加载应用类(程序员自定义的类)(3).类加载器协同工作,使用委托模型机制,当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载

2、入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。加载过程(1)装载:查找和导入class文件;(2)连接:a.检查:检查载入的class文件数据的正确性;b.准备:为类的静态变量分配存储空间;c.解析:将符号引用转换成直接引用(这一步是可选的)(3).初始化:初始化静态变量,静态代码块。这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为

3、一般程序的入口方法。类的构造器也会引发该动作。请描述一下JVM加载class文件的原理机制在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析 装载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间; 解析:将符号引用转成直接引用;初始化:激活类的静态变量,初始化Java代码和静态Java代码块单例模式为什么能保证只有一个实例存在原理在于它的构造函数是私有的,你不能去new 它,该单

4、例类里面已经实例化好了一个了,并且是static的,并提供一个获取该实例的方法!客户端只能通过该方法获取这个已经实例化好了的,这样就保证了只有一个实例存在!建立sql索引应该遵循什么原则索引字段建议建立NOT NULL约束经常与其他表进行连接的表,在连接字段上应该建立索引;经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;可选择性高的关键字 ,应该建立索引;可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:A、正确选择复合索引中的第一个字段,一般是选择性较好的且在whe

5、re子句中常用的字段上;B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;频繁DML的表,不要建立太多的索引;不要将那些频繁修改的列作为索引列;= 与 equals 的区别  基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boo

6、lean。他们之间的比较,应用双等号(=),比较的是他们的值。复合数据类型(类):当他们用(=)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(=)进行比较的,所以比较后的结果跟双等号(=)的结果相同。JSP页面的跳转? jsp页面实现跳转主

7、要有jsp:forward 和 sendRedirect 两种方法 jsp:forward:在本容器内跳转 。 跳转后,地址栏地址不变 。效率高。跳转后立即结束本页的内容。 sendRedirect:在容器之间的跳转,跳转后地址栏地址为跳转后的地址,效率较低。 通常采用jsp:forward方式跳转。 解释GLOBAL_NAMES设为TRUE的用途: GLOBAL_NAMES指明联接数据库的方式。如果这个参数设置为TRUE,在建立数据库链接时就必须用相同的名字连结远程数据库. 在Oracle数据库中,FUNCTION,PROCEDURE和PACKAGE区别function&

8、#160;是函数 有返回值procedure 是存储过程 无返回值package是一种将过程、函数和数据结构捆绑在一起的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。解释TABLE Function的用途TABLE Function是通过PL/SQL逻辑返回一组纪录,用于普通的表/视图。他们也用于pipeline和ETL过程。数据库1,2,3 范式的概念与理解1NF的定义为:符合1NF的关系中的每个属性都不可再分2NF:符合1NF,并且非主属性

9、完全依赖于码3NF:符合2NF,并且,消除传递依赖 码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。 解释冷备份和热备份的不同点以及各自的优点解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可

10、以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)解释归档和非归档模式之间的不同和它们各自的优缺点归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高.比较truncate和delete 命令解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动HWK,不需要 rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时间.使用索引的理由 数据库

11、索引是为了增加查询速度而对表字段附加的一种标识。首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。创建索引在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。1ALTER TABLEALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。ALTER TABLE table_name A

12、DD INDEX index_name (column_list)ALTER TABLE table_name ADD UNIQUE (column_list)ALTER TABLE table_name ADD PRIMARY KEY (column_list) 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。2CREATE INDEXCREATE IND

13、EX可对表增加普通索引或UNIQUE索引。CREATE INDEX index_name ON table_name (column_list)CREATE UNIQUE INDEX index_name ON table_name (column_list)table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。索引类型根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。唯一索引:不允许其中任何两行具有相同索引值的索引。主

14、键索引:在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。2垃圾回收机制(GC)(1)简单回答:Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存

15、空间而不是对象本身。System.gc(),Runtime.getRuntime().gc()用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。(2)什么时候会触发一个对象的回收?a.  对象没有引用b.   作用域发生未捕获异常c.    程序在作用域正常执行完毕d.   程序执行了System.exit()e.    程序发生意外终止(被

16、杀进程等)(3)垃圾回收算法a.引用计数器法: 在JDK1.2之前,使用的是引用计数器算法,即当这个类被加载到内存以后,就会产生方法区,堆栈、程序计数器等一系列信息,当创建对象的时候,为这个对象在堆栈空间中分配对象,同时会产生一个引用计数器,同时引用计数器+1,当有新的引用的时候,引用计数器继续+1,而当其中一个引用销毁的时候,引用计数器-1,当引用计数器被减为零的时候,标志着这个对象已经没有引用了,可以回收了。b. 根搜索算法:程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后

17、,剩余的节点则被认为是没有被引用到的节点,即无用的节点。目前java中可作为GC Root的对象有a.    虚拟机栈中引用的对象(本地变量表)b.    方法区中静态属性引用的对象c.    方法区中常量引用的对象d.    本地方法栈中引用的对象(Native对象)Java中存在四种引用:a. 强应用:只要引用存在,垃圾回收器永远不会回收;b. 软引用:非必须引用,内存溢出之前进行回收;c. 弱引用:第二次垃圾回收时回收;d. 虚引

18、用(幽灵/幻影引用):垃圾回收时回收,无法通过引用取对象值确定垃圾后,回收算法:a. 标记-清除算法标记-清除算法采用从根集合进行扫描,对存活的对象标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收。b. 复制算法复制算法采用从根集合扫描,并将存活对象复制到一块新的,没有使用过的空间中,这种算法当存活的对象比较少时,极为高效,但是带来的成本是需要一块内存交换空间用于进行对象的移动。c.    标记-整理算法-整理算法采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并

19、更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。JVM为了优化内存的回收,进行了分代回收的方式,高频访问新生代,低频访问老年代(大对象、长生命周期对象、以及新生代没有被回收的对象)。3多线程三种实现方式:(1).继承Thred类。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。1. p

20、ublic class MyThread extends Thread   2. public void run()   3.  System.out.println("MyThread.run()");  4.   5.   在合适的地方启动线程如下:1. MyThread myThread1 = new MyThread(); 

21、60;2. MyThread myThread2 = new MyThread();  3. myThread1.start();  4. myThread2.start();  (2).实现Runnable接口为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:1. public class MyThread extends OtherClass implements Runnable 

22、;  2. public void run()   3.  System.out.println("MyThread.run()");  4.   5.   为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:java view plain copy1. MyThread myThread = new MyThread(); &

23、#160;2. Thread thread = new Thread(myThread);  3. thread.start(); (3).使用java.util.concurrent包下的ExecutorService、Callable、Future实现有返回结果的多线程1.  / 创建一个线程池  2.    ExecutorService pool = Executors.newFixedThreadPool(taskS

24、ize);  3.    / 创建多个有返回值的任务  4.    List<Future> list = new ArrayList<Future>();  5.    for (int i = 0; i < taskSize; i+)   6.  

25、;   Callable c = new MyCallable(i + " ");  7.     / 执行任务并获取Future对象  8.     Future f = pool.submit(c);  9.     / System.out.p

26、rintln(">>>" + f.get().toString();  10.     list.add(f);  11.      12.    / 关闭线程池  13.    pool.shutdown();  14.   15.    /

27、0;获取所有并发任务的运行结果  16.    for (Future f : list)   17.     / 从Future对象上获取任务的返回值,并输出到控制台  18.     System.out.println(">>>" + f.get().toString();  19.

28、     concurrent 的优势:(1)管理一组相关线程非常有用,有效的减少竞争条件(race conditions)和死锁线程(2)有返回值的线程。(3)引入线程池,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。4. static关键字(1).作用:方便在没有创建对象的情况下来进行调用(方法/变量)。(2).静态方法:没有this,因为它不依附于任何对象,所以不能访问非静态成员变量和使用非静态成员方法,非静态成员方法/变量都是必须依

29、赖具体的对象才能够被调用,反之可以。(3).静态变量:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。static成员变量的初始化顺序按照定义的顺序进行初始化。(4).静态代码块:static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能(因为它的特性:只会在类加载的时候执行一次,可以将只需要进行一次的初始化操作都放在static代码块中进行)。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。5. 接口和抽象类的区别(1) 语

30、法层面上:a抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;b抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;c接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;d一个类只能继承一个抽象类,但可以实现多个接口。(2) 设计层面上a抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。b设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。6. 集合类(1)接口Set特点:元素不能重复HashSet:无序保存元素TreeS

31、et:有序保存元素LinkedHashSet:插入顺序保存(2)List特点:提供基于索引的对成员的随机访问ArrayList:提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好。LinkedList: 对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差。(3)Map特点:保存键值对成员HashMap:设计用来提供快速访问。TreeMap:有序排列关键字,没有HashMap快。LinkedHashMap:保持元素的插入顺序,但也通过散列表提供了快速访问能力。问题:1.Set集合如何保证对象不重复在java的集合中,判断两个对象是否相等的规则是判断两个对象的

32、hashCode是否相等,如果不相等,就认为是不相等的,否则,判断两个对象用equals运算是否相等。2.Hash的内部存储结构哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。这些元素是按照hash(key)%len的规则存储到数组中,也就是元素的key的哈希值对数组长度取模得到。(3) HashMap和HashTable的区别:a. HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。b.HashTable不允许有null值的存在。7. 重载、重写方法的重写 Overriding 和重载 Overlo

33、ading 是 java 多态性的不同表现;重写 Overriding 是父类与子类之间多态性的一种表现,重载Overloading 是一个类中多态性的一种表现。重写是子类覆盖父类的方法,方法名和参数都相同,重载是函数名相同,具有不同的参数个数/类型。8String、StringBuffer、StringBuilderString 的长度是不可变的;StringBuffer 的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要String,那么使用 StringBuffer 的 toString()方法;线程安全;String

34、Builder 是从 JDK 5 开始,为 StringBuffer 该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。8. final关键字当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。二 算法1 排序算法(4) .快排时间复杂度O(nlgn),不稳定public void quickSort(int arr,int start,

35、int end)if(start<end)int l=start,r=end,x=arrl;while(l<r)while(l<r&&arrr>=x)r-;if(l<r)arrl+=arrr;while(l<r&&arrl<x)l+;if(l<r)arrr-=arrl;arrl=x;quickSort(arr,start,l-1);quickSort(arr,l+1,end);(2).冒泡排序时间复杂度O(n2),稳定public void bubbleSort(int arr) for(int i=0;i<

36、arr.length-1;i+) for(int j=0;j<arr.length-1-i;j+) if(arrj>arrj+1) int temp=arrj; arrj=arrj+1; arrj+1=temp; (3).选择排序时间复杂度O(n2),稳定 public void selectSort(int a) for(int k=0; k<a.length-1; k+) int min = k; for(int i=k+1; i<a.length; i+) if(ai < amin) min = i; if(k != min) int temp = ak;

37、ak = amin; amin = temp; (4).堆排序时间复杂度O(nlgn),不稳定二叉堆满足二个特性:1父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。 (5).插入排序public void insertSort(int arr)for(int i=1;i<arr.length;i+)int cur = arri;int position = i;for(int j=i-1;j&

38、gt;=0;j-)if(arrj>cur)arrj+1=arrj;position-;elsebreak;arrposition=cur;三 计算机网络1. TCP传输协议TCP在传输之前会进行三次沟通,称为“三次握手”,传完数据断开的时候要进行四次沟通,称为“四次挥手”,理解这个过程需要理解TCP中的两个序号和三个标志位的含义:seq:所传数据的序号。TCP传输时每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接受完整了,如果没有接收完整就重新发送,保证数据的完整性。ack:确认号。接收端用它来给发送端反馈已经成功接受到的数据信息的,它的值为希望

39、接收的下一个数据包起始序列号,也就是ack值所代表的序号前面数据已经成功接收到了。ACK:确认位,只有ACK=1的时候ack才起作用。正常通信时ACK=1,第一次发送请求时因为没有需要确认接收的数据所以ACK为0.SYN:同步位,用于在建立连接时同步序号,刚开始建立连接时并没有历史接收的数据,所以ack也没法设置,这时按照正常的机制就无法运行了,SYN的作用就是解决这个问题的,当接收端收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,这样正常的机制就可以运行了,因此SYN也叫同步位。FIN:终止位,用来在数据传输完毕后释放连接。问题:为什么要三次握手?两次行不行?为什么?为了

40、保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。2. http的get和post方法区别(1)get是从服务器上获取数据,post是向服务器传送数据。 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。 (2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 (3) GE

41、T方式提交的数据最多只能有1024字节,而POST则没有此限制。 (4)安全性问题。使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。 四 数据库1. 连接查询a.外连接可分为:左连接、右连接、完全外连接。左连接  left join 或 left outer join左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).select FirstNa

42、me,LastName,City,State from Person left join Address on Person.PersonId=Address.PersonId;select Name from Customers c left join Orders o on c.Id=o.CustomerId where o.id is null;右连接  right join 或 right outer join右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。完全外连接  full join 或 f

43、ull outer join完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。b.内连接  join 或 inner joinSQL语句:select * from student inner join course on student.ID=course.IDinner join 是比较运算符,只返回符合条件的行。select E1.Name from Employee E1 inner join Employee

44、 E2 on E1.ManagerId = E2.Id and E1.Salary > E2.Salary ;delete p1 from Person p1 inner join Person p2 on p1.Email = p2.Email and p1.Id>p2.Id;select w1.Id from Weather w1 inner join Weather w2 on TO_DAYS(w1.Date)=TO_DAYS(w2.Date)+1 and w1.Temperature>w2.Temperature;c.leetcode例题select max(Sala

45、ry) from Employee where Salary<(select max(Salary) from Employee);select Email from Person group by Email having count(*)>1;五.设计模式(1).单例模式public class Singleton private static Singleton st = new Singleton();private Singleton()public static Singleton getInstance()return st;/类中其他方法,尽量是staticpubl

46、ic static void doSomething()六.框架1. 谈谈你mvc的理解MVC是ModelViewControler的简称。即模型视图控制器。MVC是一种设计模式,它把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器它们分别担负着不同的任务。视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性。控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的

47、结果调用相应的视图来显示处理的结果。MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。2. 项目中为什么使用SSH(1). 使用Struts是因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。(2). 使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架,能够方便的使用面向对象的方式来操作数据库。hibernate是个轻

48、量级的持久性框架,功能丰富。(3). 使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理 (Transcation Managment),等等。3. Struts工作流程:(1)客户端浏览器发出HTTP请求.(2)根据web.xml配置,该请求被FilterDispatcher接收(3)根据struts.xml配置,找到

49、需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton(4)Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。(5)Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。(6)返回HTTP响应到客户端浏览器。4.  Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?(1)hibernate自带的分页机制:获得Session对象后,从Session中获得Query对象。用Query.setFirstResult():设置要显示的第一行数据, Query.s

50、etMaxResults():设置要显示的最后一行数据。(2)不使用hibernate自带的分页,可采用sql语句分页,如:5:为每页显示的记录,2为当前页: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);5. Hibernate介绍Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可

51、以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Se

52、ssion对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一

53、个SessionFactory。Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。6.缓存管理Hiber

54、nate 中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。1. 一级缓存和二级缓存的比较:第一级缓存 第二级缓存 存放数据的形式 相互关联的持久化对象 对象的散装数据 缓存的范围 事务范围,每个事务都有单独的第一级缓存进程范围或集群范围,缓存被同一个进程或集群范围内的所有事

55、务共享 并发访问策略由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别 数据过期策略没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间 物理存储介质内存内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。缓存的软件实

56、现 在Hibernate的Session的实现中包含了缓存的实现由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。启用缓存的方式只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBCAPI来执行指操作。用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使

57、用第二级缓存。只有为某个类或集合配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。 用户管理缓存的方式第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。 第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。2. 一级缓存的管理: 当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法:evict

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论