Java 面试(二) 深入理解

 

  1、哪些情况下的对象会被垃圾回收机制处理掉?

  当一个对象不再使用时,应该回收对象占用的内存空间,从而提高内存利用率。Java中内存的回收由垃圾回收器(Garbage Collection,GC)自动处理,GC只负责内存相关的清理,其它资源必须手动释放。

  Java的垃圾自动收集机制:JVM查看堆内存,区分出正在使用的对象和未使用的对象,接着删除未使用的对象。

  正在使用的对象是指程序有一个指向该对象的引用;未使用的对象则是指不被程序的任何部分持有引用的对象。

 

  2、讲一下常见编码方式?

  常见的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等

  参考:深入分析Java中的中文编码问题

 

  3、utf-8编码中的中文占几个字节;int型几个字节?

  UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

  Java中int类型是4个字节存储

 

  4、静态代理和动态代理的区别,什么场景使用?

   静态代理:由程序员创建或特定工具自动生成源代码,再对其编译,在程序运行前,代理类的.class文件就已经存在了。一个代理类只能为一个接口服务。

  动态代理:动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。可以通过一个代理类,完成所有代理工作,不需要向静态代理需要一个一个实现接口来代理。

  参考阅读:Java的动态代理机制     静态代理与动态代理

 

  5、Java的异常体系

     所有非正常情况分为两种:异常(Exception)和错误(Error),均继承自类Throwable。

  错误:是指虚拟机相关问题如系统崩溃、虚拟机出错等,这类错误无法恢复,程序也不用捕获了。

  异常:异常分为两大类:受查异常(Checked)和运行时异常(Runtime)。

  运行时异常:

  所有运行时异常类和它的子类的对象被称为运行时异常。运行时异常不需要显示声明抛出,如果程序需要捕捉运行时异常,可以用try…catch块。   

  受查异常:

  不是运行时异常实例都归为受查异常,它是可以被修复的异常。程序必须显示地处理受查异常,如果没有处理,在编译时就无法通过。

  必须用try…catch块捕获,在catch中修复。当方法不知道如何处理,在定义方法时声明抛出(throws)异常,由上一级调用处理。

 

  6、谈谈你对解析与分派的认识。

  深入理解JVM。 

 

  7、修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?

  

 

  8、Java中实现多态的机制是什么?

  编译时多态、运行时多态。

  实现方式:继承、接口。

  继承中:继承关系、方法重写、向上转型。

 

  9、如何将一个Java对象序列化到文件里?

  

 

  10、说说你对Java反射的理解(反射的用途和实现)

  (1)反射的基础是因为在运行状态中,JVM能够知道对象的所有属性和方法,并且能够调用它的任意一个方法或访问其任一属性。反射机制使得程序可以在运行时动态加载、查看和使用编译期间完全未知的类(对象)

   (2)反射的通常用途:

  • 用于程序检查工具和调试器,它能获取程序在运行时刻的内部结构。只需要短短十几行代码,就可以遍历出对象所属类的结构,包括构造方法、声明的属性和定义的方法和修饰符等。
  • 在运行时刻与注解配合,动态改变对象的行为,例如,为特定对象添加日志、权限控制等操作。

 

  11、说说你对Java注解的理解(自定义注解的使用场景和实现)

 

 

  12、说说你对依赖注入的理解

 

 

  13、说一下泛型原理,并举例说明

 

 

  15、String为什么要设计成不可变的?

  Why              

   Why2    

  

  16、Object类的equal和hashCode方法重写,为什么?

 

 

 

posted @ 2018-03-27 01:57  爆炸的果核  阅读(141)  评论(0编辑  收藏  举报