Java 面试题总结——Java基础

总结一波Java相关的面试题,加深对Java的理解。
答案统一放在文章后面

  1. equals==有什么区别?
  2. final关键字在Java中的作用
  3. String,StringBuilder,StringBuffer之间的区别和联系
  4. CollectionCollections有什么区别和联系
  5. HashMap实现原理以及如何解决Hash冲突
  6. ArrayListLinkedList区别和联系
  7. 线程安全集合和线程不安全集合并列举
  8. 线程与进程的区别
  9. wait()和sleep()区别
  10. 如何创建一个线程池?

equals和==的区别:

==:
对于基本类型(int,float,double等)和引用类型(String,Integer等),==所代指的意义并不相同,
对于基本数据类型,== 比较的是两个值是否相等;对于引用类型,==比较的是两个引用是否相同(即两个引用是否指向同一个对象)

String x = "xiaok";
String y = "xiaok";  //创建的对象在常量池,常量池中的相同对象只会存在一个
String z = new String("xiaok"); //new创建的对象位置在堆上,所以z的引用指向堆上的xiaok字符串
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

equals:
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。直接看源码:先来看看最原始的equals方法

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

你会发现equals就是在调用==方法,只不过比较的是对象的引用(其实我一直习惯称呼它为对象指针)。
再来看看String类重写的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;
}

看到这里应该明白了,String重写的equals采用字符数组的方式,逐字符的比较两个字符串进而实现了值比较。
总结一下:
(1)在比较基本类型时,==equals的结果没有区别,但是==的执行效率会高一点,因为没有方法调用的损失;
(2)在比较引用类型时,对于Integer,Double等基本类型的包装类和String,由于他们对equals进行了重写,所以进行的是值比较,而==进行的是引用比较;
(3)在比较除了String,Integer等包装类之外的引用类型时(比如用户自定义的类的对象),==equals比较的都是引用,所以两种方法的结果依旧没有区别;

你可能感兴趣的:(Java)