java面试题一

1+2+3……+100构建一个函数。(易)

答案:

public int Sum(int n){

if(n == 1)

return 1;

else

return n + Sum(n – 1);

}

描述冒泡算法。(易)

答案:

 基本思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较。(如:有5个元素,则要进行5-1轮比较。第3轮则要进行5-3次比较)

堆和栈的区别!(难)

答案:

申请方式

栈:由系统自动分配。例如,在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间

堆:需要程序员自己申请,并指明大小,在c中malloc函数

申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,

申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.

堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

小结:

堆和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

IT公司面试手册提供最全的软件测试类面试题

Java面试题:http://www.mianwww.com/html/category/it-interview/java

Struts 面试题:http://www.mianwww.com/html/category/it-interview/struts-it-interview

Spring面试题:http://www.mianwww.com/html/category/it-interview/spring

Hibernate面试题:http://www.mianwww.com/html/category/it-interview/hibernate

EJB面试题:http://www.mianwww.com/html/category/it-interview/ejb

Web开发面试题http://www.mianwww.com/html/category/it-interview/webdev

更多面试题请访问:http://www.mianwww.com

索引是怎样来提高搜索速度的!(难)

答案:

使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(lname)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

  索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

  索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

画一个项目的体系结构图。(难)

答案:

同步和异步有何异同,在什么情况下分别使用它们?(难)

答案:

通俗版:举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

——————————————————————————————————————–

同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。

异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。

——————————————————————————————————————–

举个例子 打电话时同步 发消息是异步

综述版:

异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。

异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定界还包含确定帧的结束位置。这有两种方法。一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。每个字符开始发送的时间可以是任意的t0 0 1 1 0 1 1 0起始位结束位t每个帧开始发送的时间可以是任意的以字符为单位发送以帧为单位发送帧开始帧结束。

“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。

串口进行通信的方式有两种:同步通信方式和异步通信方式。同步通信方式要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲源保证发送方和接收方的准确同步,效率较高;异步通信方式不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。

说说你所熟悉或听说过的J2EE中的几种常用模式,及对设计模式的看法(中)

答案:

工厂模式、单例模式、代理模式、门面模式等

设计模式就是解决某一类问题的方法论

下列是类和对象关系得是(B)(易)

A.苹果和橘子 B.水果和苹果

C.水果和水果刀 D.苹果和水果刀

int i=0; i=i++;执行这2句话后变量i的值为(A)(难)

A. 0 B. 1 C. 2 D. 3

怎样用2个栈实现队列(难)

答案:队列的要求是先进先出,用两个栈可以很容易的实现假设其中一个栈为s1, 另一个为s2

入队:将元素放入s1中,s2始终为空出队: 1). 首先将s1中的元素全部导入s2的栈中,清空s1;2). 然后再将s2栈顶元素出栈,保留下来;3). 将s2剩余元素导入s1中,恢复数据原有顺序,就可以了。

用递归实现任意一个数的阶乘(中)

public class test {

public static void main(String [] args) {

System.out.println(fuc(100));

}

public static double fuc(int n){

if(n==1) return 1;

else return n*fuc(n-1);

}

}

使用递归检索指定文件夹中的资源(难)

package com.accp;

import java.io.File;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class Recursive {

private static List fileList = new ArrayList();

/**

* 使用递归搜索指定文件夹中的资源

* @param path 要搜索的文件目录

* @return 包含文件路径的列表

*/

public static List searchFile(String path) {

try {

// List fileList = new ArrayList();

File dir = new File(path);

File[] files = dir.listFiles();

if (files == null) {

return null;

}

for (int i = 0; i < files.length; i++) {

if (files[i].isDirectory()) {

fileList.add(files[i].getAbsolutePath());

searchFile(files[i].getAbsolutePath());

} else {

String strFileName = files[i].getAbsolutePath().toLowerCase();

fileList.add(files[i].getAbsolutePath());

}

}

return fileList;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

public static void main(String[] args) {

String path = “c:\\java”;

long start = System.currentTimeMillis();

Recursive r = new Recursive();

List files = r.searchFile(path);

System.out.println(“共有文件数量:” + files.size());

System.out.print(“总共用时:”);

System.out.println(System.currentTimeMillis() – start);

Iterator i = files.iterator();

while (i.hasNext()) {

System.out.println(i.next());

}

}

}

编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。(难)

import java.io.*;

public class Dicemal{

public static void main(String[] args) throws Exception{

int shang=0,yu;

boolean flag=false;

System.out.println(“请输入一个数字(最大值为<”+Integer.MAX_VALUE+”):”);

InputStream is = System.in;

InputStreamReader isr=new InputStreamReader(is);

BufferedReader br=new BufferedReader(isr);

String str=br.readLine();

char[] ch=new char[str.length()];

str.getChars(0, str.length(), ch, 0);

for(int a=0;a<str.length();a++){

if(!Character.isDigit(ch[a])){

System.out.println(“有非数字字符”);

System.exit(0);

}

}

try{

shang=Integer.parseInt(str);

flag=true;

}catch(Exception e){

System.out.println(“数字过大”);

}

str=”";

if (flag){

while (shang != 0){

yu = shang % 2;

shang = shang / 2;

str = yu + str;

}

}

System.out.println(str);

}

}

请写出你知道的JAVA开源软件,并用一句话说明其功能。(中)

答案:Struts WEB框架

Spring IOC/AOP 框架

Hibernate ORM框架

DWR ajax 框架

Log4j 日志调试

Validator  验证框架

构建工具Ant使用的缺省xml文件名是?(中)

答案:Build.xml

简述什么是SOA。(难)

答案:面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。

XML在JAVA中有那些解析方法。(难)

DOM/SAX

WAR包中的jar一般是放在哪个目录下?(难)

答案:lib

简述Junit和单元测试的作用?(中)

答案:检查程序和预期设计的是否一致.

什么是工作流?(难)

答案:工作流(Work Flow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。我们可以将整个业务过程看作是一条河,其中流过的河水就是工作流。

  工作流属于计算机支持的协同工作(Computer Supported Cooperative Work,CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。

  许多公司采用纸张表单,手工传递的方式,一级一级审批签字,工作效率非常低下,对于统计报表功能则不能实现。而采用工作流软件,使用者只需在电脑上填写有关表单,会按照定义好的流程自动往下跑,下一级审批者将会收到相关资料,并可以根据需要修改、跟踪、管理、查询、统计、打印等,大大提高了效率,实现了知识管理,提升了公司的核心竞争力。

JavaEE是什么?(中)

答案:是sun提出的一种规范和标准.现在有很多种实现

什么是webService? (中)

答案:WEB服务是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。

WEB服务的核心主要包括:

SOAP:一个基于XML的可扩展消息信封格式,需同时绑定一个传输用协议。这个协议通常是HTTP或HTTPS,但也可能是SMTP或XMPP。WSDL:一个XML格式文档,用以描述服务端口访问方式和使用协议的细节。通常用来辅助生成服务器和客户端代码及配置信息。UDDI:一个用来发布和搜索WEB服务的协议,应用程序可借由此协议在设计或运行时找到目标WEB服务。

WEB服务实际上是一组工具,并有多种不同的方法调用之。三种最普遍的手段是:远程过程调用(RPC),面向服务架构(SOA)以及表述性状态转移(REST)。

Struts,webWork 的理解. (中)

答案:两个实现了MVC的WEB应用程序开发的框架.

ORM的中间控件有哪些(举例). (中)

答案:Hibernate , IbatIs, JDO , EntityBean

写出java异常处理的5个关键字(中)

答案:Try , catch, finally, throw, throws

描述break和continue控制循环的流程不同之处(中)

答案:break 退出牡循环体,continue指退出当前这次循环,继续进入下一次循环.

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?(易)

会执行,在return前执行。

常见的runtime exception有哪些?。(易)

ArithmeticException,

ArrayStoreException,

BufferOverflowException,

BufferUnderflowException,

CannotRedoException, CannotUndoException,

ClassCastException,

CMMException,

ConcurrentModificationException,

DOMException,

EmptyStackException, IllegalArgumentException,

IllegalMonitorStateException,

IllegalPathStateException,

IllegalStateException,

ImagingOpException, IndexOutOfBoundsException,

MissingResourceException,

NegativeArraySizeException,

NoSuchElementException, NullPointerException,

ProfileDataException,

ProviderException,

RasterFormatException,

SecurityException,

SystemException, UndeclaredThrowableException,

UnmodifiableSetException,

UnsupportedOperationException

NullPointException

代码推断?(中)

Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)==12

Math.round(-11.5)==-11

round方法返回与参数最接近的长整数.

构造器Constructor是否可被(覆盖)override? (易)

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

Java有没有goto?(易)

java中的保留字,现在没有在java中使用。

启动一个线程是用run()还是start()?(中)

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?(中)

不对,有相同的hash code。

swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? (中)

switch(expr1)中,expr1是一个整数表达式。应该是 int、 short、 char、byte。

long,string 都不能作用于swtich。

编程题:写一个Singleton出来。 [难]

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

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;

  public static synchronized Singleton getInstance() {

  if (instance==null)

    instance=new Singleton();

return instance;

}

}

String tempStr = “”;

try {

tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);

tempStr = tempStr.trim();

}catch (Exception e) {

System.err.println(e.getMessage());

}

return tempStr;

}

