2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
==============================================================================
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try
{
b += 10;
return b;
}
catch(RuntimeException e)
{
}
catch(Exception e2)
{
}
finally
{
b += 10;
return b;
}
}
}
A.10
B.20
C.30
D.40
解析:
答案:C
如果finally块中有return语句的话,它将覆盖掉函数中其他return语句。
9.若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()
======================================================================================================================
A.char
B.int
C.double
D.float
解析:
答案:C
不同类型运算结果类型向右边靠齐。
char < short < int < float < double
===========================================================================
A.如果两个对象的hashcode相同,那么它们作为同一个HashMap的key时,必然返回同样的值
B.如果a,b的hashcode相同,那么a.equals(b)必须返回true
C.对于一个类,其所有对象的hashcode必须不同
D.如果a.equals(b)返回true,那么a,b两个对象的hashcode必须相同
解析:
答案:D
hashCode()方法和equals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。
那么equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。
那么hashCode()既然效率这么高为什么还要equals()呢? 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,
所以我们可以得出:
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
============================================================================
public class Demo {
public static String sRet = “”;
public static void func(int i)
{
try
{
if (i%2==0)
{
throw new Exception();
}
}
catch (Exception e)
{
sRet += “0”;
return;
}
finally
{
sRet += “1”;
}
sRet += “2”;
}
public static void main(String[] args)
{
func(1);
func(2);
System.out.println(sRet);
}
}
A.120
B.1201
C.12012
D.101
解析:
答案:B
- 调用func(1),if不符合,直接进入finally,sRet=“1"
- finally语句中没有返回值,故继续向下执行,sRet=“12”
- 调用func(2),if符合,sRet=“120”,此时有返回值!!!
- 调用finally语句,sRet=“1201”
- 因为已经有返回值了,finally之后的语句也不再执行,sRet=“1201”。
12.在java7中,下列不能做switch()的参数类型是?
============================================================================================
A.int型
B.枚举类型
C.字符串
D.浮点型
解析:
答案:D
switch语句后的控制表达式只能是short、char、int、String、long整数类型和枚举类型,不能是float,double和boolean类型。String类型是java7开始支持。
================================================================================
A.final
B.static
C.abstract
D.public
解析:
答案:C
- 接口中字段的修饰符:public static final(默认不写)
- 接口中方法的修饰符:public abstract(默认不写)
abstract只能修饰类和方法 不能修饰字段
14.下面有关java classloader说法错误的是?
===========================================================================================
A.Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
B.ClassLoader使用的是双亲委托模型来搜索类的
C.JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
D.ClassLoader就是用来动态加载class文件到内存当中用的
解析:
答案:C
一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:
- Bootstrap ClassLoader 负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
- Extension ClassLoader 负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
- App ClassLoader负责加载当前java应用的classpath中的所有类。
classloader 加载类用的是全盘负责委托机制。 所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
所以,当我们自定义的classloader加载成功了 com.company.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。
比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。
补充:
1. 什么是类加载器?
把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
2. 有哪些类加载器,分别加载哪些类
类加载器按照层次,从顶层到底层,分为以下三种:
(1)启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类
(2)扩展类加载器 : 它用来加载 Java 的扩展库。
(3) 应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。
3. 双亲委派模型
我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。
4. 双亲委托模型的工作原理
是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。
5. 使用双亲委派模型好处?(原因)
第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。
第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。
===========================================================================
class X{
Y y=new Y();
public X(){
System.out.print(“X”);
}
}
class Y{
public Y(){
System.out.print(“Y”);
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print(“Z”);
}
public static void main(String[] args) {
new Z();
前端面试题汇总
JavaScript
性能
linux
前端资料汇总