1.请你说一下重载和重写的区别
- 重载 :在同一个类中,有多个方法名相同、返回值类型相同,但形参列表的参数个数、参数顺序以及参数的类型不同。
- 重写:子类通过继承类,实现接口的方式。重写其方法,方法名必须一致、形参列表的参数类型必须一致,且方法返回类型不能小于被实现的方法返回类型。
2.请你说一下String、StringBuffer、StringBuilder的异同点
- 相同点:String、StringBuffer、StringBuilder 三者底层都是 char型的数组。
- 不同点:
-
String是不可变的,源码中加上了final的关键字
/** The value is used for character storage. */
private final char value[];
StringBuffer、StringBuilder都是可变的。
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
StringBuffer、StringBuilder的初始容量为16,扩容机制为数组长度的2倍加2
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
// 扩容机制 在原基础上扩大两倍 + 2
int newCapacity = (value.length << 1) + 2;
StringBuffer是线程安全的、而StringBuilder是非线程安全的
3.请你说一下 == 和 equals 的区别
- ==:
①对于基本数据类型使用双等号进行比较,比较的是两者的值
②对于引用数据类型来说,比较的是两者的地址值 - equals:
①对于未重写equals方法的引用数据类型来说,和双等号比较引用数据类型一致,是对二者的地址值进行的比较
public boolean equals(Object obj) {
return (this == obj);
}
②对于重写过了equals方法的,比较的是字面量。
public boolean equals(Object anObject) {
//先判断二者是否地址相同,如果地址相同,则为同一个引用,直接返回true
if (this == anObject) {
return true;
}
//不同的话,在对传入的参数进行判断是否为String的实例,不是实例就没有比较的需要
if (anObject instanceof String) {
//进行转型
String anotherString = (String)anObject;
//获取当前字符串的长度
int n = value.length;
//判断当前字符串长度是否和参数的长度一致,不一致就没有比较的需要
if (n == anotherString.value.length) {
//逐个值进行比较
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}