set集合
特点:无序,唯一,无索引
HashSet
底层数据结构是哈希表。
哈希表依赖两个方法:hashCode()和equals()
(一般规则:对象equals 是true的话,hashCode需要相同,但是hashCode相同的对象不一定equals,这就是所谓的冲突现象,但是有不同的冲突解决方法。你的hashCode()设计的好的话冲突也就小了。比如楼上给出的超出int范围之后这种hashCode()实现,对象肯定是无数的,但是hash实现是有限的呢,所以冲突了。)
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
LinkedHashSet
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
set集合案例
public static void main(String[] args) {
//创建学生
Student stu1 =new Student("dada1", "s01", "11", "男");
Student stu2 =new Student("dada2", "s02", "12", "男");
Student stu3 =new Student("dada3", "s03", "13", "男");
//创建一个set集合,student类的类型
Set<Student> set =new HashSet<>();
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.forEach(s->System.out.println(s));
}
是无序的
map集合
特点:map(A,B);
A:Map集合的数据结构仅仅针对键有效,与值无关。
B:存储的是键值对形式的元素,键唯一,值可重复。
HashMap
底层数据结构是哈希表(散列表)。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
LinkedHashMap
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
Hashtable
底层数据结构与HashMap相同,都是用的Hash表,和Vector的命一样,都是ArrayList和HashMap的安全与不安全
HashMap–>允许key和value都可以为null
Hashtable–>不能为null
层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
TreeMap
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
案例
public static void main(String[] args) {
//创建学生
Student stu1 =new Student("dada1", "s01", "11", "男");
Student stu2 =new Student("dada2", "s02", "12", "男");
Student stu3 =new Student("dada3", "s03", "13", "男");
//创建map集合
Map<String, Student> map =new HashMap<>();
map.put(stu1.getNumber(), stu1);
map.put(stu2.getNumber(), stu2);
map.put(stu3.getNumber(), stu3);
//遍历集合
map.forEach((k,v)->System.out.println(k+" "+v));
}