整理的一些java面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整理的一些java面试题相关的知识,希望对你有一定的参考价值。

Java类型:8种基本类型,3种引用类型;
基本类型 : Byte short int long float double char boolean
字节长度 : 1 2 4 8 4 8 2 1
引用类型 : 类,接口,数组

简述你所知道的JAVA修饰符及各自的使用机制:

Abstract:修饰类,会使这个类称为抽象类,这个类将不能生成对象实例,但可以作为对象变量声明的类型,需要子类继承并覆盖其中的抽象方法。 修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,需要子类继承实现(覆盖)

Final:修饰的变量会变成常量(一旦赋值不能改变(可以在初始化时直接赋值,也可以在构造方法里面赋值)) 修饰的方法将不能被其子类覆盖,保持方法的稳定不能被覆盖。 被修饰的类将不能被继承。Final类中的方法也都是final的。

Synchronized:是java中的关键字,是一种同步锁。修饰对象有以下几种:
1.修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括
号{}括起来的代码,作用的对象是调用这个代码块的对象;
2.修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法, 作用的对象是调用这个方法的对象;

  1. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个 类的所有对象;
    4.修饰一个类,其作用的范围是synchronized后面括起来的部分,作用主的
    对象是这个类的所有对象
    Super:这项自己父类对象的一个指针

String、StringBuffer、StringBuilder之间的区别,简述各自的执行效率
答:String类的声明是:public final,而且,String类中使用字符数组保存字符串,如下:因为有‘final’修饰符,所以可以知道String对象是不可变的。
private final char value [ ] ;
所以是改变不了的,如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串。
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
静态变量和实例变量的区别?
答:在语法定义上的区别:静态变量前要加static关键字,而实例变量前不加。
在程序运行时的区别:静态变量从属与类,实例变量从属与对象。
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量即类变量,只要程序加载了类的字节码文件,不用创建
任何实例对象,静态变量就会被分配空间,即可使用
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
是否可以从一个static方法内部发出对非static方法的调用?
答:不可以,因为非static方法要与对象关联在一起,必须创建一个对象后,才可以在该对象上进行方法的调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,一个static方法被调用时,可能还没有创建任何实例对象,所以,一个static方法内部不可以发出对非static方法的调用。

全局变量和局部变量的区别:
1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等。
2.内存存储方式不同:全局变量存储在全局数据区(堆)中,局部变量存储在栈区。
3.生命周期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不纯在了
4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。(函数内部会优先使用局部变量再使用全局变量)

你所知道的集合类都有哪几类?主要区别有哪些并简单描述
List,Set继承了Collection接口,map没有继承collection
(Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。?
注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。?)

List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复,重复元素会被覆盖掉(注意:元素虽然无放入顺序,但是元素在set中的位置是由该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表数据结构实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList:底层基于动态数组的数据结构实现。
ArrayList和Vector的区别:ArrayList是非线程安全的。效率高;Vector是基于线程安全的,效率低
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null

介绍你所知道的J2EE中常用的设计模式,并简单介绍工厂模式

单例模式、工厂模式、包装模式、代理模式等
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类。该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

一、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

线程和进程的区别?实现多线程的方式有哪几种?如何实现多线程
一个程序至少有一个进程,一个进程至少有一个线程。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。
前两种方式启动的线程没有返回值,启动后与主线程没有任何关系,主线程也不知道子线程是否执行结束;后一种方式线程有返回值,启动后主线程可以根据线程对象来判断显示是否结束以及获取线程执行结果,前者多用于,当执行一个主要任务时需要执行一个辅助耗时任务,但是主任务并不关心辅助任务是否执行成功,执行成功的结果是什么,后者多用于执行主任务时需要执行一个耗时的辅助任务,但是主任务的执行结果或者执行流向依赖于辅助任务的执行结果。

线程同步的方法(类里有哪些方法来支持线程同步)

为何要使用同步??
??? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),?
??? 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,?从而保证了该变量的唯一性和准确性。

同步方法的7种方式(也有的说5种,没有最后面两种)
(参考博客: http://www.cnblogs.com/XHJT/p/3897440.html)
1.同步方法?
??? 即有synchronized关键字修饰的方法。?
??? 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,?
??? 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
2.同步代码块?
??? 即有synchronized关键字修饰的语句块。?
??? 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
3.使用特殊域变量(volatile)实现线程同步
??? a.volatile关键字为域变量的访问提供了一种免锁机制,?
??? b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,?
??? c.因此每次使用该域就要重新计算,而不是使用寄存器中的值?
??? d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量?
4.使用重入锁实现线程同步
??? 在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。?
??? ReentrantLock类是可重入、互斥、实现了Lock接口的锁,?
??? 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力

??? ReenreantLock类的常用方法有:
??????? ReentrantLock() : 创建一个ReentrantLock实例?
??????? lock() : 获得锁?
??????? unlock() : 释放锁?
5.使用局部变量实现线程同步?
??? 如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,?
???副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响
6.使用阻塞队列实现线程同步
7.使用原子变量实现线程同步

Error和Exception有什么区别
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等,对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception),运行时异常:ArithmaticException(算术异常),IllegalArgumentException(非法参数异常),编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try...catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

Integer与int的区别?
1.Int是java提供的8种基本数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的包装类。
2.Int的默认值是0,而Integer的默认值是null。
3.声明Integer的变量需要实例化,而声明为int的变量不需要实例化;
4.Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值.

