码迷,mamicode.com
首页 > 编程语言 > 详细

java中级面试题

时间:2015-04-28 18:33:16      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:面试题   java   

1、序列化有什么用?为什么要用序列化?我回答是按照中国大多数BLOG上说的那样回答的,貌似他们不赞同。

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。

可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。

序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,

implements Serializable只是为了标注该对象是可被序列化的,

然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,

接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。  

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,

然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。是对象永久化的一种机制。

确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,

但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,

可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。
对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。

譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。

2、new一个JAVA对象的时候,内存是怎么分配的?

new 对象的时候,对象存在堆中,对象引用则存在栈中

◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

◆堆:存放用new产生的数据

◆静态域:存放在对象中用static定义的静态成员

◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间


3、容器是怎么管理session的?

 参考 http://jingyan.baidu.com/article/25648fc1bf0da29191fd0020.html

4、Spring的AOP是用什么原理实现的?我回答动态代理,他说还有一个,不知道是什么?

Spring AOP是依赖JDK动态代理和CGLIB代理实现的。

在Spring中,有接口时将采用JDK的方式实现proxy代理对象,当没有接口时,将采用cglib中的方式实现prixy代理对象。

    JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
   
     CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。

CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。   

1、JDK方式:PersonService为接口,PersonServiceBean为实现类

  public class JDKProxyFactory implements InvocationHandler {
   private Object targetObject;
   
   public Object createProxyIntance(Object targetObject)
   {
    this.targetObject=targetObject;
    return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), 
      this.targetObject.getClass().getInterfaces(), this);
   }

public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable {
    PersonServiceBean person=(PersonServiceBean)this.targetObject;
    Object result=null;
     if(person.getUser()!=null)
     { 
      result = method.invoke(targetObject, args);
      }
   return result;
}
}

2、使用CGlib包实现:PersonServiceBean为实现类,   而没有PersonService接口

public class CGlibProxyFactory implements MethodInterceptor{
  private Object targetObject;
  
  public Object createProxyInstance(Object targetObject)
  { 
   this.targetObject=targetObject;
   Enhancer enhancer=new Enhancer();
   enhancer.setSuperclass(this.targetObject.getClass());//设置目标类的子类,该子类会覆盖所有父类中的非final方法
   enhancer.setCallback(this);//设置回调
  return  enhancer.create();
  }

public Object intercept(Object proxy, Method method, Object[] args,
  MethodProxy methodProxy) throws Throwable {
  PersonServiceBean person=(PersonServiceBean)this.targetObject;
    Object result=null;
     if(person.getUser()!=null)
     { 
      result = methodProxy.invoke(targetObject, args);
      }
 return null;
}
}

5、JVM的工作原理?注意不是工作流程,这谁都知道

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 
1.创建JVM装载环境和配置 
2.装载JVM.dll 
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例 
4.调用JNIEnv实例装载并处理class类。


持续更新...

java中级面试题

标签:面试题   java   

原文地址:http://blog.csdn.net/jj88888/article/details/45337443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!