1.List Set Map 的区别
- List: 有序,可以多个元素引用相同的对象
- Set: 无序,不重复,不可以多个元素引用相同对象
- Map: 使用键值对存储,两个key可以引用相同的对象,但是key不能重复
package com.hqa.design.test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void main(String[] args) {
// 初始化list
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
System.out.println(list.size()); //2 可以添加重复元素
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(1);
System.out.println(set.size()); //1 不可以添加重复元素
list.add(2);
list.add(3);
set.add(2);
set.add(3);
set.add(-1);
System.out.println(list.get(0)); //1 有序
System.out.println(set.iterator().next()); //-1 无序 多次运行仍为 -1 ,所以说hashSet的无序并不是完全随机,而是有一个内部自身的排序规则的
}
}
2.ArrayList 和LinkedList 区别
- ArrayList: 底层使用数组,存、读效率高;插入、删除特定位置效率低,近似O(n)
- LinkedList: 使用双向链表,插入、删除效率高O(1)
注意了,这个是高频面试题
3.HashMap 和 HashTable的区别
- HashMap 是线程不安全的,HashTable线程安全
- HashMap 效率高一点
- HashMap 可以有null 值,HashTable 有Null会产生NullPointerException异常
- HashTable 采用方法级别的悲观锁效率太低,基本淘汰,需线程安全使用ConcurrentHashMap
4.HashMap 和 ConcurrentHashMap 区别
- ConcurrentHashMap 把整个桶数组分割成很多个Segment,每个分段使用lock锁保护(1.8之后使用CAS算法)
- HashMap键值对允许有null,ConcurrentHashMap反之。
5.CAS算法 compare and swap
无锁算法,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”
6.HashSet 检查重复
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。