java面试题总结归纳
- 适合需要面试 初/中级java程序员
- 想要复习java基础的人
- 想要完善扩充技术的人
- 内容比较多 根据自己需求 针对阅读
面试题包括以下内容
- java语言基础
- 线程
- jQuery
- ajax
- ssm框架
java基础部分
1.Java编译运行过程:
1.1)编译期:.java源文件,经过编译,生成.class字节码文件
1.2)运行期:JVM加载.class并运行.class
2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
3.JDK和JRE的区别是什么?
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
4.Java语言支持的8中基本数据类型是:并且从从小到大依次为:
byte,short,int,long,float,double,char,
类型转换两种方式: 自动类型转换:从小类型到大类型 强制类型转换:从大类型到小类型 (要转换为的数据类型)变量 强转有可能会溢出或精度丢失 类型转换两点规则: 整数直接量可以直接赋值给byte,short,char, 但不能超出范围 byte,short,char型数据参与运算时, 先一律转换为int再运算 byte b3 = (byte)(b1+b2);
5.什么时候会发生短路
&&:短路与(并且),两边都为真则为真,见false则false 若第1个数为false,则发生短路(后面的不执行了)
||:短路或(或者),有一边为真则为真,见true则true 若第1个数为true,则发生短路(后面的不执行了)
6.自增自减在前在后
单独使用时,在前在后无差别 被使用时,在前在后有差别 a++的值为a ++a的值为a+1
7.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数 应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich
8.char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的 char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
9、面向对象的特征有哪些方面?
抽象:
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。继承:
继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。封装:
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
10.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。必须只有一个类名与文件名相同。 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
11、说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
12、在JAVA中如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。
例如,
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
System.out.println(“i=” + i + “,j=” + j);
if(j == 5) break ok;
}
}
另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,
要在二维数组中查找到某个数字。
int arr[][] = {{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length && !found;i++) {
for(int j=0;j<arr[i].length;j++){
System.out.println(“i=” + i + “,j=” + j);
if(arr[i][j] == 5) {
found = true;
break;
}
}
}
13垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
14.GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的 地方,忘记或 者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC 功能可以自动监测对象是否超过 作用域从而达到自动回收内存的目的,Java语言没有 提供释放已分配内存的显式操作方法。
15、父类的构造方法是否可以被子类覆盖(重写)?
父类的构造方法不可以被子类覆盖,因为父类和子类的类名是不可能一样的。
16.Java中如何跳出多重嵌套循环?
在最外层循环前加标记A,利用break A;可以跳出循环
17.java中会存在内存泄露吗?
理论上java不会存在内存泄露的问题,应为有垃圾回收机制(GC).然而在实际开发中,可能会存在 无用但可达的对象,这些对象不能被GC回收,因此会导致内存泄露. 例如hibernated的Session中 的对象属于持久态,垃圾回收器不会回收这些对象,这些对象中有可能存在无用的垃圾对象.如果关闭 不及时,一级缓存就可能导致内存泄露.
18.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中 的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数 个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以 改变返回值的类型。
19.abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建 一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。 不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指 向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它 们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实 现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可 通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接 口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定 义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方 法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象 类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换 到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了 接口。 5.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可 返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到 方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变, 但对象的引用是永远不会改变的。
20.java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding 是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 7.是否可以从一个static方法内部发出对非static方法的调用? 不可以,如果其中包含对象的method();不能保证对象初始化. 当类的字节码被加载到内存的时候,静态变量和静态方法就已经被分配了相应的内存空间,但是实例方法和实例成员变量还没有被分配内存空间(只有在创建了新的对象的时候才分配),所以不能去访问一个可能不存在的东西。
21."=="和 equals 方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存 储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作 符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块 内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。 equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相 同,它比较的两个对象是独立的。例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回true。 在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用 equals 方法。 如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object 类的 equals 方法的实现
代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的
22.Java中,什么是构造函数?什么是构造函数重载?
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
23.Java支持多继承么?
不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
24.接口和抽象类的区别是什么?
Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于: 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。 类可以实现很多个接口,但是只能继承一个抽象类 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。 抽象类可以在不提供接口方法实现的情况下实现接口。 Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。 Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
25.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句: final StringBuffer a=new StringBuffer("immutable"); 执行如下语句将报告编译期错误: a=new StringBuffer(""); 但是,执行如下语句则可以通过编译: a.append(" broken!"); 有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象: public void method(final StringBuffer param){ } 实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象: param.append("a");
26、静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
27、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
28、int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始 数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原 始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的 数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对 象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
线程
1、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常 操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能 发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
2.sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其 他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象 的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定 池准备获得对象锁进入运行状态。
3.同步和异步有何异同,在什么情况下分别使用他们?
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者 正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行 同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序 等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效 率。
4.数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
5.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象
的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
6.Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一 个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标 越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。 另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并 自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Throwable的子类。
7.请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的 唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁, 而是让它们竞争。
8.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify
9.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出
他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于 InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
10.什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流 化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列 化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的 方法,implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流
(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
11.启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这 意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产 生必须退出的标志来停止一个线程
12.进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
线程的划分小于进程,线程隶属于某个进程。 进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能占有这些资源的。 进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。 进程在执行的过程中,包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制
13.概括的解释下线程的几种可用状态。
1)新建( new ):新创建了一个线程对象。
2) 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
3) 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。
4) 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。 当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。
5) 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。
14.hashCode()和equals()方法的重要性体现在什么地方?
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
15.throw和throws有什么区别?
throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。
16.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify
17.运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
18.说出ArrayList,Vector, LinkedList的存储性能和特性.
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
19.sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间(休息),把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,时间到了会继续运行。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
20.Set里的元素能重复吗?那么用什么方法区分是否重复?
Set里的元素是不能重复的,如果重复就重复的就不加到里面。用iterator()方法来区分 重复与否。应该覆盖equals()判断两个Set是否相等。
21.什么是线程池? 为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。
22.说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端 程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接
23. 多线程编程的好处是什么?
在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。
24. 用户线程和守护线程有什么区别?
当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。
25. 你对线程优先级的理解是什么?
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。
26. 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?
线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。
27.线程之间是如何通信的?
当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()notify()notifyAll()方法可以用于线程间通信关于资源的锁的状态。点击这里有更多关于线程wait, notify和notifyAll.
28. 什么是死锁(Deadlock)?如何分析和避免死锁?
死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。 分析死锁,我们需要查看Java应用程序的线程转储。我们需要找出那些状态为BLOCKED的线程和他们等待的资源。每个资源都有一个唯一的id,用这个id我们可以找出哪些线程已经拥有了它的对象锁。 避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常办法,阅读这篇文章去学习如何分析死锁。
jQuery , ajax
1.请简要说明jQuery框架的显著特点。
jQuery强调的理念是写的少,做的多(write less,do more)。其主要特点有:轻量级、强大的选择器、漂亮的DOM操作封装、可靠的事件处理机制、完善的Ajax处理、出色的浏览器兼容性、链式操作方式、丰富的插件支持、开源产品。
2.eval是做什么的?
eval功能是把对应的字符串解析成JS代码并运行;但不安全,非常耗性能。
3.null与undefined的区别?
Undefined类型只有一个值,即undefined,当声明的变量还未被初始化时,变量的默认值为undefined。Null类型也只有一个值,即null,null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
4.谈谈对this对象的理解。
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。但是有一个总原则,那就是this指的是调用函数的那个对象。
5.use strict是什么意思?
表示代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的。如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常。如果在运行期出现了违反严格模式的代码,则抛出执行异常。
6.简述new操作符的功能。
(1)创建一个空对象,使用this变量引用该对象,同时还继承了该函数的原型 (2)属性和方法被加入到this引用的对象中。 (3)新创建的对象由this所引用,并且最后隐式的返回this。
7.描述typeof关键字的功能。
typeof可用来判断一个变量是否为空或是什么类型的变量。typeof一般只能返回如下几个结果:number、boolean、string、function、object、undefined。
8.描述instanceof关键字的功能。
instanceof可用来判断一个变量是否为空或是什么类型的变量。如果想判断一个变量是否某个对象的实例建议使用instanceof关键字。
9.简述hasOwnProperty函数的功能。
hasOwnProperty函数是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
10.简述一下isPrototypeOf函数的功能。
isPrototypeOf函数是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。
11.谈谈对JSON的了解。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。其是基于JavaScript的一个子集,具有数据格式简单,易于读写,占用空间小的特点。
12.Ajax是什么?
AJAX即“Asynchronous Javascript+XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
13.同步请求和异步请求的区别?
同步:提交请求→等待服务器处理→处理完毕返回,这个期间客户端浏览器不能干任何事。
异步:请求通过事件触发→服务器处理(这是浏览器仍然可以作其他事情)→处理完毕。
14.jQuery如何解决跨域问题?
借助JSONP这个非官方的协议,其允许在服务器端集成script tags返回至客户端,通过callback的形式实现跨域访问JSONP即JSON with Padding。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。
15.异步加载的方式有哪些?
(1)defer,只支持IE;
(2)async;
(3)创建script,插入到DOM;
16.如何编写高性能的jQuery代码?
定义jQuery变量的时候添加var关键字;DOM操作请务必记住缓存(cache);尽量使用链式操作;尽量把一些代码都整合到一起;避免使用全局类型的选择器;尽量使用.on方法,因为其它任何方法都是最终使用.on方法来实现的;尽量使用最新版本的jQuery框架类库。
17.描述基于class的选择器与基于id选择器在性能上的区别。
基于class的选择性的性能相对于基于id选择器开销很大,因为其需要遍历所有DOM元素。
18.jQuery链式调用的最大优点是什么?
避免频繁操作的DOM,链式调用可以实现先缓存再操作。
19.一句话说明内存泄漏的定义。
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
20.那些操作会造成内存泄漏?
给DOM对象添加的属性是一个对象的引用。
DOM对象与JS对象相互引用。
给DOM对象用attachEvent绑定事件。
从外到内执行appendChild,这时即使调用removeChild也无法释放。
反复重写同一个属性会造成内存大量占用。
21.documen.write和innerHTML的区别?
document.write只能重绘整个页面,innerHTML可以重绘页面的一部分。
22.jQuery框架的源码看过吗?能不能简单说一下它的实现原理?
jQuery框架通过改变javascript编码方式来创建了全新的编程理念。譬如关于jQuery声明的流程:先查找(创建)jQuery对象,然后调用jQuery对象的方法完成我们需要完成的工作。jQuery就是以这种可以说是最简单的编码逻辑来改变javascript编码方式的,这个流程就是jQuery的编码逻辑核心。
23.jQuery中如何将对象转化为json字符串,然后再转化回来?
可以通过JSON.stringify方法把一个对象转换成json字符串,再通过JSON.parse方法把一个json字符串解析成对象。
24.描述一下.get()、[]和.eq()方法的区别。
eq返回原生jQuery对象,截取某些el元素生成jQuery新对象;get和[]返回的都是原生的DOM对象,原理一致;get和[]区别是get是通过jQuery对象的方法获取,[]是根据jQuery是一个数组对象获取。
25.描述一下.delegate()和.live()方法的区别。
delegate方法指定了委托对象,live方法委托给了jQuery的context,1.9版本以后用on方法代替了。
26.描述一下.attr()和.prop()方法的区别。
attr()方法是操作属性节点,.prop()方法是操作获取到的对应js对象的属性。在遇到要获取或设置checked、selected、readonly和disabled等属性时,用prop方法显然更好。.prop()方法更高效,因为.attr()方法要访问DOM。
27.jQuery中的load方法一般怎么用的?
load方法一般在载入远程HTML代码并插入到DOM中的时候用,通常用来从Web服务器上获取静态的数据文件。如果要传递参数的话,可以使用$.get()或$.post()方法。
ssm框架
1. JDBC 跟 Mybatis的区别?
答案:
1.Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
2.Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
3.MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
4.JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。
2. 简述一下事务以及事务的特性?
答案:
1.事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
2.事务具有4个特性,缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
3.原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
4.一致性:事务执行时,是从一个一致状态变成另一个一致状态。
5.隔离性:一个事务的执行,不受其他事务(进程)的干扰。
6.持久性:事务一旦提交,对数据库的改变是持久的。
3. 简述Spring事务注解配置过程?
答案:
1.正确配置数据库数据源
2.配置事务管理器
3.配置注解驱动事务
4.在需要事务支持的方法上使用事务注解@Transactional
4. 简述Spring中BeanFactory和ApplicationContext作用?
答案:
1.ApplicationContext 是 BeanFactory接口的子接口
2.BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
3.ApplicationContext是对BeanFactory的扩展,提供了更多的功能
o国际化处理
o事件传递
oBean自动装配
o各种不同应用层的Context实现
4.结论:开发中尽量使用ApplicationContext 就可以了
5. Spring框架的优点都有什么?
答案:
1.简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
2.解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
3.支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
4.集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
5.轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
6. 构造器注入和 setter 依赖注入,那种方式更好,为什么?
答案:
1.每种方式都有它的缺点和优点。
2.构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
3.如果使用 XML 来描述依赖,Setter 注入的可读写会更强。
4.经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
5.一般情况下尽量使用setter就可以了。
7. 依赖注入和工厂模式之间有什么不同?
答案:
1.虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工厂模式更清晰。
2.通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。
3.使用工厂模式,你的类需要通过工厂来获取
8. 列出IOC的3种主要注入方式?
答案:
1.构造方法注入;
2.setter属性注入;
3.接口注入。
9. 简述Spring中常用的几种Advice注解?
答案:
1.@Before:在方法执行前处理
2.@AfterReturning:在方法正常执行后处理
3.@AfterThrowing:在方法执行期间抛出异常时处理
4.@After:在方法执行前后无论是否有异常也处理
5.@Around:在方法前后进行处理
10. 什么是Spring 的AOP,AOP的工作原理是什么?
答案:
1.面向切面编程简称AOP
2.Spring AOP 是使用动态代理在运行期间植入增强的功能代码。
3.Spring的一个关键的组件就是AOP,其中最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
4.允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强
11. 什么是IOC/DI,实现原理是什么?
答案:
1.IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
2.DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
12. 简述Spring中常用注解?
答案:
1.@Component :标准一个普通的spring Bean类。
2.@Repository:标注一个DAO组件类。
3.@Service:标注一个业务逻辑组件类。
4.@Controller:标注一个控制器组件类。
5.@Resource:注入组件
13. 简述SpringMVC的请求流程?
答案:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5.执行处理器(Controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet响应用户
14. 简述什么是MVC?
答案:
1.MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
2.将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
3.Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
4.View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
5.Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
15. 简单的说一下spring的生命周期?
答案:
1.实例化BeanFactoryPostProcessor实现类
2.执行BeanFactoryPostProcessor的postProcessBeanFactory方法
3.实例化BeanPostProcessor实现类
4.实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
5.执行Bean的构造器
6.执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
7.为Bean注入属性
8.调用BeanNameAware的setBeanName方法
9.调用BeanFactoryAware的setBeanFactory方法
10.执行BeanPostProcessor的postProcessBeforeInitialization方法
11.调用InitializingBean的afterPropertiesSet方法
12.调用的init-method属性指定的初始化方法
13.执行BeanPostProcessor的postProcessAfterInitialization方法
14.执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
15.容器初始化成功,执行正常调用后,下面销毁容器
16.调用DiposibleBean的destory方法
17.调用的destroy-method属性指定的初始化方法
16. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
答案:
1.ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
2.ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
3.开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
17. Spring里面applicationContext.xml文件能不能改成其他文件名?
答案:
1.ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
2.缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。
3.你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
18. SpringMVC如何解决线程安全性问题?
答案: 1. SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。 2. 因此尽量避免在Controller中使用实例变量 3. 使用ThreadLocal变量。
19. 什么是事务传播?
答案:
1.事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
20. 介绍一下Spring的事物管理
答案:
1.事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
2.开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
3.spring提供了几个关于事务处理的类:
1.TransactionDefinition //事务属性定义
2.TranscationStatus //代表了当前的事务,可以提交,回滚。
3.PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
21. 解释一下Spring AOP里面的几个名词
答案:
1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
2.连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
3.通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
4.切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
5.引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
6.目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
7.AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
8.织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
22. SpringMVC如何实现文件上载步骤?
1.RFC1867 规定了HTTP文件上载协议
2.客户端
oform标签中使用属性 ENCTYPE=“multipart/form-data” METHOD=POST
o使用 input type=file 标签选择文件
3.服务器端
o导入commons-fileupload 组件
o配置文件上载处理器
o在控制器方法声明MultipartFile 类型变量接收上载文件。
23. SpringMVC如何实现Excel文件下载?
1.利用 Apache POI API生成Excel
2.在控制器中设置 ContentType 为Excel文件类型
3.在控制器中设置 Content-Disposition 设定下载文件名