Final Finally Finalize的区别:
(参考:http://blog.csdn.net/lichaohn/article/details/5424519)
Final :用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
Fianlly :异常处理语句结构的一部分,表示总是执行。
Finalize:是Object类的一个方法,在垃圾收集器(GC)执行的时候会调用被回收对象的此方法。

重写和重载的区别?
重写是子类的方法重写父类的方法,要求方法名和参数都相同。重载是在同一个类中,方法名相同,参数列表不同,(方法体也不同),最常见的重载的例子就是类的构造函数。
重写方法的规则:
1.参数列表必须完全与被重写的方法相同,否则不能称其为重写,而是重载.
2.返回的类型必须一直与被重写的方法的返回值类型相同,否则不能称其为重写,而是重 载.
3.访问修饰符的限制一定要大于被重写方法的访问修饰符
4.重写方法一定不能抛出新的检查异常或者比如被重写方法申明更加宽泛的检查型异 常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法时就 不能抛出Exception,只能抛出IOException的子类异常。
重载的规则:
1.方法名相同,参数列表不同;
2.可以有不同的返回类型,只要参数列表不同即可;
3.可以有不同的访问修饰符;
4.可以抛出不同的异常;
所谓子类方法重写父类方法遵循“两同两小一大”的规则
两同:
1)方法名 2)形参列表
两小:
1)返回值类型比父类更小或相等 2)异常比父类方法更小或相等
一大:
子类权限比父类大或相等

1.什么是事务:
事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。
2.事务特性:
事务特性分为四个:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)简称ACID。
1.原子性(Atomicity):事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
2.一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
3.隔离性(Isolation):一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
4.持续性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
JDBC的操作步骤:
加载驱动,建立连接; 创建语句对象,执行SQL语句; 处理结果集; 关闭连接.

什么是序列化?
序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。
什么是反序列化?
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
为什么需要序列化?转换为二进制串后才好进行网络传输嘛!为什么需要反序列化?将二进制转换为对象才好进行后续处理

Statement和PreparedStatement
1.它们的联系
都是用来执行SQL的
PreparedStatement extends Statement
2.它们的区别
Statement适合执行静态(无条件)SQL
PreparedStatement适合执行动态(有条件)SQL

PreparedStatement优点:
(1)提高效率
(2)防止SQL注入
(3)批量更新时减少次数,提高效率。

(PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)
3.Statement原理(理解)

JDBC对分页的支持
1.假分页(内存分页)
?第1次查询时获取所有数据,并将其存入内存(List)
?第N次查询时不再访问数据库,而是从内存中(List)取数
?特点: 第1次查询巨慢,再次查询快,耗内存
适合数据量很小的小项目
2.真分页(物理分页)*
?每次查询时都是获取一页的数据
?使用分页的SQL进行查询
?特点: 每次查询速度都一样,不耗内存
?适合任意的项目

abstract class和interface有什么区别?
(可参考:http://blog.csdn.net/b271737818/article/details/3950245
接口是完全抽象的抽象类;
1、abstract类可以有包含实体的方法 但是接口不可以
2、接口定义的变量都是final的 而abstract类定义的可以不是final的
3、abstract类可以通过get....()方法实现类的实例 但是接口不可以
4、“抽象类”是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能。

TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

JDBC: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC的操作步骤,正确的顺序是
加载驱动,建立连接; 创建语句对象,执行SQL语句; 处理结果集; 关闭连接.
JDBC的访问步骤?
1)注册驱动,
2)获取连接
3)获取statement对象
4)获取结果集
5)关闭Connection
import java.sql.*;
public class TestSelect {
/**建立与数据库的连接

  • 目标IP: 172.16.0.203
  • SID: orcl
  • 用户名和密码 openlab open123
    **/
    public static void main(String[] args) {
    Connection con = null;
    try{
    //将ojdbc6.jar资源载入类加载器
    //注册驱动类
    Class.forName("oracle.jdbc.OracleDriver");
    //编写一个连接字符串
    String url = "jdbc:oracle:thin:@172.16.0.203:1521:orcl";
    //获取Connection对象,getConnection(连接字符串,用户名,密码)
    con = DriverManager.getConnection(url,"jsd1402","jsd1402");
    //执行select语句
    String sql ="select empno,ename,sal from emp order by sal";
    //获取Statement
    Statement stat = con.createStatement();
    //执行select语句获取查询结果
    ResultSet rs = stat.executeQuery(sql);
    //遍历rs结果数据
    while(rs.next()){
    int empno = rs.getInt("empno");
    String ename = rs.getString("ename");
    double sal = rs.getDouble("sal");
    System.out.println(empno+" "+ename+" "+sal);
    }
    }catch(Exception ex){
    ex.printStackTrace();
    }finally{
    try {
    con.close();//释放连接资源
    } catch (SQLException e) {
    }
    }
    }
    }

Spring:开源的,用来简化企业级应用开发的轻量级的应用开发框架
1.简化开发:Spring对常用的api(比如jdbc)做了封装,这样,可以大大简化
这些api的使用。(比如使用springjdbc访问数据库,就不用考虑如何
获取连接和关闭连接了)。
2.解耦:Spring帮我们建立对象之间的依赖关系,这样,对象之间的耦合度
会大大降低,代码的维护性会大大提高。
3.集成其他框架:Spring可以将其它的一些框架集成进来(比如用于定时任务处理的Quartz 等),方便这些框架的使用。

2.Spring容器
(1)什么是Spring容器?
Spring框架中的一个核心模块,用于管理对象。

SpringMVC:用来简化基于MVC架构的web应用程序开发的框架。
注:SpringMVC是spring中的一个模块。