String与StringBuffer的区别(中)

答案:String一但声明,在内存中是不可改变的,而SringBuffer是可变的字符序列。

char型变量中能不能存贮一个中文汉字?为什么?(中)

答案:可以,就为采用Unicode编码.

Float型float f=3.4是否正确?(易)

答案:不正确,应为:float f = 3.4f;

下面语句执行后的结果是什么?(难)

答案:true ;false

String a=”teststringA”;

StringBuffer b =new StringBuffer(“teststringA”);

String c=”teststringA”;

System.out.println (a.equals(b.toString()));

System.out.println (a==c);

class.forname的作用?为什么要用?

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

JSP中动态INCLUDE与静态INCLUDE的区别?(难)

答案:动态包含可以传递参数,而静态则不可以。

以下程序代码将输出什么? (难)

答案:3 null

public class Test {

static inta= 3;

static Stringb= null;

public void reset(){

a=4;

b= “abc”;

}

public static void main(String[] args) {

System.out.println(a+ ” ” +b);

}

}

以下程序代码输出的变量i的值为多少?(难)

答案:199

public class Test {

public static void main(String[] args) {

int i = 99;

add(i);

System.out.println(i + 100);

}

public static void add(int i){

i += 100;

}

}

以下程序代码中哪行代码将产生错误?(难)

class Parent {

private String name;

public Parent(){

}

}

public class Child extends Parent{

private String dev;

public Child(){}

public String getValue(){

return name; //产生错误

}

public static void main(String[] args) {

Parent p = new Parent();

}

}

以下程序代码的输出结果为?(难)

答案:mqv

public class Test {

public static void test(){

try{

generateException();

System.out.print(“e”);

}catch(NumberFormatException ex){

System.out.print(“j”);

}finally{

System.out.print(“m”);

}

}

public static void generateException(){

throw new ArrayIndexOutOfBoundsException();

System.out.print(“h”); //语法错误

}

public static void main(String[] args) {

try{

test();

}catch(Exception ex){

System.out.print(“q”);

}finally{

System.out.print(“v”);

}

}

}

forward 和redirect的区别(易)

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

JNDI是什么?(难)

JNDI全称 Java Naming and Directory Interface。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。

错误404,500分别表示什么?(中)

404,没有找到该页(没有找到资源)。500,内部错误。

数据库联接的几种方式?(中)

JAVA连接数据库的方式有多种。根据所需要的不同数据库驱动分,分为四种:

桥连(Bridge Connectivity):JDBC-ODBC桥的方式。但这种方式不适合程序的重用与维护,不推荐使用。需要数据库的ODBC驱动。本地连接(Native Connectivity):JDBC+厂商API的形式。厂商API一般使用C编写,所以,这种方式也不长使用。数据源连接(Datasource Connectivity):JDBC+厂商Database Connection Server+DataBase的形式。这种方法就是在JAVA 与 DATABASE之间价起了一台专门用与数据库连接的服务器(一般由数据库厂商提供)。在程序运行的外布环境中又称(Context)设置一个datasource数据源,有一个jndi 名称,程序只须查找此名称就可得到一个数据库连接的对象。他的好处在于能优化连接。纯Java连接(Pure Java Connectivity):纯JDBC+DATABASE的连接方式。在程序中硬性编入数据库连接的所须参数。

抽象类和接口的区别?(中)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。abstract class和interface所反映出的设计理念不同。其实abstract class表示的是”is-a”关系,interface表示的是”like-a”关系。实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。接口中的方法默认都是 public,abstract 类型的。

String s = new String(“abc”);是几个对象?(难)

如果在此语句之前没有用到”abc”,该语句会创建两个对象,”xyz”就是创造了一个String对象,然后调用的String类中的String(String)的构造方法创建的另外一个对象,”xyz”在全局数据区,s指向的对象在堆中。

如果语句如下:

String s1 = new String(“abc”); //创建二个对象 String s2 = new String(“abc”); //创建一个对象,并且以后每执行一次创建一个对象

Sevlet的生命周期?(易)

Servlet 是一种可以在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。 Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和 destroy()三个方法。生命周期的具体说明如下:

Servlet容器完成加载Servlet类和实例化一个Servlet对象

init()方法完成初始化工作,该方法由Servlet容器调用完成

service()方法处理客户端请求,并返回响应结果

destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源

简述TCP的3次握手建立连接(难)

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN: 同步序列编号(Synchronize Sequence Numbers)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

数据库左连接和右连接的区别?(易)

左连接就是保留左边表的相关字段,如果右边表相关字段有不匹配的,以null填充之。 右连接就是保留右边表的相关字段,如果左边表相关字段有不匹配的,以null填充之

简述垃圾回收?(中)

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收

用任意语言写出一个堆栈的代码(中)

使用java.util.Stack可以直接创建堆栈对象,Stack 类描述了一个对象的后进先出(LIFO)堆栈,pop()方法删除栈顶的对象并把它作为该函数的值返回,push(Object)把一个对象压入栈顶。

用LinkedList也可以模拟堆栈实现:

public class Stack {

private LinkedList list = new LinkedList();

public void add(Object obj){

list.addLast(obj);

}

public Object get(){

return list.removeLast();

}

public static void main(String[] args){

Stack stack = new Stack();

stack.add(“1″);

stack.add(“2″);

System.out.println(stack.get());

}

}

用递归求出斐波那契数列的第30位数?(中)

public static long fib(int n) {

if (n == 1 || n==2) return 1;

else return fib(n-1) + fib(n-2);

}

调用fib(30)即可得到结果

写出一个函数实现将两个有序数组合并位一个有序数组(中)

