1. 面向对象
1.1 ==和equals的区别
对于基本数据类型来说,== 比较的是值。
对于引用数据类型来说,== 比较的是对象的内存地址。
equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。
字符串的判断 需要使用 equals方法来判断 字符串的值是否相等,
因为String中的 equals 方法是重写(重写后比较内容)Object的equals方法(比较内存地址)
涉及源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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;
}
1.2 为什么重写 equals() 时必须重写 hashCode() 方法
hashCode() 的作用是获取该对象在哈希表种的索引位置
hash表: 散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)
hash冲突:在散列表中插入一个数据元素时,需要根据关键字的值确定其存储地址,若该地址已经存储了其他元素,则称这种情况为“冲突(碰撞)”
hashCode() 和 equals()都是用于比较两个对象是否
相等
。但是hashCode()相等 不代表两个对象就相等(hash碰撞)
如果两个对象的hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等
2. 异常
2.1 异常处理影响性能吗
异常处理的性能成本非常高,每个 Java 程序员在开发时都应牢记这句话。创建一个异常非常慢,抛出一个异常又会消耗1~5ms,当一个异常在应用的多个层级之间传递时,会拖累整个应用的性能。
3. 集合
3.1 谈谈ArrayList的优缺点
优点:
1. ArrayList 底层以数组实现
2. 实现了 RandomAccess 接口,因此查找的时候非常快。
3. 在顺序添加一个元素的时候非常方便。
缺点:
1. 插入和删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。
3.2 RandomAccess 有什么作用
用以标记实现的List集合具备快速随机访问的能力。
- ArrayList基于数组实现,天然带下标,可以实现常量级的随机访问,复杂度为O(1)
- LinkedList基于链表实现,随机访问需要依靠遍历实现,复杂度为O(n)
当我们不明确获取到的是Arraylist,还是LinkedList的时候,我们可以通过RandomAccess来判断其是否支持快速随机访问,若支持则采用for循环遍历,否则采用迭代器遍历,如下方式:
public class RandomAccessTest {
private List<String> list = null;
public RandomAccessTest(List<String> list){
this.list = list;
}
public void loop(){
if(list instanceof RandomAccess) {
// for循环
System.out.println("采用for循环遍历");
for (int i = 0;i< list.size();i++) {
System.out.println(list.get(i));
}
} else {
// 迭代器
System.out.println("采用迭代器遍历");
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
public static void main(String[] a