问题大纲
一、方法操作
1、== 和 Equals的区别?
==
:基本数据类型:比较值;引用数据类型:比较对象的(堆)内存地址内存。
equals
:默认是引用比较,很多类(String、Integer)重写 equals,变成了值比较。
// 举例:
public class StringDemo {
public static void main(String args[]) {
String str1 = "Hello";
String str2 = new String("Hello"); // 开辟新的堆内存
String str3 = str2; // 引用传递
System.out.println(str1 == str2); // false
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
}
}
2、Java有个最基本的类Object,这个类默认包含哪几个方法?
函数名 | 功能 |
---|---|
registerNatives() | 对本地方法进行注册 |
getClass() | 返回一个对象的运行时类 |
hashCode() | 返回该对象的哈希值 |
equals() | 指示某个其他对象是否与此对象相等 |
clone() | 创建并返回此对象的一个副本 |
toString() | 返回该对象的字符串表示 |
notify() | 唤醒此对象监视器上等待的单个线程 |
notifyAll() | 唤醒此对象监视器上等待的所有线程 |
wait(long) | 导致当前线程等待调用此对象的notify()或notifyAll() |
wait(long,int) | 导致当前线程等待,直到其他线程调用此对象的notify()或notifyAll(),或其他某个线程中断当前线程,或已经超过某个实际时间量 |
wait() | 导致当前线程等待,直到其他线程调用此对象的notify()或notifyAll() |
finalize() | 当垃圾回收确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法 |
Object() | 默认构造方法 |
3、对比Vector、ArrayList、LinkedList有何区别?【第8讲】(*2):存储,线程,扩容
对象 | 存储 | 线程 | 扩容 |
---|---|---|---|
Vector | 动态数组 | Y | 100% |
ArrayList | 动态数组 | N | 50% |
LinkedList | 双向链表 | N | - |
追问1:各自应用场景是什么?
Vector 和 ArrayList 以数组形式顺序存储,所以非常适合随机访问。
LinkedList 进行插入、删除很高效,但随机访问比动态数组慢。
4、对比Hashtable、HashMap、TreeMap有什么不同?【第9讲】(*6)
Hashtable
是同步的哈希表实现,不支持 null 键和值。同步让开销更大,很少使用。
HashMap
是不同步的哈希表实现,支持 null 键和值等。put、get
操作通常可达到常数时间性能,是绝大部分键值对存取首选。
TreeMap
是基于红黑树的一种提供顺序访问的 Map
, get、put、remove
类操作时间复杂度是 O(logn)
,具体顺序由 指定Comparator 或 键的自然顺序
来决定。
补充:
1、相同:都是 Map 实现,是以键值对形式存储和操作数据的容器类型。
2、容器:存储元素的单元。这样来看,数据类型都是容器。
3、线程同步:多线程操作一个资源导致资源不一致,这需要协调资源的调度,即线程同步。
4、线程安全:多线程访问类X时,X都表现正确行为,则X是线程安全。 线程安全类封装了同步机制。
追问1:HashMap系列……
回答详解见:【面试】HashMap常见面试题
5、HashSet底层实现?
在HashMap上包了一层,默认存储一个Object的静态常量,取时候也是只返回key。其中add方法调用HashMap的put()方法实现。
if key is existed, then 是旧值,失败;
if (map.put()==null), then 添加元素作为map.key
追问1:线程安全吗?
不安全,同HashMap。
二、参考
1、Java语法----Java中equals和==的区别
2、你真的懂 == 和 equals 的区别吗?
3、为什么重写了equals()也要重写hashCode()
4、重写equals方法后重写hashCode方法的必要性
5、手机号段正则表达式 (2019-01 最新)
6、正则表达式 - 语法
7、【疑惑整理】【Java】深入浅出HashMap+面试整理