void MergeArray(int [] pArray1, int nLen1, int [] pArray2, int nLen2, int [] pArray){

int i, j, n;

i = j = n = 0;

// 循环一直进行到拷贝完某一个数组的元素为止

while (i < nLen1 && j < nLen2) {

// 拷贝array1的元素

if (pArray1[i] < pArray2[j]) {

pArray[n++] = pArray1[i++];

}

// 拷贝array2的元素

else if (pArray1[i] > pArray2[j]) {

pArray[n++] = pArray2[j++];

}

// 相等的元素拷贝

else{

pArray[n++] = pArray2[j++];

++i;

}

}

// 如果array1已经被拷贝完毕就拷贝array2的元素

if (i == nLen1){

while (j < nLen2) pArray[n++] = pArray2[j++];

}

// 如果array2已经被拷贝完毕就拷贝array1的元素

else{

while (i < nLen1) pArray[n++] = pArray1[i++];

}

}

说出ArrayList,Vector, LinkedList的存储性能和特性(中)

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

Collection 和 Collections的区别。(易)

Collection是集合类的上级接口,继承于它的接口主要有Set 和List。

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

HashMap和Hashtable的区别。(中)

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

final, finally, finalize的区别。(中)

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

sleep() 和 wait() 有什么区别? (中)

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?(易)

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

error和exception有什么区别?(易)

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

Static Nested Class 和 Inner Class的不同。(难)

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

什么时候用assert。 (中)

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

GC是什么? 为什么要有GC?(中)

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? (中)

short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)

short s1 = 1; s1 += 1;(可以正确编译)

启动一个线程是用run()还是start()?(中)

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? (中)

都不能

数组有没有length()这个方法? String有没有length()这个方法?(易)

数组没有length()这个方法,有length的属性。String有length()这个方法。

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?(易)

Set里的元素是不能重复的,那么用equals()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

构造器Constructor是否可被override?(易)

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

是否可以继承String类?(易)

String类是final类故不可以继承。

switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?(易)

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于switch。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?(易)

会执行,在return前执行。

编程题: 用最有效率的方法算出2乘以8等於几? (中)

2 << 3

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?(中)

不对,有相同的hash code。

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? (易)

答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(中)

答:不能,一个对象的一个synchronized方法只能由一个线程访问。

“AA12321abc”请把这个字符串中重复的字母分别计数!说出你的思路!(中)

方法有很多种:

可以用map存放字母和出现的次数取出字符串的第一个字符(首字母),利用的字符串的replaceAll方法将符合正则表达式(第一个字符)替代为空,此字母出现的次数为原始的字符串长度减去替代后的字符串长度。如果下一个字母没没有被统计过(用map的contains方法判断)循环迭代找出下一个字母的统计次数

java的几种对象(PO,VO,DAO,BO,POJO)解释(中)

PO:persistant object持久对象

最形象的理解就是一个PO就是数据库中的一条记录。好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。

BO:business object业务对象

主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、 关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO, 关系对应一个PO。建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。

VO :value object值对象

ViewObject表现层对象。主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。

DTO :Data Transfer Object数据传输对象

主要用于远程调用等需要大量传输对象的地方。比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

POJO :plain ordinary java object 简单java对象

POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。一个POJO持久化以后就是PO。直接用它传递、传递过程中就是DTO。直接用来对应表示层就是VO。

DAO:data access object数据访问对象

这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要。主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO。

Jdk1.5的新特性(中)

泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入

什么是IOC(易)

IoC,Inversion of Control,控制反转,其原理是基于OO设计原则的The Hollywood Principle:Don’t call us, we’ll call you。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理

IoC模式的目标是将组件的配置与使用分离开。

什么是AOP(易)?

AOP为Aspect Oriented Programming的缩写,意为:面向方法(切面)编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它的目的是将公共问题抽象成Aspect统一实现,让程序员只关注业务实现

使用DWR是在页面上要导入的js文件是什么?(易)

包括DWR框架的util.js engine.js 以及自己发布的js

Struts1和Struts2的区别(难)

action 类:

? Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

? Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:

? Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

? Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:

? Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

? Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:

? 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

? Struts 2 Action可以通过初始化、设置属性、调用方法来测试,”依赖注入”支持也使测试更容易。

捕获输入:

? Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

? Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:

? Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

? Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL).

绑定值到页面(view):

? Struts 1使用标准JSP机制把对象绑定到页面中来访问。

? Struts 2 使用 “ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换:

? Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

? Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验:

? Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

? Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:

? Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

? Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用

46. Hibernate的映射关系有哪些?并说明原理(中)

一对一 一对多 多对一 多对多

实现ORM功能的时候,主要的文件有:映射类(*.java)、映射文件(*.hbm.xml)以及数据库配置文件(*.properties或*.cfg.xml),它们各自的作用如下。

⑴映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。

⑵映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

⑶数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比如连接哪中数据库、登录用户名、登录密码以及连接字符串等

Hibernate的实现原理:通过解析数据库配置文件获取数据库连接信息并建立连接,通过解析映射文件可以获取映射类名、属性名、表名以及字段名等信息,得到名字后通过反射机制可以得到映射类信息,调用构造方法创建对象,调用每个属性的set方法给对象设值完成数据的装载

Struts原理(中)

Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。

控制:XML文件Struts-config.xml,与之相关联的是Controller,在Struts中,承担MVC中 Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。

模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从 ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。

流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据 Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的 ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和 ActionBean名称,这些在Struts-config.xml中配置。

Spring原理(中)

spring第二大作用就是aop,其机理来自于代理模式,代理模式有三个角色分别是通用接口、代理、真实对象代理、真实对象实现的是同一接口,将真实对象作为代理的一个属性,向客户端公开的是代理,当客户端调用代理的方法时,代理找到真实对象,调用真实对象方法,在调用之前之后提供相关的服务,如事务、安全、日志。

Hibernate原理(中)

Hibernate的实现原理:通过解析数据库配置文件获取数据库连接信息并建立连接,通过解析映射文件可以获取映射类名、属性名、表名以及字段名等信息,得到名字后通过反射机制可以得到映射类信息,调用构造方法创建对象,调用每个属性的set方法给对象设值完成数据的装载

定义数组(易)

type arrayName[]

说说数据连接池的原理(中)

对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配?释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个”缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从”缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情况,为系统开发?测试及性能调整提供依据

如何配置Tomcat(易)

1.下载j2sdk和tomcat

2.安装和配置你的j2sdk和tomcat

配置JAVA_HOME CATALINA_HOME

3.在server.xml文件中可进一步修改配置

Ajax如何实现的(易)

实现Ajax的关键是使用XMLHttpRequest对象(下简称XHR对象)

Step 1. 创建XHR对象实例

Step 2. 向服务器做请求

Step 3. 指定回调函数, 即当服务器返回结果时如何处理结果

Step 4. 使用XHR对象的send方法发送请求

如何实现代码的版本控制(中)

在服务器端建立该项目的数据库,并保存你选定的项目源文件的第一个版本。客户端任一用户要获得某源文件的修改权利,需进行check out操作。之后客户端一般每完成一个无编译错误的版本想保存的时候,进行check in操作,将当前版本保存在服务器端上并成为最新版本(注意,不是覆盖以前的哟)。任一客户端可以方便地得到服务器上的文件的任意版本(如果有权限的话)。一般还实现了一个重要的功能是版本比较,任一客户端可以利用版本控制工具对某文件的不同版本进行版本比较,它会标记出不同版本的同名文件的不同点,可以轻易地看出版本内容的演化

