Java基础之Collections框架Set接口及其使用和源码分析
Set接口
集合是不能包含重复元素的集合。Set接口只包含从集合继承的方法,并添加了禁止重复元素的限制。Set还为equals和hashCode操作的行为添加了一个更强的契约,而不是从集合接口继承的契约。允许对Set实例进行有意义的比较,即使它们的实现类型不同。如果两个Set实例包含相同的元素,则它们是相等的。
Java平台包含三个通用的Set实现:HashSet、TreeSet和LinkedHashSet。将元素存储在哈希表中的HashSet是性能最好的实现;但是,它不能保证迭代的顺序。TreeSet将元素存储在红黑树中,并根据元素的值对其进行排序;它比HashSet慢得多。LinkedHashSet实现为一个散列表,其中贯穿着一个链表,它根据元素插入到集合中的顺序(插入顺序)对元素进行排序。
Set使用
Set简单使用
Collection<String> ops = new HashSet<>();
||
Set<String> sets = new HashSet<>();
//可以使用set去重collection中的重复元素
Collection<String> linkedHashSetR= new LinkedHashSet<String>(c);
Set JDK8操作
#在java 8中使用stream进行去重
c.stream().collect(Collectors.toSet()); //去重
#将数组中的相关的值保存到treeSet中
List<Person> persons = new ArrayList<>();
Person person = new Person();
person.setName("tony");
person.setLast("Smith");
persons.add(person);
Set<String> nameSets = persons.stream().map(Person::getName).collect(TreeSet::new);
Set源码相关方法
//返回元素的个数
int size();
/**
判断是否为空
*/
boolean isEmpty();
/**
判断集合中是否包含指定的元素
*/
boolean contains(Object o);
/**
返回集合的迭代器
*/
Iterator<E> iterator();
/**
将集合转换为数组
*/
Object[] toArray();
/**
返回指定类型的数组
*/
<T> T[] toArray(T[] a);
// Modification Operations
/**
添加元素,这个和collect的不同实现有把不同的规则
*/
boolean add(E e);
/**
移除指定的元素
*/
boolean remove(Object o);
/**
set中是否包含指定集合中的所有元素
*/
boolean containsAll(Collection<?> c);
/**
添加指定集合中的所有元素,会去重
*/
boolean addAll(Collection<? extends E> c);
/**
保留指定集合中的元素
*/
boolean retainAll(Collection<?> c);
/**
移除指定集合中的所有元素
*/
boolean removeAll(Collection<?> c);
/**
清空set集合中的所有元素
*/
void clear();
/**
进行比较操作
*/
boolean equals(Object o);
/**
生产set的hashCode值
*/
int hashCode();
/**
返回一个Spliterator操作
*/
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
基本上和collection的接口中的方法一致,只是在进行add的时候做了
去重的处理。我们看看它的相关实现,看看相关方法的具体实现操作。