Set接口


Set 接口

1、特点

元素不能重复,无序,Set接口中的方法和collection的方法一样

HashSet :内部实际结构是哈希表,是不同步的。

哈希表 :将对象经过哈希算法计算成该对象的哈希值,并把哈希值存放在哈希表中,其实哈希值就相当于数组中的角标。所以在查找的时候直接根据哈希值查询,速度很快。

哈希表确定元素是否相同

u 判断的是两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同

u 判断哈希值相同,其实判断的是对象的hashcode的方法,判断内容相同,用的是equlas方法

注意 :如果哈希值不同,是不用判断equals.

Hahset集合数据是哈希表,所以存储元素的时候,使用的元素的hashcode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。也就是通过对象的hashcode和equals方法来完成对象唯一性的,如果对象的hashcode值不同,那么不用判断equals方法,就直接存储到哈希表中,如果对象的hashcode值相同,那么要再次判断对象的equals 方法是否为true,如果为true,视为相同元素,不存,如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到hashset集合中,必须覆盖hashcode方法和equals方法,一般情况下,如果定义的类会产生很多对象,比如人,学生,数,通常都需要覆盖equlas,hashcode方法。建立对象判断是否相同的依据。

TreeSet 可以对集合中的元素进行排序,是不不同步的,

判断元素唯一性的方式:即使根据比较方法的返回结果是否是0,是0,就是相同的元素,不存,

u Treeset对元素进行排序的方式一:

让元素自身具备比较功能,就需要实现comparable接口,覆盖comparaTo( )方法。如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序,怎么办?

u 可以使用treeset集合第二种排序方式二:

让集合自身比较功能,定义一个类实现comparator接口,覆盖compare方法。将该类对象作为参数传递给treeset集合的构造函数。

2、集合的使用技巧

同步与非同步:

明确具体集合对象名称的后缀,如果后缀是List都所属于List体系,通常是非同步的,如果后缀是Set都所属set体系,通常是非同步的;这些体系的其他子类对象,后缀不是所属接口名的,一般都是同步的。如vector

数据结构:

前缀是数据结构,后缀是所属体系。

ArrayList:看到Array,明确是数组结构,查询快。

需要唯一吗?

需要: set

需要制定顺序吗:

需要: TreeSet

不需要: hashset

但是想要一个和存储一致的顺序(有序): linkedhashset

不需要: list

选要频繁增删吗:

需要: linkedlist

不需要: arraylist

如果记录每一个容器的结构和所属体系呢?

看名字!

List

Arraylist

Linkedlist

Set

Hashset

Treeset

后缀名就是该集合所属的体系。

前缀名就是该集合的数据结构。

看到array:就要想到数组,就要想到查询快,有角标。

看到link:就要想到链表,就要想到增删快,就要想到 add get remove+first last的方法。

看到hash:就要想到哈希表,就要想到唯一性,就要想到hashcode和equals

看到tree:就要想到排序,想到二叉树,就要想到comparable和comparator

通常这些常用的是线程不安全的。


原文链接:https://www.cnblogs.com/rookie-10/p/13538438.html