常用的工具有vss和cvs

J2EE的好处是什么(中)

J2EE的全称是Java 2 Platform Enterprise Edition,它是由SUN公司领导、各厂商共同制定并得到广泛认可的工业标准。业界各大中间件厂商如BEA、IBM、Oracle都积极地促进了它的”诞生”、”长大”。

  从一开始,J2EE走的就是开放路线——众多厂商共同制定规范,使得J2EE吸收了这些厂商多年来在系统设计、系统集成方面的经验、教训。同时,这些厂商对新技术发展的预测以及各自独到的观点,也会在J2EE的规范中体现。所以,J2EE产品可以满足当前不断变化、日趋复杂的商业需求。

  保护企业的投资

  对于很多企业而言,在多年的发展过程中,它会有自己的技术人员设计开发的系统,也会有从专业软件公司那里买来的系统。这些系统可能是由同一种编程语言写的,也可能是由不同的编程语言写的;可能运行在相同的操作系统上,也可能需要运行在不同的操作系统上。

  为了保护已有投资,企业在构建新系统的时候,会尽量利用已有的系统以节约人力物力并加快系统开发的速度。参加J2EE规范制定的各厂商都在自己的产品中实现了和老系统的接口,如BEA的WebLogic可以直接调用Tuxedo中的服务,IBM的WebSphere也可以调用CICS的服务。Java本身的跨平台性,使得J2EE产品几乎可以在任何操作系统上运行。因此,选择J2EE,企业可以充分利用已有硬件和操作系统。  

对于系统将来的扩展,J2EE规范也考虑得很周全。J2EE规范强制开发者把业务逻辑封装成可重用的组件模式。在系统扩展的时候,原来的组件可以直接使用。另外,即使企业重新购买了别的J2EE产品,由于所有的J2EE产品都遵循一个统一的规范,原来的组件只要经过极少的改动就可以在新的J2EE产品上使用。这样,也避免了企业被一家厂商绑死。

Vector和ArrayList的区别(中)vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

Action有几种?(中)

除了基本的Action 之外, Struts 还提供了几个其他类型的Action ,这些Action 大大

丰富了Struts 的功能。下面介绍如下儿个常用的Action 。

DispatchAction: 能同时完成多个Action 功能的Action 。ForwardActon: 该类用来整合Struts 和其他业务逻辑组件,通常只对请求作有效性检查。IncludeAction: 用于引入其他的资源和页面。LookupDispatchAction: DispatchAction 的子类,根据按钮的key ,控制转发给action的方法。MappingDispatchAction: DispatchAction 的子类,一个action 可映射出多个Action地址。SwitchAction: 用于从一个模块转换至另一个模块,如果应用分成多个模块时,就可以使用SwitchAction 完成模块之间的切换。

说说你知道的排序方式(难)插入排序:该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:冒泡排序:这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)选择排序:选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。Shell排序:Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:1)当数据规模小的时候非常高效;2)当给定数据已经有序时的时间代价为O(N)。所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。这里每次分成若干小块是通过”增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小”增量”最终到减小到1。一直较好的增量序列是2^k-1,2^(k-1)-1,…..7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)快速排序:快速排序是目前使用可能最广泛的排序算法了。一般分如下步骤:1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法);2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。快速排序的核心在于分割算法,也可以说是最有技巧的部分。还有归并排序,堆排序,桶式排序,基数排序

59. 冒泡排序的时间复杂度(易)

O(n*n)

60. 查出一个表中30到50条的数据,sql语句(易)

Select top 21 * from 表名 where id not in

(select top 29 id from 表名order by id) order by id

61.说一下存储过程如何定义,怎么用(易)

Create procedure procedue_name

[@parameter data_type][output]

[with]{recompile|encryption}

as sql_statement

解释:

output:表示此参数是可传回的