有五大组件
1)有哪五大组件?
DispatcherServlet 前端控制器
HandlerMapping 映射处理器
Controller 处理器
ModelAndView
ViewResolver 视图解析器
2)它们之间的关系
a.请求发送给DispatcherServlet来处理,DispatcherServlet
会依据HandlerMapping的配置调用对应的Controller来处理。
b.Controller将处理结果封装成ModelAndView,然后返回给
DispatcherServlet。
c.DispatcherServlet会依据ViewResolver的解析调用对应的
视图对象(比如jsp)来生成相应的页面。

何时使用Spring?
当需要管理JavaBean对象时就可以使用,Spring是最简洁的对象管理方案之一。
Spring框架中bean规范?
JavaBean
1)必须有package
2)有无参数构造器
3)实现序列化接口
4)实现get,set方法
1.Spring框架的作用和好处
Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,
增强系统的可维护和可扩展性。
在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。
利用AoP机制实现事务管理、以及共通功能的切入等。
功能是整合,好处是解耦。

1、什么是IOC
    Inversion of Control,
    控制反转,是一种解耦的设计思想。其目的是让业务代码交出对象创建的控制权,由原先的主动创建对象变为被动接受注入的对象,
    即由Spring来负责创建对象,并注入给业务代码。由于Spring采用XML来配置组件以及组件的关系,所以可以将关联组件解耦。
2、Spring IOC实现原理
    Spring采用DI(Dependency Injection)技术来实现IOC,即采用依赖注入来实现了IOC。
    Spring允许我们在配置文件声明组件时,指定当前组件所依赖的组件,然后在使用Spring容器创建当前组件时,
    它会先创建依赖的组件并注入给当前组件。

1.依赖注入DI(补充)
*a.setter方式注入使用方法(推荐)
<bean id="jdbcDataSource" class="com.tarena.dao.JdbcDataSource">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.0.26:1521:tarena" />
<property name="user" value="openlab" />
<property name="pwd" value="open123" />
</bean>
<bean id="userDao" class="com.tarena.dao.OracleUserDao">
<property name="dataSource" ref="jdbcDataSource"></property>
(了解)b.构造方式注入使用方法(参考Test1示例)
---在使用一方定义一个接口类型变量,添加一个带参数的构造方法
---在applicationContext.xml的Bean定义中指定注入配置
public Phone(CPU cpu,SIM sim){...}
<bean id="" class="">
<constructor-arg index="参数索引0 有参构造器的第一个参数" ref="Bean组件id值"/>
<constructor-arg index="0" ref="cpu"/>
<constructor-arg index="1" ref="sim"/>
</bean>
<bean id="cpu" class="com.tarena.CPU"/>
<bean id="sim" class="com.tarena.SIM"/>

springmvc工作流程

常用注解有什么?都怎么使用?
1)在applicationContext.xml中,开启对注解
的自动扫描。
<context:component-scan base-package="com.tarena"/>br/>开启自动扫描后,当Spring容器初始化时,它会自动的扫描这个包下所有类中的注解,并将注解配置过的bean纳入到Spring容器中,
当程序执行时,就可以使用Spring容器来创建这个bean了。
2)使用注解配置bean
a、在类上使用注解,标识该类是一个组件,
它将被Spring容器管理
@RequestMapping("/notebook")
@ResponseBody注解,将Controller方法返回值做成json输出。
br/>@Controller控制器,用于标识Action组件,控制层组件注解
@Service服务,用于标识一个业务组件,业务层组件注解
br/>@Resource标识属性
private String driver;
@Value("#{jdbc.url}")

            标识属性(@Autowired)
                @Autowired
                @Qualifier("jdbcCostDao")
            @Repository存储,用于标识DAO组件,持久化层组件注解
            @Component用于标识其他的通用组件,通用注解
            @Named  作用同上,通用注解,sun公司提供的,需要导包才可用。
        b、
        指定组件的作用域
        通常受Spring管理的组件,默认的作用域是“singleton”。如果需要其他的作用域可以使用@Scope注解,只要在注解中提供作用域的名称即可

        在类上使用注解,标识对象的创建方式
            @Scope("singleton")

