Java面试前知识点总温习

办法的重载与笼罩

重载:

一个类中能够定义多个办法名雷同,但参数不同的办法。调用时,会依据不同的参数主动匹配对应的办法。

重载的办法,理论是齐全不同的办法,只是名称雷同而已

办法重载条件:形参的类型,形参的参数,形参的程序不同。

笼罩(重写):

子类通过重写父类的办法,能够用本身的行为替换父类的行为。

办法的重写是实现多态的重要条件。

办法重载条件:

  1. 办法名,形参列表雷同
  2. 返回值类型和申明异样类型,子类小于父类
  3. 拜访权限,子类小于父类

toString()办法

Object类中定义有 public String toString() 办法,源码如下:

public String toString() {      return getClass().getName() + "@" + Integer.toHexString(hashCode());}

默认会返回 类名 + @ + hashCode。

在打印对象对象时,会主动调用该对象的toString()办法。

==、equals()办法、hashCode()办法

==

== 代表比拟单方是否雷同。如果是根本类型则比拟值是否相等。如果是援用类型则比拟地址是否相等,即是否是同一个对象。

equals()办法

equals()办法在Object类中的定义如下:

public boolean equals(Object obj) {      return (this == obj);  } 

很显著是对两个对象的地址进行比拟。

而String,Integer,Double这些封装类在应用equals()办法时,曾经笼罩了Object类的equals()办法,进行内容的比拟。

当equals()办法被笼罩时,hashCode()也要被笼罩。

hashCode()办法

  • 在一个Java利用执行期间,如果一个对象提供给equals()办法做比拟的信息没有被批改的话,该对象屡次调用hashCode()办法,该办法必须始终如一返回同一个hashcode值。
  • 如果两个对象依据equals()办法是相等的,那么调用两个对象各自的hashCode()办法必须产生同一个hashcode值。
  • 不要求依据equals()办法不相等的两个对象,调用各自的hashCode()办法肯定产生不同的hashcode值。
hashcode作用

想要明确hashcode的作用,必须先晓得Java中的汇合。Java中的汇合有两类,一类是List,一类是Set。前者汇合内是有序的,元素能够反复;后者元素无序,但元素不能够反复。

判断元素是否反复须要用equals()办法,然而元素过多时,须要屡次调用equals()办法。会升高效率。

此时先计算hashcode定位一个地位,如果这个地位没有元素,它就能够间接贮存在这个地位,不必再进行比拟;如果有元素,就调用它的equals()办法与新元素比拟,雷同就不存了。这样理论调用equals()办法的次数就大大降低了。

简而言之:在汇合查找时,hashcode能大大降低对象比拟次数,进步查找效率。

equlas()办法后果为true的对象必须有雷同的hashcode

如果两个对象A和B的equals()为true,但后果不同,则A和B存入HashMap时计算的HashMap外部数组的索引地位可能不能。那么A和B可能同时存入HashMap,而HashMap中不容许寄存反复元素。

String、常量池、StringBuffer、StringBuilder

String

  • String类又称不可变字符序列

    • 为了节俭内存,JVM专门用一片非凡的区域存储String,如果存在的话间接援用,避免浪费内存,因而必须保障这个具体的常量不能变。
    • String类里边是一个 private final char value[].
  • String对象的两种创立形式

    String str1 = "abcd";String str2 = new String("abcd");System.out.println(str1==str2);//false
    • 第一种形式是在常量池中拿对象
    • 第二种形式是间接在堆内存空间中创立一个新对象

String常量池

  • 间接用双引号申明的String对象会间接存储在常量池中
  • 如果不是双引号申明的对象,能够调用该对象的String.intern()办法。

    • 如果常量池中曾经蕴含一个等于此String对象内容的字符串,则返回该常量池援用
    • 如果常量池中没有,则在常量池中新创建,并返回新创建的援用
  • String s = new String("abc");创立了两个对象,一个在常量池,一个在堆内存。

StringBuffer和StringBuilder

  • 都是可变字符序列
  • StringBuffer:线程平安,执行速度慢;多线程
  • StringBuilder:线程不平安,执行速度快;单线程