with {recompile|encryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

使用:exec proc 存储过程名 参数列表

TCP与UDP(难)

OSI 和 TCP/IP 模型在传输层定义两种传输协议:TCP(或传输控制协议)和 UDP(或用户数据报协议)。

TCP:

TCP 的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP 在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。

为确保正确地接收数据,TCP 要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它

UDP:

UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。ICQ 短消息使用 UDP 协议发送消息。

许多程序将使用单独的 TCP 连接和单独的 UDP 连接。重要的状态信息随可靠的 TCP 连接发送,而主数据流通过 UDP 发送。

sql中如何去掉重复数据?(中)

分为是否有主键两种情况

如果没有主键:

–将不重复的记录插入临时表

select distinct *

into temp

from test

select * from temp

–删除原表数据

delete test

–从临时表复制过来

insert into test

select * from temp

select * from test

–如果有主键

delete test2 where id not in(

select min(id) from test2 group by A,B

)

select * from test2

html水平对齐和垂直对齐的属性?如何获取单选按钮的值?(易)

水平:align垂直: valign

单选按钮的值:form.控件名[i].value

容器的理解(中)

容器也是 java 程序,它的主要作用是为应用程序提供运行环境。,容器用来接管安全性、并发性、事务处理、交换到辅助存储器和其它服务的责任.

以tomcat为例:Tomcat是一个后台服务进程,其它的servlet(相当于DLL)是在Tomcat容器内运行,Broswer只与Tomcat通迅; Tomcat接受browser的请求,经过一系列动作(如果是静态网页,那么装载,按http协议形成响应流;如果是动态的如JSP,那就要调用JDK 中的servlet.jsp接口,解释形成静态网页,按http协议生成响应流发送回browser)后,形成静态网页,返回响应。

JSP内置对象有哪些,,分别简述作用?

答案:内置九大对象:

    request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。response对象:response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例。out对象:out对象是JspWriter类的实例,是向客户端输出内容常用的对象。page对象:page对象就是指向当前servlet自身,有点象类中的this指针。application对象:application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。exception对象:exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象。pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。config对象:config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。

JSP动作有哪些,简述作用?

    jsp:include 和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。jsp:param 可以在jsp:include, jsp:forward 或 jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。jsp:forward 用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。jsp:fallback 如果浏览器不支持APPLETS则会显示的内容。jsp:getProperty 从指定的JavaBean中获取一个属性值。jsp:setProperty 在指定的JavaBean中设置一个属性值。jsp:useBean 创建或者复用一个JavaBean 变量到JSP页。

写出JAVA的8个基本数据类型

答案:byte、short、int、long、float、double、char、boolean

请写出线程同步的方法

答案:synchronized

写出java异常处理的5个关键字,并简单描述作用

答案:try、catch、finally、throw、throws

描述break和continue控制循环的流程不同之处,简单写代码说明

答案:break——中断本次循环并跳出当前循环

continue——中断本次循环并继续下次循环

下面语句是否正确

public class hi{

public intaddOne(finalintx){

return++x;

}

}

这样写对嘛?

答案:这样写不对!

因为addOne中的参数是final类型的,不能够更改。

写四个基本的sql语句,分别是增加,更新,查询,删除,其中查询返回数据且按序降序排序。

答案:

增加:insert into users (user_name, user_password) values(‘test’,’123456′);

更新:update users set user_password=’12345678′;

删除:delete from users where user_name=’test’;

查询:select user_name,user_password from users order by user_name desc;

写一个方法将两个数组合并成一个数组返回

答案:

public static Object[] concat(Object[] array1, Object[] array2) {

if(array1 == null && array2 == null){

return new Object[0];

}

if(array1 == null){

return array2;

}

if(array2 == null){

return array1;

}

int length1 = array1.length;

int length2 = array2.length;

Object[] concatArray = new Object[length1 + length2];

System.arraycopy(array1, 0, concatArray, 0, length1);

System.arraycopy(array2, 0, concatArray, length1, length2);

return concatArray;

}

用java编写一个截取字符串的函数,输入一个字符串和字节数,输入为按字节截取的字符串,但要保证汉字不被截取半个,例如:”我abc”,4,应截取为:我ab”,输入”我abc汉字”6,应该是输出”我abc”。而不是”我abc”+汉的半个

答案:

public static String substring(String source, int length) {

String isoResource = “”;

try {

isoResource = new String(source.getBytes(“GBK”), “ISO8859_1″);

}

catch (java.io.IOException e) {

isoResource = “”;

}

int strLength = isoResource.length();

if (strLength <= 0) {

return “”;

}

if (length <= 0) {

length = 0;

}

if (length > strLength) {

length = strLength;

}

byte[] bs = null;

try {

bs = source.getBytes(“GBK”);

}

catch (UnsupportedEncodingException ex) {

ex.printStackTrace();

bs = new byte[0];

}

int i = 0;

for (i = length – 1; i >= 0; i–) {

if (bs[i] > 0) {

break;

}

}

if ((length – 1 – i) % 2 == 1) {

length = length + 1;

}

return new String(bs, 0, length);

}

一个工程,包含哪些阶段?你在一般从事哪个阶段?

答案:工程阶段包括:需求分析、架构设计、系统开发、系统测试、系统部署、系统维护等等

UML有哪几类图,你都用过什么工具,简述方法。

答案:UML用例图与UML时序图

你都知道什么文档类别?他们的作用是什么?测试用例应写在什么文档里?

答案:需求分析文档、开发文档、测试文档、数据库设计文档等等。

你都知道什么关系型数据库?你所熟悉的数据库是哪个?

答案:MySQL、SQLServer、Oracle、DB2、Sysbase

比较熟悉SQLServer

有三张表 学生表 课程表 选课表

    用sql语句建表,主键,自己设计。查询年龄20岁以下的学生,要查5个字段,并且这5个字段含概了这3张表,且第一个表里没有年龄列,只有生日列。用.Net3.5中的LINQ实现第二问。

ORM框架技术用过什么?

答案:常见的ORM框架有:Torque,OJB,Hibernate,TopLink,Castor JDO,TJDO,Active Record,ADO.NET Entity Framework。用过的是:Hibernate、ADO.NET Entity Framework 、JPA

你知道的应用层协议都有什么?他们的端口是多少?

答案:

    TCP/IP协议——传输控制协议(Transmission Control Protocol, TCP)和网际协议(Internet Protocol,IP)。TELNET协议——Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。SMTP协议——简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输email的标准。FTP协议——文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议。POP3协议——邮局协议版本3(Post Office Protocol – Version 3)。是TCP/IP协议族中的一员。主要用于支持使用客户端远程管理在服务器上的电子邮件。UDP协议——用户数据报协议 (User Datagram Protocol, UDP) 是一个简单的面向数据报的传输层协议,是不可靠的数据报协议。GPRS技术——通用分组无线服务技术(General Packet Radio Service,GPRS)是GSM移动电话用户可用的一种移动数据业务。 它经常被描述成”2.5G”,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间。

无线局域网用的协议是?

答案:GPRS。通用分组无线服务技术(General Packet Radio Service,GPRS)是GSM移动电话用户可用的一种移动数据业务。 它经常被描述成”2.5G”,也就是说这项技术位于第二代(2G)和第三代(3G)移动通讯技术之间。

10个随机数冒泡排序

答案:public void sort(int[] values) {

if (values == null) {

return null;

}

int temp = 0;

for (int i = 0; i < values.length; i++) {

for (int j = i; j < values.length – 1; j++) {

if (values[j + 1] > values[i]) {

temp = values[j + 1];

values[j + 1] = values[i];

values[i] = temp;

}

}

}

}

1-2+3-4+5-6+7-……+n实现这个算法,要求传入参数n,并且要考虑数量很大的情况。

答案:public BigInteger operate(int n) {

BigInteger sum = new BigInteger(“0″);

for (int i = 1; i <= n; i++) {

BigInteger num = new BigInteger(i + “”);

if (i % 2 == 0) {

num = num.negate();

}

sum = sum.add(num);

}

return sum;

}

doGet方法的参数

答案:HttpServletRequest与HttpServletResponse

用javascript写出AJAX调用的基本实现?

答案:

<script>

var http_request = false;

//向服务器发起XMLHTTP请求。

function send_request() {//初始化、指定处理函数、发送请求的函数

http_request = false;

//开始初始化XMLHttpRequest对象

if(window.XMLHttpRequest) { //Mozilla 浏览器

http_request = new XMLHttpRequest();

if (http_request.overrideMimeType) {//设置MiME类别

http_request.overrideMimeType(‘text/xml’);

}

}

else if (window.ActiveXObject) { // IE浏览器

try {

http_request = new ActiveXObject(“Msxml2.XMLHTTP”);

} catch (e) {

try {

http_request = new ActiveXObject(“Microsoft.XMLHTTP”);

} catch (e) {}

}

}

if (!http_request) { // 异常,创建对象实例失败

window.alert(“不能创建XMLHttpRequest对象实例.”);

return false;

}

url=”http://localhost:8888/zf10/submit.jsp?operation=other&top=5″;

http_request.onreadystatechange = processRequest;

// 确定发送请求的方式和URL以及是否同步执行下段代码

http_request.open(“GET”, url, true);

http_request.send(null);

}

// 处理返回信息的函数

function processRequest() {

if (http_request.readyState == 4) {// 判断对象状态

if (http_request.status == 200) {// 信息已经成功返回,开始处理信息

var returnStr = http_request.responseText;

document.getElementById(“newsCtrl”).innerHTML = returnStr;

} else { //页面不正常

alert(“您所请求的页面有异常。”);

}

}

}

</script>

Xhtml XSLT xPath CSS 名词解释

答案: XHTML——可扩展超文本置标语言(eXtensible HyperText Markup Language,XHTML),是一种置标语言,表现方式与超文本置标语言(HTML)类似,不过语法上更加严格。从继承关系上讲,HTML是一种基于标准通用置标语言(SGML)的应用,是一種非常灵活的置標語言,而XHTML则基于可扩展置标语言(XML),XML是SGML的一个子集。

XSLT——XSLT是扩展样式表转换语言(Extensible Stylesheet Language Transformations)的简称,把XML文档转化为另一文档的转换语言,即将源文档的所有数据或者部分数据,利用XPath进行选择,生成另外的XML文档或者其他可直接显示或打印的文件格式(例如 HTML文件、RTF文件或者TeX文件)。XSLT语言是声明性的语言,即XSLT程序本身只是包含了一些转换规则的文档。而这些规则可以被递归地应用到转换过程中。XSLT处理程序会首先确定使用XSLT中的哪些规则,然后根据优先级作出相应的转换操作。XSLT本身也是一份XML文档,所以它也必须遵守严格的XML规范。

Xpath——XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer與XSL间的语法模型。但是 XPath 很快的被開發者採用來當作小型查詢語言。

CSS——Cascading Style Sheets(层叠样式表/串樣式列表),简写为CSS,由W3C定义和维护的标准,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言。CSS最主要的目的是将文件的结构(用HTML或其他相关的语言写的)与文件的显示(CSS)分隔开来。

你知道的设计模型有哪些?谈谈singleton 和 Adapter思想

答案:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、修饰模式、命令模式、组合模式等等

用报表打网页某个区域的技术方案。

答案:在后台处理该区域,生成报表。

22 一个旅行者来到一个岛上旅行,岛上有两个部落,X部落和Y部落,已知道X部落的人都说真话,Y部落的人都说假话,旅行者遇到了个土著人A,问A是哪个部落的,A说自己是X部落的,旅行者相信了他,让他给自己当导游。然后他们又遇到了一个土著人B,旅行者让A去问B是哪个部落的,A回来告诉旅行者,说B也是X部落的。旅行者晕了,于是问逻辑博士,A是哪个部落的,逻辑博士说:A确实就是X部落的。请问,为什么?

答案:因为岛上的人无论是属于哪个部落,都说自己是X部落的人。A回来说:”他说他是X部落的人。”,说明A说真话。

一个正三角形,每个角上有一只蚂蚁,三只蚂蚁同时走,但不确定冲哪个角走,请问三只蚂蚁互不相撞的几率有多大?

答案:1/4。

计算出所有的可能性(P33),以及三只蚂蚁互不相撞的可能性(2,同时顺时针或者同时逆时针)。

谈谈final, finally, finalize的区别

答案:final是修饰符,用于修饰类和变量,表明该类或者变量不可更改。

finally是用于表明该关键字描述的方法块是最终会被执行的。

finalize是超级对象Object的方法

&和&&的区别

答案:&是逻辑与,&&是短路与

对于exp1&exp2而言,即便exp1为false,exp2也会被执行,最终返回false。意思就是说,无论如何,&两边的表达式都回被判断。

对于exp1&&exp2而言,如果exp1为false,exp2不会被执行,直接返回false。意思就是说,只有当exp1为true时,才会继续判断exp2。

Collection 和 Collections的区别

答案:Collection是集合接口。而Collections是用于处理集合的工具类。

sleep() 和 wait() 有什么区别

答案:sleep()是休眠,wait()是等待。

sqlserver中的操作员是()

A)dbo B)administrator C)sa D)可以与数据库交互的用户