<mapper namespace="com.tarena.entity.DeptMapper">
<select id="findDeptById"
resultType="com.tarena.entity.Dept"
parameterType="java.lang.Integer">
select deptno, dname, loc from robin_dept
where deptno=#{deptno}
</select>
/*自定义注解,用来标识DAO接口,MapperScannerConfigurer会自动扫描带有这个注解的接口。/
public @interface MyBatisRepository {
}

Mybatis:(1)MyBatis是什么?
开源的持久层框架。
注:MyBatis底层仍然是jdbc。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射

工作原理:

  1. 返回Map类型的结果
    (1) MyBatis会将记录中的数据先放到一个Map对象里面
    (以字段名作为key,以字段值作为value,一条记录对应一个Map对象),
    然后 再将Map中的数据放到对应的实体对象里面。

(2)返回Map类型的结果,好处是不用实体类了,但是不方便
(因为要获得字段值,还需要调用Map对象提供的get方法,
注意,oracle数据库中,字段名统一都是大写)。
3.解决字段名与实体类的属性名不一致
(1)方式一 使用别名。(就是让别名与属性名一样)。
(2)方式二 使用resultMap解决。

Ajax: (asynchronous javascript and xml 异步的javascript和xml)
(1)ajax是什么? 是一种创建交互式网页应用的网页开发技术
是一种用来改善用户体验的技术,本质上是利用浏览器提供的一个
特殊对象(XMLHttpRequest对象,一般也可以称之为ajax对象)向
服务器发送异步请求;服务器返回部分数据,浏览器利用这些数据
对当前页面做部分更新;整个过程,页面无刷新,不打断用户的操作。
注:
异步请求,指的是,当ajax对象发送请求时,浏览器不会销毁
当前页面,用户仍然可以对当前页面做其它操作。

(a. Ajax应用程序的优势在于?

  1. 通过异步模式,提升了用户体验
  2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
    b. AJAX最大的特点是什么?
    Ajax可以实现动态不刷新(局部刷新) 就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。)
    (3)ajax对象的几个重要属性
    onreadystatechange: 绑订事件处理函数,用来处理readystatechange事件。
    注:当ajax对象的readyState属性值发生了任何的改变,比如
    从0变成了1,就会产生readystatechange事件。
    readyState:有5个值(分别是0,1,2,3,4),用来获取ajax对象与服务
    器通信的进展。其中,4表示ajax对象已经获得了服务器返回的所有的数据。
    responseText:获得服务器返回的文本数据。
    responseXML:获得服务器返回的xml数据。
    status:获得状态码。
    ajax优点:
    (1)改善用户的体验:页面无刷新,不打断用户的操作。
    (2)提升程序的性能:按需要获取数据,客户端(浏览器)与服务器端之间数据传输大大减少。(不再需要返回一个完整的新的页面,只需要返回部分的数据)
    (3)一种标准化的技术:不需要用户下载任何的插件。(有些类似ajax的技术,比如Flex,是需要下载插件的)。
    (4)缓存问题
    a,当发送get请求时,ie浏览器内置的ajax对象会检查请求地址是否访问过,如果访问过,则不再向服务器发送请求。
    b,解决方式:
    方式一,在请求地址后面添加一个随机数,比如:
    xhr.open(‘get‘,‘getNumber.do?‘ + Math.random(),true);
    方式二,使用post方式发请求。
    (5) 编码问题
    1)发送get请求
    ie浏览器内置的ajax对象会使用"gbk"对参数值进行编码,而其它浏览器内置的ajax对象会使用"utf-8"编码。
    服务器端会使用"iso-8859-1"解码。这样,会出现乱码问题。
    解决方式:
    step1,要让服务器对于get请求发送过来的数据进行正确地解码(按照指定的编码格式进行解码)。
    对于tomcat,可以修改Tomcat_home/conf/server.xml
    <Connector URIEncoding="utf-8",改完之后,需要重新启动tomcat。(只对get请求有效,对post无效)
    step2,要保证浏览器内置的ajax对象也使用"utf-8"对参数值进行编码。encodeURI函数(uri)
    function check_username(){
    //获得ajax对象
    var xhr = getXhr();
    //发请求
    var uri = ‘check_username.do?username=‘ + $F(‘username‘);
    //encodeURI(uri)防止乱码
    xhr.open(‘get‘,encodeURI(uri),true);
    xhr.onreadystatechange=function(){
    if(xhr.readyState == 4){
    if(xhr.status == 200){
    //服务器处理正常
    //获得服务器返回的文本数据
    var txt = xhr.responseText;
    $(‘username_msg‘).innerhtml = txt;
    }else{
    $(‘username_msg‘).innerHTML = ‘验证用户名出错‘;
    }
    }
    };
    $(‘username_msg‘).innerHTML = ‘正在检查...‘;
    xhr.send(null);
    }
    2)发送post请求
    所有浏览器内置的ajax对象都会使用"utf-8"这种编码格式对请求参数进行编码。注意,服务器会使用"iso-8859-1"去解码(URIEncoding只对get请求起作用)。
    解决方式:request.setCharacterEncoding("utf-8");

1、状态管理
(1)什么是状态管理?
将浏览器与服务器之间多次的交互当做一个整体来看待,并且将多次交互所涉及的数据保存下来。
(2)如何进行状态管理?
第一类方案:将状态(多次交互所涉及的数据)保存到客户端(浏览器)。
第二类方案:将状态保存到服务器端(web服务器,比如tomcat)。
(3)cookie
1)什么是cookie?
浏览器在访问服务器时,服务器会将一些数据(少量的)以set-cookie消息头的方式发送给浏览器;浏览器会将这些数据保存下来。
当浏览器下次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
2)如何创建一个cookie?
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);

    PrintWriter out = response.getWriter();
    Cookie c = new Cookie("username","jetty");
    response.addCookie(c);
    Cookie c2 = new Cookie("city","bj");
    response.addCookie(c2);
    out.println("添加cookie成功");
    ------------------------------------------
    out.close();
3)如何查看cookie?
    Cookie[] cookies = request.getCookies();
    注意:
    a,浏览器之前可能保存了多个cookie,在访问服务器时,会一起发送给服务器,所以返回的是一个数组。
    b,该方法有可能返回null。
    遍历这个数组时,会用到两个方法。
        String cookie.getName();
        String cookie.getValue();
    ------------------------------------------
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    Cookie[] cookies = request.getCookies();
    if(cookies!=null){
        for (Cookie cookie : cookies) {
            out.println(cookie.getName()+" "+cookie.getValue()+"<br/>");
        }
    }else{
        out.println("没有找到cookies");
    }
    out.close();

(4)session
1)session是什么?
servlet容器负责为HttpSession分配唯一的ID
a,session是服务器端的状态管理技术;
b,当浏览器访问服务器时,服务器会创建一个session对象(每个session对象都有唯一的一个id属性值,称之为sessionId),
接下来服务器在默认情况下会使用set-cookie消息头将sessionId发送给浏览器(即使用cookie技术),
浏览器会将sessionId保存下来(内存);当浏览器再次访问服务器时,浏览器会将sessionId发送给服务器,
服务器会依据这个sessionId找到之前创建的session对象。
2)如何获得session
a, HttpSession s = request.getSession(boolean flag);
当flag = true时:
服务器先查看请求当中是否有sessionId,
如果没有,则创建一个session对象;
如是有,则依据这个sessionId去查找之前创建的session对象,
如果找到,则返回,找不到,会创建一个新的session对象。
当flag=false时:
服务器先查看请求当中是否有sessionId,
如果没有,返回null;
如是有,则依据这个sessionId去查找之前创建的session对象,
如果找到,则返回,找不到,返回null。
b,HttpSession s = request.getSession();
该方法等价于request.getSession(true);
3)session的几个常用的方法
String session.getId(); //返回sessionId
//绑订一个对象到session。
session.setAttribute(String name,Object obj);
//依据绑订名找到绑订值,注意有可能返回null。
Object session.getAttribute(String name);
//解除绑订
session.removeAttribute(String name);
4)session的超时
a,什么是session的超时?
服务器会将空闲时间过长的session对象从内存空间里面删除掉。大部分服务器空闲时间是30分钟。
b,如何修改?
方式一:改服务器的配置,比如,修改tomcat的web.xml文件。也可以放在应用的web.xml里。
conf/web.xml。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式二:session.setMaxInactiveInterval(int seconds)。
5)立即删除session
session.invalidate();
6)session案例
a, session验证
step1,登录成功以后,在session对象上绑订相关的数据。
比如:
session.setAttribute("user",user);
step2,对于需要保护的资源(即访问某个地址时,需要检查用户是否登录,如果没有登录,则不能访问该地址)。
比如:在main.jsp中添加
<%
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,或者session超时,跳转到登录页面
response.sendRedirect("login.jsp");
return;
}
%>
为什么jsp文件里面,可以直接使用session?
因为在默认情况下,容器在将.jsp转换成对应的.java文件时(即servlet时),会自动添加session的获得语句。

session优点
a,session比较安全(session将状态保存在服务器端,而cookie将状态保存在浏览器端),session是服务器端生成的,
cookie是用户可以查看的;
b,session保存的数据类型更加丰富(cookie只能保存字符串)
c,session能够保存的数据大小更大(cookie只能保存大约4k左右的数据)
d,cookie可以被用户禁止,而session没有这个问题。

session缺点
a,session会将数据放在服务器端,所以给服务器的资源消耗比较大。而cookie会将数据保存在浏览器端,
对服务器不会占用过多的内存空间。
b,session在默认情况下,会将sessionId以cookie的方式发送给浏览器,浏览器会将session保存到内存里面,
如果浏览器关闭,浏览器发请求时就没有sessionId,服务器端的session对象就找不到了。

Json :

  1. json (javascript object notation)
    (1)json是什么?
    是一种轻量级的数据交换格式。
    注:json借鉴了javascript的部分语法
    注:
    数据交换:指的是将要交换的数据转换成一种与平台无关的
    数据格式(比如xml),然后发送给接收方来处理。
    轻量级:json相对于xml而言,文档更小,解析速度更快。
    (2)语法
    1)表示一个对象
    {属性名:属性值,属性值:属性值...}
    注意:
    a.属性名必须使用双引号括起来。
    b.属性值可以string,number,true/false,null,object。
    c.属性值如果是string,必须使用双引号括起来。
    2)表示对象组成的数组
    [{},{},{}...]
    (3)使用json
    1)java对象如何转换成json字符串?
    使用jackson提供的api(ObjectMapper)。
    2)将json字符串转换成javascript对象?
    使用javascript内置对象JSON提供的parse()函数。

Servlet:
1.静态网页
?开发手册网页,百科,小说,新闻
?无论谁看结果都一样
?服务器直接保存一份HTML,并向浏览器发送此HTML
2.动态网页
?淘宝,微博
?每个人看的结果有差异
?服务器保存一个对象,由它动态拼一个网页,发送给浏览器
在Java中该对象是Servlet
3.Servlet的特征
?是满足规范(sun)的对象,也叫组件
?存储在服务器上
?可以动态的拼资源(HTML,IMG). 术语:处理HTTP协议
4.什么是Servlet?
?是sun推出的用来在服务器端处理HTTP协议的组件
是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
三.XML和HTML对比
1.XML
?可扩展(自定义)标记语言
?标记、属性、标记之间的关系都可以扩展
?用来存储或传输数据
2.HTML
?超文本标记语言
?标记、属性、标记之间的关系都是固定的(w3c)
?某些版本的HTML严格遵守XML规范
可以将HTML理解为标签固定的XML
1.什么是HTTP协议?
?就是W3C制定的一个规范
?规定了浏览器和服务器如何通信、通信的数据格式
2.GET和POST的区别
1)GET
采用路径传参
参数在传递过程中可见,隐私性差
路径大小有限制,所有传递的参数大小受限 2k
所有的请求默认都是GET请求
2)POST
采用实体内容传参
参数在传递过程中不可见,隐私性好
实体内容专门用来传参,大小不受限制
在表单上加method="post"

3)建议
参数需要保密时用POST
参数较多时用POST

3.Servlet运行原理

Jsp: jsp原理
1.jsp处理请求的过程

2.jsp翻译的详细过程

五.jsp隐含/内置对象(笔试题)
1.request() 客户端的请求信息被封装在request对象中,获得请求参数值,
?HttpServletRequest
2.response 响应客户请求的有关信息
?HttpServletResponse
3.out 用来传送回应的输出
?JSPWriter
?和PrintWriter一样
4.config 是ServletConfig的实例,用来读取servlet初始化参数。将jsp当作一个 servlet去配置。
ServletConfig
5.application servlet上下文,用户间数据的共享,同一应用内部才可以访问
?ServletContext
6.exception 针对错误网页(<%@page isErrorPage="true"%> 才能在jsp中 <%=exception.getMessage()%>)
?Throwable
7.session(
) 与请求有关的会话期
?HttpSession
?后面讲
8.page JSP 网页本身
?Object
?就是this,指代jsp生成的那个Servlet
9.pageContext(*) jsp页面上下文,只在自己的jsp可以访问到
?PageContext
?是一个管理者,通过它可以获得其他8个隐含对象

如何使用隐含对象?
?<%String user = request.getParameter("user");%>
?<%=request.getMethod()%>

整合: 什么是servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范。
(1)扩展web服务器功能
a,早期的web服务器(比如,apache web server,iis等),只能够处理对静态资源(需要事先将html文件写好,
存放在服务器相应的文件夹下面)的请求。
b,如果用户的请求需要进行处理,需要对这些web服务器的功能进行扩展,即让这些web服务器能够处理动态资源的请求。
c,早期,使用cgi(common gateway interface)程序来扩展这些web服务器的功能。可以perl,c或者其它一些语言来开发cgi程序。开发这样的程序比较麻烦,需要解析请求参数,另外,程序的可移值性不好。 除此之外,每到服务器收到一个请求之后,会启动一个cgi进程,系统的开销比较大。
d,使用servlet可以扩展web服务器的功能。
当请求到达这些web服务器时,web服务器依据请求类型分别处理:如果是对静态资源的请求,比如,要访问某个.html文件,web服务器直接查找该文件即可;如果是对动态资源的请求,会调用servlet容器(是一种程序,负责调用servlet,并且提供servlet运行的环境)来处理。
servlet容器,比如tomcat,同时,也是一个完整的web服务器。所以,直接使用servlet容器充当web服务器也是可以的。
servlet不依赖某个特定的servlet容器
(2)组件规范
组件是按照规范开发、并且实现了部分功能的软件模块。组件需要部署到相应的容器里面才能运行。
所谓容器,指的是按照规范来开发的一种程序,该程序会提供组件的运行环境(主要指的为组件提供一些基础服务)。
什么是容器?
符合规范,提供组件运行环境的程序。
组件:servlet,监听器
容器:tomcat
5、servlet是如何运行的?
比如,当我们在浏览器地址栏输入了
http://localhost:8080/web01/sayHello?name=huahua
step1,浏览器依据ip,port连接服务器。
step2,浏览器将请求数据打包(依据http协议),发送请求。
step3,服务器收到请求之后,解析数据包,然后将解析之后的数据保存到request对象上。同时,服务器还会创建一个response对象。
step4,服务器接下来要依据请求资源路径(/web01/sayHello?name=huahua)找到web.xml,然后,创建对应的servlet对象。
step5,服务器调用servlet对象的service()方法,在调用该方法时,会将事先创建好的request,response对象作为 参数传递,所以,可以在service方法里,调用request获得请求参数值,也可以将处理结果写到response对象上。 这样做的好处是:开发人员在编写servlet时,不用关心网络编程相关的问题,比如,要获得请求参数值,就不用 去解析请求数据包,又比如,要向浏览器发送处理结果,也不用去创建响应数据包了。
step6,服务器从response对象里获取处理结果,生成一个响应数据包,发送给浏览器。浏览器从响应数据包里取出 相应的数据,生成对应的界面。
6、常见错误及解决办法
200为正确
(1)404
404是一个状态码(是一个三位数,由服务器发送给浏览器,表示不同的含义)。
404表示,依据请求资源路径,找不到对应的资源。
解决办法:按照http://ip:port/appname/servlet-url规则检查你的请求地址。
(2)405
405表示找不到service方法。
(3)500
500产生的原因,一般是系统出错。
解决办法:仔细检查程序代码(比如,有没有对用户输入的参数值进行非空的检查等等),另外,还要检查 程序对应的配置文件(web.xml)。

1)什么是servlet的生命周期?
servlet容器如何创建servlet对象、如何为其分配资源、调用其方法完成请求以及如何销毁servlet对象的整个过程。
Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找、创建以及整个生命周期的管理。
(2)生命周期的四个阶段
1)实例化
a,含义:指的是容器调用servlet的构造器,创建servlet对象。
b,什么时候实例化?
第一种情况:容器收到请求之后才创建servlet对象。(在默认情况下,容器只会为servlet创建唯一的一个实例。)
第二种情况:容器启动时,先创建好这个servlet对象(需要配置load-on-startup) <load-on-startup>参数1</load-on-startup>
参数值必须是>=0的整数,越小,优先级越高
<servlet>
<servlet-name>actionName</servlet-name>
<servlet-class>web.ActionServlet</servlet-class>

1
2)初始化 a,含义:指的是容器在创建好servlet对象之后,会立即调用servlet对象的init方法。 可以在init方法里面,编写获取相应的资源的代码。 b,init方法: 该方法只会执行一行。 c,GenericServlet已经提供了该方法的实现,如果 要提供自己的初始化代码,只需要override init()方法。 d,初始化参数: step1,在web.xml文件中,使用配置一个或者多个初始化参数。 step2,使用ServletConfig.getInitParameter(String paraName)获得初始化参数值。 some web.SomeServlet company 北京达内科技有限公司 1 public void init(ServletConfig config) throws ServletException { String name=config.getInitParameter("company"); } 3)就绪 a,含义:就绪指的是servlet对象可以接受调用了,容器收到请求之后,会调用servlet对象的service方法来处理。 b,service方法会执行多次。 c,HttpServlet已经实现了service方法,该方法会依据请求类型(get/post)分别调用doGet,doPost方法。 所以我们在写处理请求的代码时,有两种选择: (1)可以选择override HttpServlet的service方法, (2)也可以override HttpServlet的doGet,doPost方法。 4)销毁 a,含义:销毁指的是容器在销毁servlet对象之前,会调用destroy方法。 b,destroy方法只会执行一次。 Servlet是否是线程安全的,如何解决? Servlet存在线程安全问题。容器收到请求之后,会启动一个线程来进行相应的处理。默认情况下, 容器只会为某个Servlet创建一个实例,如果同时有多个请求同时访问某个Servlet,则肯定会有多个线程访问同一个Servlet实例。 如果这些线程要修改Servlet实例的某个属性,就有可能发送线程安全问题。可以使用synchronized对代码加锁来解决Servlet的安全问题。 JSP和Servlet区别? jsp:sun公司制定的一种服务器端动态页面生成技术的规范,因为直接使用Servlet虽然可以生成动态页面,但是过于繁琐, 并且不利于代码的维护, Servlet:sun公司制定的一种用来扩展web服务器功能的组件规范。 组件:是按照规范开发,并且实现了部分功能的软件模块。组件需要部署到相应的容器里才能运行。 Jsp本质上就是servlet,不过jsp更倾向于页面显示、视图方面的问题,servlet更侧重于逻辑控制. 转发与重定向的区别 (1)重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求,转发是服务器收到请求后为了完成响应转到一个新的地址。 (2)重定向中有两次请求,不共享数据,转发只产生一个请求,且在组件间共享数据共享request对象。 (3)重定向后地址栏地址改变,而转发则不会。 (4)重定向的新地址可以是任意地址,转发到新地址必须是同一个应用内的某个地址。 (转发的特点: 1.一次请求 2.地址不变 3.一次请求服务器只创建一个request 2个组件可以通过request共享数据 4.只能转发到项目内部的组件 重定向的特点: 1.二次请求 2.地址改变 3.二次请求服务器会创建两个request,两个组件无法通过它共享数据 4. 可以重定向到项目的外部的组件) 六.开发模式 1.Model 1 2.Mode SSM: SSH: Js: JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能 Jquery: jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 jQuery介绍: 1)特点 使用选择器(借鉴了css选择器的语法)查找节点,并且将节点封装成jQuery对象,通过调用jQuery对象的方法或者属性来实现 对底层节点的操作。 这样做的好处是:屏蔽了浏览器之间的差异,另外,也简化了编程。 jQuery的选择器类似于css中的选择器,其作用查找节点,施加行为。 1)基本选择器 select / s1.html #id 依据id查找 (优先使用) .class 依据class属性值 element 依据标记的名称 selector1,selector2..selectorn 将多个选择器的结果进行合并 * 所有的节点 Struts2:简介 1.来自Apache基金会的软件: http://struts.apache.org 2.Struts2 与 Struts1 完全没有关系 3.Struts2 的前身是 WebWorks 4.Spring MVC\Struts2\Struts1 都是 MVC 模式的Web框架 MVC是非常流行的 用户界面设计模式。 MVC是3层架构中的表现层。 Spring 和 Struts 2 整合 Spring 将接管 Struts 2 控制器对象的管理, 帮助创建 Struts 2 控制器Bean对象. 为什么要将 Spring 和 Struts2 整合 1.Spring 框架核心功能: IOC/DI AOP IOC/DI 管理对象, 管理对象和对象的关系, 可以解除耦合 AOP 2.Struts2 可以简化WEB编程. 3.整合以后: 简化了Web开发 简化业务层和持久层组件的开发. Hibernate:Hibernate Struts : 架子 Spring : 春天 Hibernate 冬眠: 把对象冬眠一样持久的保存到数据库中. 核心想法: java程序员按照面向对象的方式操作数据库, 不再需要使用SQL. Hibernate 的问题 1.不用写SQL, 但是要重新学习 HQL 2.会生成不理想的SQL, 影响数据库性能 3.特殊操作, 无法实现! 解决了 ORM 问题: 对象关系映射问题 SpringMVC?和Struts2的区别? 参考:(http://www.cnblogs.com/langtianya/p/4628967.html) 1.?机制: spring?mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。??? 2.?性能: spring会稍微比struts快。spring?mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3?mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3?mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter?getter方法把request中的数据注入;struts2实际上是通 setter?getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。??? 3.?参数传递: struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。??? 4.?设计思想上: struts更加符合oop(面向对象编程)的编程思想,?spring就比较谨慎,在servlet上扩展。 ??? 5.?intercepter的实现机制: struts有自己的interceptor机制,spring?mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring?mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring?mvc使用更加简洁,开发效率Spring?MVC确实比struts2高。spring?mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3?mvc就容易实现restful?url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful?url要费劲,因为struts2?action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3?mvc的方法之间基本上独立的,独享request?response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。? 1.Oracle怎样分页查询的? select * from ( select rownum r,a from tabName where rownum <= 20 ) where r > 10 2.sql语句中,聚合函数为什么不能在where中使用?(常见面试题) 因为Where语句是在Group By之前执行的,都还没有Group By当然就不能使用聚合函数了。 以下是SQL语句的执行顺序: FROM ON OUTER(JOIN) WHERE GROUP BY CUBE|ROLLUP HAVING SELECT DISTINCT ORDER BY TOP 3.比较truncate和delete命令区别? 1). Truncate 和delete都可以将数据实体删掉,truncate 的操作并不记录到 rollback日志,所以操作速度较快,但同时这个数据不能恢复 2). Delete操作不腾出表空间的空间 3). Truncate 不能对视图等进行删除 4). Truncate是数据定义语言(DDL),而delete是数据操纵语言(DML) drop、truncate、delete区别? drop table stu;删除表,释放表空间,所有数据删除; truncate table stu;删除表中所有数据,保留表结构,释放空间,不能恢复,速度快; delete from stu;删除,可以回滚,速度慢;(delete 与delete from没区别) 视图: 也被称作虚表,本身不包含任何数据,只包含映射到几百欧的一个查询语句,当基表数据发生变化时,视图数据也随之变化。 作用:如果经常执行某项复杂查询,可以基于这个复杂查询建立视图,简化复杂查询。 创建视图需要授予权限: GRANT CREATE VIEW TO terena;//授予何种权限给某个用户 例:create view v_emp_10 as select empno,ename,sal,deptno from emp where deptno=10; 查看视图结构: desc v_emp_10; 用OR REPLACE短语修改视图的SQL语句 例: create or replace view v_emp_10 as select empno id,ename name,sal salary,deptno from emp where deptno=10; 查询视图: select * from v_emp_10; 删除视图:drop view v_emp_10; 4.说出ArrayList,Vector,LinkedList的存储性能和特性 HashMap和HashTable的区别? ArrayList Vector:以数组的方式存储、增、删快,查、改快 ArrayList:线程不安全熟读快, Vector:线程安全,速度慢(synchoronized) LinkedList:以单链表的方式存储、增、删快,查、改慢 5.四种会话跟踪技术 Cookie,Session,Hidden,url重写 SQL优化:(1)? ? ? 选择最有效率的表名顺序(只在基于规则的优化器中有效):? ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.? (2)? ? ? WHERE子句中的连接顺序.:? ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.? (3)? ? ? SELECT子句中避免使用 ‘ * ‘:? ORACLE在解析的过程中, 会将‘*‘ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间? (4)? 减少访问数据库的次数:? ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;? (5)? ? ? 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200? (6)? ? ? 使用DECODE函数来减少处理时间:? 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.? (7)? ? ? 整合简单,无关联的数据库访问:? 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)? (8)? ? ? 删除重复记录:? 最高效的删除重复记录方法 ( 因为使用了ROWID)例子:? DELETE? FROM? EMP E? WHERE? E.ROWID > (SELECT MIN(X.ROWID)? FROM? EMP X? WHERE? X.EMP_NO = E.EMP_NO);? (9)? ? ? 用TRUNCATE替代DELETE:? 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)? (10) 尽量多使用COMMIT:? 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:? COMMIT所释放的资源:? a. 回滚段上用于恢复数据的信息.? b. 被程序语句获得的锁? c. redo log buffer 中的空间? d. ORACLE为管理上述3种资源中的内部花费? (11) 用Where子句替换HAVING子句:? 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里? (12) 减少对表的查询:? 在含有子查询的SQL语句中,要特别注意减少对表的查询.例子:? ? ? SELECT? TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT? TAB_NAME,DB_VER FROM? TAB_COLUMNS? WHERE? VERSION = 604)? (13) 通过内部函数提高SQL效率.:? 复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的? (14) 使用表的别名(Alias):? 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.? (15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:? 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.? 例子:? (高效)SELECT * FROM? EMP (基础表)? WHERE? EMPNO > 0? AND? EXISTS (SELECT ‘X‘? FROM DEPT? WHERE? DEPT.DEPTNO = EMP.DEPTNO? AND? LOC = ‘MELB‘)? (低效)SELECT? * FROM? EMP (基础表)? WHERE? EMPNO > 0? AND? DEPTNO IN(SELECT DEPTNO? FROM? DEPT? WHERE? LOC = ‘MELB‘)? 数据库中的递归:(加强了解,知道的人较少,但很好用,牛牛的问题) 简述Hash表实现原理; (http://blog.csdn.net/duan19920101/article/details/51579136) (http://www.cnblogs.com/absfree/p/5508570.html) 1.hash 哈希表作为一种高效的存储结构,可以大大降低查询和存储的时间,其核心理念为空间换时间,消耗一部分多余的内存来换取较高的性能,在当下电脑内存越来越大的趋势下,十分划算。 哈希表又称为散列表,可以分为闭散列和开散列两种,这里只研究闭散列。 2.实现原理 哈希表的底层为一个长度较长的数组,通过将存放的各个元素进行一系列运算而转化为一串hash值,再通过相同的规则与数组的下标进行对应。但是,这并不能保证元素对应的下标唯一,可能存在两个元素运算后的hash值相同,从而指定到相同的下标(也会存在不同的hash值对应相同的数组下标),此时需要对这种冲突进行处理。 故哈希表的实现主要为“建立下标对应”和“冲突处理”两部分 Servlet和CGI的区别; (http://developer.51cto.com/art/200907/133695.htm) CGI(Common Gateway Interface)程序,主要用Perl、Shell Script或C编写,能够向客户端提供动态内容,即每次客户端浏览器访问某一页面时,可以看到不同的内容。CGI应用开发比较困难,因为它要求程序员有处理参数传递的知识,这不是一种通用的技能。CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。 Servlet对CGI的最主要优势在于一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。 Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。 Servlet对CGI的最主要优势在于一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。 已知 message为用户发言日志,答题可用table做表名代替,表中有id,sendtime和消息内容若干列,现在运营需要统计2014年一月每天有多少用户发表过日志,请写出sql. Ctrl+O 看方法 ctrl+t 看这个接口的实现类 数据库的存储过程? 数据库存储过程与函数的区别; Mybatis的注解; 解析xml的包


以上是关于整理的一些java面试题的主要内容,如果未能解决你的问题,请参考以下文章

最全Java面试题及答案整理(2023最新版)

java面试基础题整理学习

Java面试题及答案整理汇总(2023最新版)

java代码怎么运行插件,精心整理

java基础面试题整理2-异常

Java面试题之扫盲知识点整理