龙空技术网

最新Java面试题及知识点(7)

江南烟雨随风 400

前言:

现在看官们对“html和jsp交互计算阶乘”大致比较关切,咱们都需要分析一些“html和jsp交互计算阶乘”的相关文章。那么小编在网络上搜集了一些对于“html和jsp交互计算阶乘””的相关资讯,希望大家能喜欢,大家一起来学习一下吧!

53.请问你在什么情况下会在你的JAVA代码中使用可序列化?为什么放到HttpSession中的对象必须要是可序列化的?

因为在我们的系统中,某些类实例化为对象后,将会在网络中传送。而我们知道,网络传输只能2进制文件。也就是说,当你的对象会被通过网络来传送时,那就必须要序列化。

放到HttpSession中的对象,必定会被使用网络来传输的。

54.为什么在重写了equals()方法之后也必须重写hashCode()方法?

为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode却不相同。

为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这样效率的提高是很明显的,一个很好的例子就是在集合中的使用;

55.sleep()和wait()有什么区别?

这两个方法来自不同的类,sleep来自Thread类,和wait来自Object类。

最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

synchronized(x){

x.notify() //或者wait()

}

56.请阐述一下你对JAVA多线程中“锁”的概念的理解

一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁);

如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);

线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。

这样就保证了同步代码在统一时刻只有一个线程在执行。

57.所有的递归实现都可以用循环的方式实现,请描述一下这两种实现方式各自的优劣。并举例说明在什么情况下可以使用递归,而在什么情况下只能使用循环而不能使用递归?

递归算法:

优点:代码简洁、清晰,并且容易验证正确性

缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。

循环算法:

优点:速度快,结构简单。

缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

总结:

1. 一般递归调用可以处理的算法,也可以通过循环去解决,但是低效

2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,递归效率未必低于循环。

3.递归和循环两者完全可以互换。如果用到递归的地方可以很方便使用循环替换,而不影响程序的阅读,那么替换成递归往往是好的。(例如:求阶乘的递归实现与循环实现。)

58.请阐述一下你对“面向接口编程”的理解

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容

接口的好处就是可以不用提供实现细节,而只是提供该接口应该具备怎样的行为,或者说具有什么方法.

利于扩展

59.在J2EE中有一个“容器(Container)”的概念,不管是EJB、PICO还是Spring都有他们各自实现的容器,受容器管理的组件会具有有生命周期的特性,请问,为什么需要容器?它的好处在哪里?(自己的理解)

容器充当中间件的角色,提供运行环境。例如在WEB容器中,容器给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接与容器中的环境变量接口交互,不必关注其它系统问题。而在EJB中,只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。

60.简述你对IoC(Inversion of Control)的理解.

一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了.

而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的 容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联.

61.下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?

import java.util.LinkedList;

class Stack{

LinkedList list = new LinkedList();

public synchronized void push(Object x) {

synchronized (list) {

list.addLast(x);

notify();

}

}

public synchronized Object pop() throws Exception {

synchronized (list) {

if (list.size() <= 0) {

wait();

}

return list.removeLast();

}

}

}

我的答案:

出现问题:当先调用pop()方法且此时堆栈中没有元素(List中没有元素),之后再调用push()时会一直处于等待状态。

问题说明:这里有可能会死锁,因为当外界调用pop(),但堆栈中没有元素,即list.size() <= 0,Stack进入停滞状态(wait())(***注意***:此时list被锁定了,但Stack不会被锁定),此时外界仍然可以进入push()(因为wait()不会锁定Stack),但此时在push()中调用list.addLast()时,因为list被锁定,所以无法调用。

修改方法:按照这思路,Stack和list都加锁,是无解的。可以把list的synchronized去掉,因为有同步方法不需要在用同步代码块。

另外,这里还有个不太相关的问题:pop()里的 if (list.size() <= 0){ wait(); } 应该改为 while (list.size() <= 0){ wait(); },这样可以保证wait()被唤醒后重新检查list.size()。

喜欢的请点关注,有问题请留言,我也正在学习中

标签: #html和jsp交互计算阶乘