答案:A

用最有效率的方法算出2乘以8等于几?

答案:用位运算。2<<3

什么是linux的基本命令

答案:ls(列出某目录所有文件),mv(移动文件),cp(复制文件),rm(删除文件),cat(查看文文件),ln(创建链接),shutdown(关机),reboot(重启)等等。

Sql server的存储过程是否了解

答案:了解

在数据库方面都学过什么?

答案:学过SQL语句、存储过程

JDBC读取数据源的方法:

答案:直接通过JNDI读取、使用properties配置文件、在连接池中配置

Hibernate实体文件配置的要点。

    每一个实体节点的id不能重复。Id节点有genarate,column属性,property节点有name,type属性。

Many-to-one的配置。

<many-to-one name=”departInfo” class=”com.myoffice.entity.DepartInfo” fetch=”select” lazy=”false”>

<column name=”DepartId” not-null=”true” />

</many-to-one>

Hibernate使用的API主要有哪些

答案:Configuration,SessionFactory,Session,Transction

简述一下Spring。

答案:Spring Framework 是一个开源的Java/Java EE的应用程序框架。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。

Spring 中包含的关键特性

强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与一般的 JTA 或者 EJB CMT 相反。JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个 ‘终止’ (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象 (Data Access Object) 异常等级相一致.以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的翻转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.灵活的基于核心 Spring 功能的 MVC 网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。提供诸如事务管理等服务的面向方面编程框架。

Spring自带的AOP有哪些。

答案:@AspectJ和基于Schema的两种切面定义的AOP

Spring里的声明式事务是怎么实现的。

先定义一个类,实现MethodBeforeAdvice、AfterReturningAdvice等接口。

在Spring配置文件里配置advice的bean,然后配置代理类,在类里注入advice和目标类。

Spring依赖注入有哪几种方式。

答案:构造注入、接口注入、Set方法注入、映射注入。

Action存在的作用域。

答案:request。

怎样布置web应用程序。

答案:有三种方法:一种是把应用程序文件夹拷贝到webapps目录下,一种是把应用程序打成war包,拷贝到webapps目录下,一种是在tomcat配置文件里把其他位置的应用程序文件夹配置下来。

一个网页里有10个div,一个网页里有10个table,这两个页面哪个速度更快。

答案:DIV速度更快一些。因为对于DIV的解释是从内到外,而对于TABLE的解释则是见到</table>才会显示所有的内容。

答案:使用document.getElementById(“<td的Id>”).innerText = “111″;

怎样使用javascript删除表格的一行数据。

答案:document.getElementById(“tableId”).deleteRow(rowIndex)。

在Hibernate中所使用的类;

答案:主要使用了:Session,SessionFactory,Transaction,Configuration;

在运行静态页面时,乱码问题怎么处理?

答案:设置页面编码方式

怎么使用log4g处理空指针异常?

答案:配置一下异常的捕获处理

说说javaWeb;

答案:

单位,用户,角色,权限四个表之间是什么关系;

答案:单位和用户表之间是一对多的关系,用户和角色之间是多对多的关系,角色和权限之间也是多对多的关系。

什么是MVC模式;

答案:(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。

它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。

模型—视图—控制器模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外此模式通过对复杂度的简化使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。

    模型(Model)——”数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。”模型”有对数据直接访问的权利,例如对数据库的访问。”模型”不依赖”视图”和”控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。(比较:观察者模式(软件设计模式))视图(View)——视图层能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。控制器(Controller)——控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并做出响应。”事件”包括用户的行为和数据模型上的改变。

servlet,jsp跟MVC是什么关系?

答案:servlet——控制层,jsp——显示层。

public class a {

int il=9;

static int i2=9;

final int i3=10;

}

请 指出static 和 final所代表的含义

答案:static是指该变量为类变量,在内存中只有一份,所有该类对象共享该变量;

Final是指该变量为常量,不能被修改。

类 a的成员变量如果没有初始化缺省是什么值?

Class bbb{}

public class a{

boolean a1;

int a2;

String a3;

bbb a4;

int[] a5;

}

答案:

Class bbb{}

public class a{

boolean a1;//false;

int a2;//0

String a3;//null

bbb a4;//null

int[] a5;//null

}

下面的程序有问题?该如何纠正?

public class MyClass{

public static void main(String arguments[]){

amethod(arguments);

}

public void amethod(String[] arguments){

System.out.println(arguments);

System.out.println(arguments[1]);

}

}

答案:在静态方法中不能调用非静态方法和属性。

两种改法:要么把amethod()声明为static,要么在main方法中构造MyClass对象,由MyClass对象调用amethod()方法。

类成员的默认访问和public,protected,private访问指示符代表的含义?

答案:public指该变量可以被所有其他对象访问;protected指该变量只能被继承类访问;private指该变量只能被本类对象访问。

下面代码有什么问题?

abstract class MineBase{

abstract void amethod();

static int I ;

}

public class Mine extends MineBase{

public static void main(String argv[]){

int[] ar=new int[5];

for(i=0;i<ar.length;i++)

System.out.println(ar[i]);

}

}

答案:Mine是MineBase的子类,要么实现MineBase的抽象方法amethod(),要么把自己声明为abstract。

布局管理器(Layout Manager)是做什么用的?举几个SDK提供的布局管理器?

答案:用来管理UI界面对象布局的。

常见的有FlowLayout、GridLayout等。

下面哪些是正确的?

1)The ActionListener interface has no corresponding Adapter class

2) The processing of an event listener requires a try/catch block

