1. 什么是面向对象?

面向对象是一种编程思想,它同面向过程相对。
面向过程主要着重与事件的每个步骤和顺序;而面向对象跟注重事情有哪些参与者或者是对象,及各自需要做什么。
然后面向对象有三个重要的特性:

  • 封装:将对象的属性和操作数据的方法(行为)捆绑在一个类中,并对外隐藏内部实现细节,只通过公开的接口与外界交互。
  • 继承:子类可以自动拥有父类的非私有属性和非私有方法,并可对其进行扩展或重写。
  • 多态:同一个方法调用在不同对象上表现出不同行为,具体来说就是父类型引用指向子类型对象。

2. JDk,JRE,JVM的三者的关系?

JDK是一个Java的开发者工具。
JRE是一个Java运行时的环境。
JVM是Java虚拟机(解释java文件,编译为机器可以识别的字节码文件)。

3. ==和equals()的区别?

==对比的栈中的值,如果对比的值是基本数据类型,那是值比较;如果对比的值是引用数据类型,那就是地址比较。
equals()默认的比较是和==一样的,不过通常会对equals进行重写,将其变为值比较。比如String就对equals进行了重写,调用String的equals时比较的是String的值是否想等。
equals()一般也是和hashCode()进行绑定,即重写了equals()也一定会重写hashCode()。
也就是说equals比较的值相同,hashCode的值也一定相同;但是hashCode的值相同时,equals比较的值不一定相同。

4. final的作用?为什么局部内部类和匿名内部类只能访问局部final变量?

final的作用:表示最终的,它可以修饰类,对象,方法和变量。对于修饰了类,这个类不可以被子类继承;对于修饰了方法,表示这个方法不可以被子类进行重载;对于修饰了变量,表示一旦初始化了,这个变量就不能被改变。
局部内部类和匿名内部类只能访问局部final变量本质是因为内部类和外部类是同一级别的,就是外部类方法结束了,不会导致内部类的销毁。但是实际情况就是不使用final进行修饰,会导致销毁,所以final是对内部变量一致性的妥协。

5. String,StringBuffer,StringBuilder的区别及使用场景?

从可扩展方面来说:

  • String;String的底层是用一个final修饰的char数组,它是不可变的,每次操作都会产生新的String对象。
  • StringBuffer和StringBuilder:这两个的底层是一个没有final修饰的char数组,这表示他们可以进行动态扩展(扩展是扩展到原理的2倍加2)。

从线程安全的角度来说:

  • StringBuffer:StringBuffer是线程安全的,它的底层是有一个synchronized修饰。
  • StringBuilder:StringBuilder是线程不安全的。
  • String;String也是线程安全的,本质是因为String是被final进行修饰,即String不可变。

从常量池的角度来看:

  • String:String支持常量池。
  • StringBuffer和StringBuilder:不存在常量池。

6. 重载和重写的区别?

重载:发生再同一个类中,方法名字必须相同,参数类型和个数,顺序不同,方法返回值和修饰符可以不相同,主要发生在编译时期。
重写:发生在父子类中,方法名字,参数列表必须相同,返回值范围小于父类,抛出的异常范围小于等于父类,访问修饰符号返回大于等于父类,同时子类不能重写父类中private修饰的方法。

7. 接口和抽象类的区别?

  • 抽象类可以存在普通成员方法,而接口中只能存在pubilc abstract方法。
  • 抽象类中的成员变量可以是各种类型的,而接口的成员变量只能是pubilc static final类型的。
  • 抽象类只能继承一个,接口可以实现多个。

8. List和Set的区别?

List:list是有序可重复的,按对象进入顺序排列的,可以存在多个null元素对象。可以使用迭代器去除所有元素,还可以通过get方法获取指定的下标元素。
Set:set是无序不可重复的,所以只允许最多存在一个null元素对象。取元素时,只能通过迭代器挨个遍历获取元素。

9. hashCode()和equals()?

作用层面:

  • equals():在没有重写时,默认是使用Object中的equals()方法,也就是==比较;重写后一般会变为值比较
  • hashCode():用于计算对象的hash值,用于快速定位散列表中的位置。

关系层面:

  • equals()一般也是和hashCode()进行绑定,即重写了equals()也一定会重写hashCode()。
    也就是说equals比较的值相同,hashCode的值也一定相同;但是hashCode的值相同时,equals比较的值不一定相同。

10. ArrayList和LinkedList的区别?

从数据结构方面来说:

  • ArrayList底层是基于一个动态数组的,每次扩容1.5倍,连续存储,适合下标访问。
  • LinkedList底层维护了一个双向列表,非连续存储。

从使用方面来说:

  • ArrayList是基于数组的,所以它的元素查询速率和修改速率是O(1),删和增加元素的速率是O(n)。
  • LinkedList是基于双向链表的,所以它的元素查询速率和修改速率是O(n),删和增加元素的速率是O(。1)

从遍历角度来看:

  • ArrayList适合for循环和ForEach进行查询遍历。
  • LinkedList适合迭代器循环访问。