1、==与Equals区别

  • ==
    • 如果比较的是基本数据类型,那么比较的是变量的值
    • 如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)
  • Equals

    • 如果没重写equals方法比较的是两个对象的地址值
    • 如果重写了equals方法后我们往往比较的是对象中的属性的内容
    • equals()方法最初在Object类中定义的,默认的实现就是使用==

      image.png

      2、什么是高内聚、低耦合

      使系统变更成本低,具备实现多功能的条件

  • 高内聚:系统的架构的完整尽可能少的依赖外部资源

    • 单个系统的维护、运行等尽可能低的影响、依赖于外部其它系统
  • 低耦合:系统内部各个模块间的依赖关系尽可能的低

    • 各个模块的维护的影响的范围小,整个系统的灵活性提高(系统的改变,即各个模块的增、删、改容易),降低系统的维护成本,能尽可能的提高系统的多功能性

      3、JDK和JRE的区别是什么?

  • Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。

  • Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。

    4、自动拆箱、装箱

  • 装箱:自动将基本数据类型转换为包装器类型

  • 拆箱:自动将包装器类型转换为基本数据类型 | 基本数据类型 | 包装器类型 | | —- | —- | | int(4字节) | Integer | | byte(1字节) | Byte | | short(2字节) | Short | | long(8字节) | Long | | float(4字节) | Float | | double(8字节) | Double | | char(2字节) | Character | | boolean(未定) | Boolean |
  1. Integer是int的包装类,int则是java的一种基本数据类型。
  2. Integer变量必须实例化后才能使用,int则不需要。
  3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
  4. Integer的默认值为null,int的默认值是0。
  5. int等基本类型的变量存储在栈中。

    5、Overload重载和Override重写

    Overload重载
    定义:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即参数个数、参数类型或参数顺序不同。重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
  • 方法名称必须相同;
  • 参数列表必须不同,即参数个数、参数类型或参数顺序中任有一个不同。
  • 方法的返回类型可以相同也可以不同,对此无限制。
  • 若仅满足方法的返回类型不同,不属于方法重载。

Override重写

  • 发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)。
  • 子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)。
  • 子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。
  • 如果子类想使用被隐藏的方法,必须使用关键字super。

    6、接口和抽象类的区别

  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

  • 类可以实现很多个接口,但是只能继承一个抽象类
  • 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

    7、同步方法和同步代码块的区别是什么?

    在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
    同步方法比同步代码块更高效,但是它们的功能是一样的。

8、final, finally, finalize的区别。

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

    9、运行时异常与一般异常有何异同?

  • 运行时异常(runtime exception):也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

    • ConcurrentModificationException(并发修改异常), NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组下标越界),ClassNotFoundException(指定的类不存在)
    • 出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
  • 一般异常(checked exception):checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。

    10、String 、StringBuilder、StringBuffer的区别

    image.png
    在执行速度上:Stringbuilder->Stringbuffer->String
    String是字符串常量
    Stringbuffer是字符串变量
    Stringbuilder是字符串变量
    StringBuilder:线程非安全的
    StringBuffer:线程安全的
    如果操作少量的数据用String
    单线程下操作大量的数据用StringBuilder
    多线程下操作大量的数据用StringBuffer
    字符明显是变化的就别用String

11、java八大基础数据类型及其长度

image.png

12、封装、继承、多态

多态:继承、重写、向上转型

13、try、catch、finally加上return的执行顺序

  1. 不管有木有出现异常,finally块中代码都会执行;
  2. 当try和catch中有return时,finally仍然会执行;
  3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
  4. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。


举例:

  1. 情况1:try{} catch(){}finally{} return;
    1. 显然程序按顺序执行。
  2. 情况2:try{ return; }catch(){} finally{} return;
    1. 程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已经return所以不再执行。
  3. 情况3:try{ } catch(){return;} finally{} return;
    1. 程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完try再finally再return.
  4. 情况4:try{ return; }catch(){} finally{return;}
    1. 程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
  5. 情况5:try{} catch(){return;}finally{return;}
    1. 程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
  6. 情况6:try{ return;}catch(){return;} finally{return;}
    1. 程序执行try块中return之前(包括return语句中的表达式运算)代码;
    2. 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。
    3. 无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。