3) If multiple listeners are added to a component only events for the last listener added will be processed

4) If multiple listeners are added to acomponent the events will be processed for all but with no guarantee in the order

答案:3

下面哪些是正确的?

1) A class may extend only one other class and implement only one interface

2) interfaces are the Java approach to addressing its lack of multiple inheritance but require implementing classes to create the functionality of the Interfaces.

3) All of the variables in an interface are implicitly static and final

4) All of the methods in an interface are implicitly abstract

答案:2、3、4

根据前面给出的类,下面四个哪些编译没有错误

interface Iface{}

Class Cface implements Iface{}

Class Base{};

Public class ObRef extends Base{

ObRef ob=new ObRef();

Base b=new Base();

Object o1=new Object();

Iface o2=new Cface();

}

1)o1=o2;

2)b=ob;

3)ob=b;

4)o1=b;

答案:1、2、4

下面哪些是正确的?

1) At the root of the collection hierarchy is a class called Collection

2) The collection interface contains a method called enumerator

3) The interator method returns an instance of the Vector class

4) The set interface is designed for unique elements

答案:4

下面的程序合理吗?(其中Items[i]是String类型的数组)?为什么?如何改进?

public String statement(){

String =”";

for(int i=0;i<500;i++)

s+=Item[i];

return s;

}

答案:String的连接操作(+=)会产生很多对象,性能不好

public String statement(){

StringBuffer buffer = new StringBuffer();

for(int i=0;i<500;i++)

buffer.append(Item[i].toString());

return buffer.toString();

}

通常情况下,下面这段程序怎样改进才更合理?为什么?

try{

Statement sm = con.createStatement();

ResultSet rs=sm.execQuery(“SQL字符串”);

int i=rs.getInt(1);

//其它语句

rs.close();

sm.close();

}catch(SQLException e){

处理程序

}

答案:数据库的释放应该在finnaly块中

Statement sm = null;

ResultSet rs = null;

try{

m = con.createStatement();

rs=sm.execQuery(“SQL字符串”);

int i=rs.getInt(1);

//其它语句

}catch(SQLException e){

处理程序

}finally{

try{

if(rs != null && !rs.isClosed()){

rs.close();

}

}catch(Exception ex){

rs = null;

}

try{

if(sm != null){

sm.close();

}

}catch(Exception ex){

sm = null;

}

}

假如一个JAVA程序 bbb.java 用到了aaa.jar中的某个类,所需的其他类都正确定义在类路径中。aaa.jar 放在目录 c:\aaa中,假如在环境变量CLASSPATH加入目录 c:\aaa(继比如Classpath=其他目录或者文件c:\aaa)bbb.java成功编译为bbb.class

那么java bbb.class 会运行成功吗?如果不能运行话,什么原因?

答案:能够正确运行。

如果编译和运行下面的代码,哪一个会发生

class Base{

private void amethod (int iBase){

System.out.println(“Base.amethod”);

}

}

class Over extends Base{

public static void main(String vrgv[]){

Over o=new Over();

int iBase=0;

o.amethod(iBase);

}

public void amethod(int iOver){

System.out.println(“Over.amethod”);

}

}

1)Compile time error complaining that Base amethod is private

2)Runtime error complaining that Base amethod is private

3)Output of “Base.amethod”;

4)Output of “Over.amethod”;

答案:4

JAVA 是具有对象回收(垃圾回收)功能 的,简要说明为什么还有”内存泄漏”现象?

答案:垃圾回收是指对于那些没有被引用的对象,JVM会自动回收。

但是,如果很多对象依然被其他对象引用,那么JVM就不会回收,这就造成”内存泄漏”现象

Hibernate的三种状态

Hibernate中的对象有三种状态: 瞬时状态(Transient),持久状态(Persistent),脱管状态(Detached)

瞬时状态(Transient):由new命令开辟内存空间的Java对象,也就是平时所熟悉的普通Java对象。如:Student stu = new Student();。瞬时对象特点:(1)不和Session实例关联;(2)在数据库中没有和瞬时对象关联的记录。持久状态(Persistent):持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏(dirty)对象。持久化对象的特点:(1) 和Session实例关联(2) 在数据库中有和持久对象关联的记录。脱管状态(Detached):与持久对象关联的Session被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。脱管对象特点:(1) 本质上和瞬时对象相同;(2) 只是比爱瞬时对象多了一个数据库记录标识值id.。

持久对象转为脱管对象:

当执行close()或clear(),evict()之后,持久对象会变为脱管对象。

瞬时对象转为持久对象:

通过Session的save()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。使用fine(),get(),load()和iterater()待方法查询到的数据对象,将成为持久化对象。

脱管对象转为持久对象:

通过Session的update(),saveOrUpdate()和lock()等方法,把脱管对象变为持久对象。

static和final的区别

答案:static所修饰的对象全局对象,static所修饰的属性是类属性。static对象和属性在内存中只存在一份。

final修饰的对象是不可更改的对象,final修饰的属性是常量,也不可更改。

下面代码有错误吗?为什么?

public class Test{

public static void main(string []args){

amethod();

}

public void amethod(){

System.out.prinln(“this amethod “);

}

}

答案:在静态方法中不能调用非静态方法和属性。

两种改法:要么把amethod()声明为static,要么在main方法中构造Test对象,由Test对象调用amethod()方法。

下面这段代码合理吗?如不合理应怎样改正?

public String setout(){

String s=”";

for(int i=0;i<500;i++){

s+=i;

}

return i;

}

答案:字符串连接操作(+=)会产生很多中间对象,性能不好。

public String setout(){

StringBuffer buffer=new StringBuffer();

for(int i=0;i<500;i++){

buffer.append(i);

}

return buffer.toString();

}

递归:0,1,1,2,3,5,8,13,21……第30位是什么数值,要求用递归方法。

答案:

public class Fibonacci{

int fib(int n){

if (n == 0) return 0;

else if (n == 1) return 1;

else return fib(n-1) + fib(n-2);

}

public static void main(String[] args){

int[] fi=new int[30];

Fibonacci f = new Fibonacci();

for(int i=0;i<30;i++){

fi[i]=f.fib(i+1);

System.out.print(fi[i]+”\t”);

}

}

}

除了用session,application,cookie在页面之间传值还有哪些方法?

答案:request.setAttribute();以及URL方式

什么是SQL注入?举例说明

答案:SQL资料隐码攻击(SQL injection)又称为隐码攻击、SQL注入等,是发生于应用程式之资料库层的安全漏洞。简而言之,是在输入的资料字串之中夹带SQL指令,在设计不良的程式当中忽略了检查,那麽这些夹带进去的指令就会被资料库伺服器误认为是正常的SQL指令而执行,因此招致到破坏。

例子

某个网站的登入验证的SQL查询代码为

strSQL = “SELECT * FROM users WHERE (name = ‘” + userName + “‘) and (pw = ‘”+ passWord +”‘);”

恶意填入userName = “‘ OR ’1′=’1″;与passWord = “‘ OR ’1′=’1″;时,将导致原本的SQL字串被填为

strSQL = “SELECT * FROM users WHERE (name = ” OR ’1′=’1′) and (pw = ” OR ’1′=’1′);”

也就是实际上运行的SQL命令会变成下面这样的

strSQL = “SELECT * FROM users;”

因此达到无帐号密码,亦可登入网站。所以SQL隐码攻击被俗称为骇客的填空游戏。

