常见Java面试整理

  1. 接口的意义
    规范,可拓展,回调
  2. 抽象类的意义
    为其子类提供一个公共的类型,封装子类中重复的内容,定义抽象方法,子类虽然有不一样的实现,可是定义是一致的
  3. 内部类的做用
    内部类能够用多个实例,每一个实例都有本身的状态信息,而且与其余外围对象的信息相互独立。
    在单个外围类中,可让多个内部类以不一样的方式实现同一个接口,或者继承同一个类。
    建立内部类对象的时刻并不依赖于外围类对象的建立。
    内部类并无使人迷惑的“is-a”关系,他就是一个独立的实体。
    内部类提供了更好的封装,除了该外围类,其余类都不能访问
  4. 父类的静态方法是否能够被子类重写
    static静态的方法是属于类的,而继承和重写是相对于对象来讲的。
    若是子类中有父类中的静态方法,只能说是隐藏父类的静态方法
  5. java虚拟机的特性
    通常的高级语言若是要在不一样的平台上运行,至少须要编译成不一样的目标代码的,而引入了java虚拟机后,java代码在不一样的
    平台上运行不须要从新编译
  6. 哪些状况下的对象会被垃圾回收机制处理掉
    Java垃圾回收机制最基本的作法是分代回收,内存中的区域被划分红成不一样的世代,年轻,年老永久,当一个对象存活时间足够久的时候
    就会被复制到年老代中,对于不一样的世代可使用不一样的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究以后得出的统计规律。通常来讲,一个应用中的大部分对象的存活时间都很短。好比局部变量的存活时间就只在方法的执行过程当中。基于这一点,对于年轻世代的垃圾回收算法就能够颇有针对性。
  7. == 和 equals 的区别
    == 是一个操做符 而equals是一个方法,而且这个方法是Object中的方法,咱们能够经过重写来equals方法来实现咱们本身的比较逻辑
  8. 为何说对象的equals方法比较为true,那么他们的hashcode方法返回的int值也要相同?
    若是两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生一样的整数结果。
    若是两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不必定要产生相同的整数结果
    从而在集合操做的时候有以下规则:
    将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,若是不相等直接将该对象放入集合中。若是hashcode值相等,而后再经过equals方法判断要放入对象与集合中的任意一个对象是否相等,若是equals判断不相等,直接将该元素放入到集合中,不然不放入。
    回过来讲get的时候,HashMap也先调key.hashCode()算出数组下标,而后看equals若是是true就是找到了,因此就涉及equals
  9. String , StringBuffer , StringBuilder
    String : 字符串常量
    StringBuffer , StringBuilder :字符串变量
  10. Java多态的理解
    多态存在的三个必要条件:java

    1. 要有继承
    2. 要有重写
    3. 父类引用指向子类对象
  11. 线程的阻塞
  12. 里氏替换原则
    子类不能重写父类已经实现的方法
    子类重写父类的方法时,返回值必须比父类更严格
  13. try...finally try中有return时的执行顺序
    首先finally代码块里的代码是必定会执行的程序员

    1. 若是try中有return语句,会先将return的结果保存起来,而后执行finally中的代码,若是在finally中改变了要return
        的数据的值,也不会影响到return的值
    2. 若是在finally中写了return语句,那么就会返回return的值
  14. 常见的异常算法

    • ArithmeticException(算术异常)
    • ClassCastException (类转换异常)
    • IllegalArgumentException (非法参数异常)
    • IndexOutOfBoundsException (下标越界异常)
    • NullPointerException (空指针异常)
  15. 面向对象6原则一法则
    单一职责原则 : 说的就是高内聚,一个类只应该作一件事
    开闭原则 : 对拓展开发,对修改关闭 ,想要表达的意思是:把可能会修改的地方抽象出来(接口),具体的实现是能够改变和拓展的
    里氏替换原则 : 在用到父类的地方必定可用其子类代替,想要表达的是:同一个继承体系中的对象应该具备共同的行为特征
    依赖注入原则 :要依赖抽象,不要依赖具体的实现,为了实现这个原则,就要求咱们在编程的时候针对抽象类或者接口编程
    接口分离:不该该强迫程序依赖他们不须要的接口 一个接口不须要提供太多的行为,一个接口应该只提供一种对外的功能,不该该把全部的操做都封装到一个接口中。
    迪米特法则 :一个对象应该对象其余对象尽可能少的了解,意思是要咱们下降程序的耦合度
  16. sleep() 和 wait()的区别
    sleep()会让出cpu的执行时间一段时间,可是不会释放锁,若是在同步的环境中,有可能出现死锁
    wait是指在一个已经进入了同步锁的线程内,让本身暂时让出同步锁,以便其余正在等待此锁的线程能够获得同步锁并运行
  17. 何时使用同步
    当多个线程使用一个共享资源时,使用同步
  18. 何时使用异步
    当一个操做须要会费很长的时间去作,而且不但愿让程序等待方法的返回时,采用异步,这样效率更高
  19. 什么是内存泄漏
    程序员建立了一个对象,之后一直不使用这个对象了,可是这个对象一直被引用,即这个对象无用可是却没法被垃圾回收器回收
    例如:长生命周期的对象持有短生命周期对象的引用可能会发生内存泄漏,编程

    一个外部类对象返回了一个内部类的对象,这个内部类对象一直被引用了,即便那个外部类实例对象再也不被使用,但因为内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会形成内存泄露
相关文章
相关标签/搜索