面试题

已有 68 次阅读2017-7-8 16:56 |系统分类:学习纪录

  1. 什么是ClassLoader?
    1. Classloader 类加载器,用来加载Java类到 Java 虚拟机中的一种加载器。
  2. 什么是AppClassLoader?
    1. Application ClassLoader,应用程序类加载器,负责加载应用程序自身的类
  3. 什么时候用assert(断言)?
    1.  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,
    2. 使用断言的几个原则
      1. 使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
      2. 使用断言对函数的参数进行确认。 
      3. 在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
      4. 一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
  4. final/finally/finalize的区别
    1. final
      1. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
    2. finally
      1. finally?再异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。
    3. finalize
      1. finalize?方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
  5. 什么是Reflection?其他语言有这种特点吗?
    1. Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。
  6. &和&&的区别。
    1. &是位运算符。&&是布尔逻辑运算符。
  7. Java是传值还是传址?
    1. java中所谓的“传址”其实也是一种传值(或者说java中没有传址)。我们给方法“传址”时实际上是传递的是实参的地址的一个拷贝,它跟我们的实参(这里把他们暂时都理解为指针)所指向的地址虽然相同,但他们却是两个不同的实体。所以当我们在方法中对形参进行重新赋值时,改变的只是形参所指向的地址,而实参所指向的地址没有被改变,所以其内容不变。
  8. 如何实现Java的序列化?
    1. 序列化理解成“打碎”是可以的,不过在书本上的名词就是将对象转换成二进制。
    2. 序列化是将对象状态转换为可保持或传输的格式的过程。
    3. 实现方式是实现java.io.Serializable接口.这个接口不需要实现任何具体方法.只要implements java.io.Serializable 就好了
  9. Java中垃圾搜集器相对以前语言的优势是什么?
    1. 过去的语言(如C语言)要求程序员显示的分配内存、释放内存。程序在需要时分配内存,不需要时释放内存。但是这种做法常常会引起“ 内存泄漏”, 即是说,由于某种原因是分配的内存始终没有得到释放。如果该任务不断地重复,程序最终会耗尽内存并异常终止,至少无法正常的运行下去。相比之下,java 不要求程序员显式的分配内存和释放内存,避免了很多的潜在问题。java在创建对象时自动分配内存,并当该对象的引用不存在是释放这块内存。
  10. Java如何管理内存?
    1.  Java的内存管理就是对象的分配和释放问题。(两部分)
    2. 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类 型除外),所有的对象都在堆 (Heap)中分配空间。
    3. 释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
  11. 什么是Java内存泄漏?
    1. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连(也就是说仍存在该内存对象的引用);其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
  12. 内存泄漏主要由什么引起?
    1.  在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连(也就是说仍存在该内存对象的引用);其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
  13. 如何实现clone方法?浅克隆和深克隆的区别?
    1. 【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。
    2. 【深克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。
  14. 对象是一个类的实例,什么时候需要创建实例,什么时候不需要,什么情况下类无需创建实例也可以直接使用?
  15. 说明static nested class 和inner class的区别?
    1. NestedClass(一般是C++的说法),InnerClass(一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http://www.frontfree.NET/articles/services/view.asp?id=704&page=1注:静态内部类(InnerClass)意味着
      1. 创建一个static内部类的对象,不需要一个外部类对象
      2. 不能从一个static内部类的一个对象访问一个外部类对象
  16. 请说明HashMap和HashTable的区别?
    1. HashTable的key和value都不允许为null值,而HashMap的key和value则都是允许null值的。这个其实没有好坏之分,只是Sun为了统一Collection的操作特性而改进的。HashTable有一个contains(Object value)方法,功能上与containsValue(Object value)一样,但是在实现上花销更大,现在已不推荐使用。而HashMap只有containsValue(Object value)方法。HashTable使用Enumeration,HashMap使用Iterator。Iterator其实与Enmeration功能上很相似,只是多了删除的功能。用Iterator不过是在名字上变得更为贴切一些。模式的另外一个很重要的功用,就是能够形成一种交流的语言(或者说文化)。有时候,你说Enumeration大家都不明白,说Iterator就都明白了
  17. 什么是多态?
    1. 按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
  18. 重载?重写?
    1. 重载
      1. 简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
        1. 特点
          1. 由于重载可以在同一个类中定义功能类似的函数,这给程序员管理类的相似函数提供了极大的方便。例如,在一个定义圆的类中,需要设定圆心和半径来确定一个圆对象,程序员不需要设定setRadius(float r)和SetPoint(float x,float y)两个不同名函数,而只需要设定一个CSetCicle函数名就够了。在这个简单的例子中重载并没有明显的优势,可是当一个类中相似功能函数有几十、上百个的时候,重载的优势就显现出来了,这时程序员不需要去记这么繁多的函数名,可以把更多的精力放在程序本身上。重载的方法只属于子类。
      2. 重载
        1. Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖
          1. 必须是在继承里;
          2. 方法名、参数个数和参数类型 都必须相同;
          3. jdk1.5以后,返回值类型可以与父类相同,也可以与父类不同,但是要求返回值类型是父类的子类。如: 父类的返回值类型是Object类,子类的返回值可以是Object类的子类比如String
          4. 派生类重写的方法的访问权限不能低于基类的权限
          5. 派生类抛出的异常应该和基类相等或比基类更小
  19. Java里在类中用super调用父类构造函数时。为什么调用语句必须是子类的第一条语句?
    1. java类构造方式的执行顺是先构造父类,然后构造子类。要初始化子类必须先初始其父类。父类构造器调用就是用Super()来实现的,所以必须是Super。当然你可以不写,但是编译器默认会先执行Super。
  20. 匿名内部类是否可以继承其他类,是否可以实现接口?
    1. 匿名的内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
  21. 异常?
    1. 异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
  22. Java两大核心机制
    1. GC:垃圾回收机制,对象内存的自动回收
    2. JVM:虚拟机
  23. servlet的生命周期
    1. 实例化:每个Servlet只会被实例化一次
      1. 通过配置可以tomact启动的时候实例化该Servlet
    2. 初始化:只会被初始化一次,实例化之后马上就被初始化
    3. 服务(处理请求及响应):每次请求到来执行服务对应的方法
    4. 销毁

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

Copyright;  ©2015-2017  知了堂学习社区  Powered by  知了堂Edu!     ( 蜀ICP备16011312号-1 )