java核心问题总结

时间:2021-03-19 01:23:28

Java 核心概念

  • equals 与 hashCode 的异同点在哪里?Java 的集合中又是如何使用它们的。

  • Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法比较的的是值,但object类中很明显是对两个对象的地址值进行的比较(即比较引用是否相同).Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。    Java对于eqauls方法和hashCode方法联系

    1、如果两个对象相同,那么它们的hashCode值一定要相同;

    2、如果两个对象的hashCode相同,它们并不一定相同上面说的对象相同指的是用eqauls方法比较。

  • 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?

  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
     3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
  • 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里?

  • final 与 static 关键字可以用于哪里?它们的作用是什么?

  • final类不能被继承,没有子类,final类中的方法默认是final的。
            final方法不能被子类的方法覆盖,但可以被继承。
            final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
            final不能用于修饰构造方法。
  • static变量\静态方法\static代码块
  • 阐述下 Java 中的访问描述符(Access Modifiers)。

  • 描述下 String,StringBuilder 以及 StringBuffer 区别。

  • String:不可变的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原String对象GC回收。
    StringBuffer 字符串变量(线程安全),适用于多线程程序中,保证同步性。
    StringBuilder 字符串变量(非线程安全),适用于单线程程序中,不保证同步性
  • 接口(Interface)与抽象类(Abstract Class)的区别在哪里。

  •  1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
      2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
      3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 
      4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
      5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 
      7.接口中的方法默认都是 public,abstract类型的。

     

  • 覆盖(Overriding)与重载(OverLoading)的区别在哪里。

  • Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。
    
    方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
  • 异常分为哪几种类型?以及所谓的handle or declare原则应该如何理解?

  • 非运行是异常和运行时异常
  • 简述垃圾回收器的工作原理。

    1. GC的工作原理: 引用计数,标记复制"引用计数"是一种简单但速度很慢的垃圾回收技术.所有对象都有一个引用计数器,当有引用连接时计数器加1,当引用离开作用域时或者被置于NULL时,计数器-1,垃圾回收器会在所有包含对象引用的列表上进行遍历,当发现某个对象的引用计数为0时,就释放占用的空间."标记复制"的运行机制,垃圾回收器遍历包含所有引用的列表,当发现存活的对象引用时做上标记,这样当遍历完所有对象引用并做上标记的时候,执行垃圾回收,将没有标记的对象堆空间释放.

    2. 垃圾回收机制的优点:Java的垃圾回收机制使得java程序员不用担心内存空间的分配,减少了内存溢出.但同时也牺牲了一定的性能.

  • 你是如何处理内存泄露或者栈溢出问题的?

  • 内存溢出,一般是指堆栈溢出,通常有以下可能及解决方法: 1、程序本身有bug。这种情况,通常出在程序的调试阶段和beta测试版中。换正式版一般可以解决。 2、系统太新,程序太老。比如xp时代的程序在win10下运行,就经常会出现这种情况。
  • 内存泄露通常都是指针没有删除造成的。
    可以通过调试看看问题出在哪里,也可以使用vc内存泄露检测工具检测下。
  • 如何构建不可变的类结构?关键点在哪里?

  • 什么是 JIT 编译?

  • Java 8 / Java 7 为我们提供了什么新功能?即将到来的 Java 9 又带来了怎样的新功能?

    • 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:
      1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
      2 Redis支持数据的备份,即master-slave模式的数据备份。
      3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。