写一个getWeek(aDate)方法,根据时间返回星期一星期二。。。。

答案:public String getWeek(Date date) {

Calendar cal = Calendar.getInstance();

cal.setTime(date);

int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

switch (dayOfWeek) {

case 1:

return “星期日”;

case 2:

return “星期一”;

case 3:

return “星期二”;

case 4:

return “星期三”;

case 5:

return “星期四”;

case 6:

return “星期五”;

case 7:

return “星期六”;

}

return “”;

}

Hibernate的缓存是在何时清除的?

答案: Hibernate提供了两级缓存,第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。

什么样的数据适合存放到第二级缓存中?

  1、很少被修改的数据.

  2、不是很重要的数据,允许出现偶尔并发的数据.

  3、不会被并发访问的数据.

不适合存放到第二级缓存的数据?

  1、经常被修改的数据.

  2、财务数据,绝对不允许出现并发.

  3、与其他应用共享的数据.

无论何时,当你给save()、update()或 saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。

当随后flush()方法被调用时,对象的状态会和数据库取得同步。如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

//a huge result set

ScrollableResult cats = sess.createQuery(“from Cat as cat”).scroll();

while ( cats.next() ) {

Cat cat = (Cat) cats.get(0);

doSomethingWithACat(cat);

sess.evict(cat);

}

Session还提供了一个contains()方法,用来判断某个实例是否处于当前session的缓存中。如若要把所有的对象从session缓存中彻底清除,则需要调用Session.clear()。

对于二级缓存来说,在SessionFactory中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。

sessionFactory.evict(Cat.class, catId); //evict a particular Cat

sessionFactory.evict(Cat.class); //evict all Cats

sessionFactory.evictCollection(“Cat.kittens”, catId); //evict a particular collection of kittens

sessionFactory.evictCollection(“Cat.kittens”); //evict all kitten collections

CacheMode参数用于控制具体的Session如何与二级缓存进行交互。

CacheMode.NORMAL – 从二级缓存中读、写数据。

CacheMode.GET – 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。

CacheMode.PUT – 仅向二级缓存写数据,但不从二级缓存中读数据。

CacheMode.REFRESH – 仅向二级缓存写数据,但不从二级缓存中读数据。通过 hibernate.cache.use_minimal_puts的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。

Hibernate中的inverse设为false是什么意思?

答案:代表由自己来维护数据关系

简述Struts工作流程

答案:首先actionservlet是strtus最核心的组件,当web容器启动时,actionservlet就被初始化,并加载struts配置文件,从而得知哪个action与哪个actionform是关联的,并且知道哪个请求路径与哪个action关联。当一个.do请求到来是,首先会被actionservlet拦截,并根据配置信息分析该请求路径对应的actionbean和formbean,如前面加法器请求页面提交时,是请求http://localhost:8080/zf2/add.do,因此actionservelt根据struts配置信息查找path属性为/add的actionbean,于是找到addaction,并得知该action的name属性为addform,于是找到addform的实例(如果不存在,则创建)之后,将请求中包含的值填充到formbean中,然后在action中实例化模型层的对象对请求数据进行处理,并将返回的结果,发送到视图层。(使用actionforward)

写一个存储过程,一个表test有三列ID,name,password,当输入的用户名和密码和数据库相同时返回1,否则返回0

答案:

public class StaticTest{

static int x=10;

static {

x+=5;

}

public static void main(String args[]){

System.out.println(“x=”+x);

}

static {

x/=3;

}

}

输出等于5 为什么?

答案:static int x=10;——x=10;

static {x+=5;}——x=15;

static {x/=3;}——x=5;

int [] arr=new int[25]

A.arr[24]==0 .B.arr[0]==null .C.arr[25]==0. D.arr[24]==null;

答案:A。int数组初始化时,所有元素全部初始化为0 。

JSP和servlet的生命周期和二者的关系。

答案:生命周期分为4个阶段:1.加载。2.初始化。3.调用。4.销毁。

JSP最终会被编译为Servlet执行。一般情况下,JSP用以展示数据,作为MVC中View层出现,Servlet用以控制业务流程,作为MVC中的Control层出现。

javascript 实现浮动广告,随浏览器的垂直滚动而滚动。

答案:SCRIPT language=”javascript”>

var advInitTop=0;

function inix(){

advInitTop=document.getElementById(“advLayer”).style.pixelTop;

}

function move(){

document.getElementById(“advLayer”).style.pixelTop=advInitTop+document.body.scrollTop;

}

window.onscroll=move;

</SCRIPT>

<BODY onLoad=”inix()” >

<DIV id=”advLayer” style=”position:absolute;left:16px;top:129px;width:144px;height:95px;z-index:1;”><A href=”#”><IMG src=”images/advpic.gif” width=”180″ height=”230″ border=”0″></A></DIV>

</BODY>

城门口站两个人。一个是骗子.一个是好人.骗子说假话.好人说真话.怎么判断谁是好人谁是骗子。

答案:让A去问B:你是好人么?如果A回话说B说自己是好人,则A就是好人。如果A回话说B说自己是骗子,则A是骗子。

一个很有钱的人家。户主老婆要生孩子了。这时候户主要挂,死前留遗嘱,如果生儿子,儿子和妻子各占一半家产。如果生女儿,女儿占1/3家产,其他给她妈。说完户主就死了。过两天妻子生了,双胞胎一男一女。问这时候应该怎么分。

答案:妻子与儿子的财产比例是 1:1,妻子与女儿的财产比例是 2:1,财产分成5份,妻子和儿子各拿2份, 女儿拿1份。

什么是反射?

答:反射是指一种特定类型的计算机程序能够在运行时以一种依赖于它的代码的抽象特性和它的运行时行为的方式被更改的特性。用比喻来说,那种程式能够”观察”并且修改自己的行为。

什么是自动拆箱与装箱?

答:自动装箱/拆箱 (Auto-Boxing/Unboxing)。Java对自动装箱/拆箱的支持,仅是利用编译器实现,在Java Bytecode 中,并无自动装箱/拆箱的操作码 (opcode)。

没有自动装箱/拆箱:

int int1 = 1;

Integer integer2 = new Integer(int1);

int int3 = integer2.intValue();

有自动装箱/拆箱:

int int1 = 1;

Integer integer2 = int1; // 自動裝箱

int int3 = integer2; // 自動拆箱

泛型 (Generic Types)

泛型就像是C++的模板。原有的Collection API加上泛型支持后,增加对型别的检查,减少程序错误的机会。

没有泛型:

HashMap hm = new HashMap();

int i=1;

String tt=”test”;

hm.put(new Integer(i), tt);

使用Generic:

HashMap <Integer, String>hm = new HashMap<Integer, String>();

int i=1;

String tt = “test”;

hm.put(i, tt); // 在int自动装箱成Integer,同时使用了参数类型检查

对事务的理解

答:事务的概念源自于数据库管理系统(DBMS)中数据库事务的概念。在数据库管理系统中,事务必须满足ACID性质,即原子性,一致性,隔离性和持久性。原子性指的是事务中的动作要么全部执行,要么一个都不执行;一致性指的是任何时刻,数据库必须处于一致性状态,即必须满足某些预先设定的条件;隔离性是指一个事务不能看见其他未提交事务所涉及到的内部对象的状态,而持久性则是指一个已提交的事务对数据库系统的改变必须是永久的。

不要哭,你要努力地往前看,你要相信阳光总在风雨后,你最终会看到彩虹的。

java面试题一

相关文章:

你感兴趣的文章:

标签云: