牛客错题集1

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

8.执行下列代码的输出结果是( )

==============================================================================

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

10.下面论述正确的是()?

===========================================================================

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()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

11.下面程序的输出结果为()

============================================================================

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开始支持。

13.以下代码可以使用的修饰符是:()

================================================================================

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已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。

15.以下程序执行的结果是:

===========================================================================

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

前端资料汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值