变量命名网站,wordpress英文版改成中文字体,自己没有产品,做爰全国网站介绍
Set#xff1a;集合#xff0c;是一个不包含重复数据的集合。#xff08;A collection that contains no duplicate elements. #xff09;
set中最多包含一个null元素#xff0c;否者包含了两个相同的元素#xff0c;不符合定义。 上一篇学习了Java中的容器类的一…介绍
Set集合是一个不包含重复数据的集合。A collection that contains no duplicate elements.
set中最多包含一个null元素否者包含了两个相同的元素不符合定义。 上一篇学习了Java中的容器类的一些基础接口以及Collection接口三大分支中的List分支ArrayList以及LinkedList。这一篇文章将讲解Collection三大分支List、Set、Queue中的Set分支以及衍生出来的子类。 java容器类分析Collection,List,ArrayList,LinkedList深入解读
Set接口的总的集成关系如下图 Set接口
public interface SetE extends CollectionE
查看Set的源码可以发现Set中的接口函数和Collection完全相同并没有添加任何新的接口。只是子类在实现这些接口的时候需要考虑Set中不能有重复的元素这一原则。接口中的函数及描述可查看上一篇博客。 AbstractSet抽象类
和AbstractList及AbstractCollection的作用相似AbstractSet类作为一个抽象类实现了Set接口中的部分函数减少后续Set子类的实现工作。
public abstract class AbstractSetE extends AbstractCollectionE implements SetE
具体该抽象类实现了Set中的如下几个接口 public boolean equals(Object o) {if (o this)return true;if (!(o instanceof Set))return false;Collection? c (Collection?) o;if (c.size() ! size())return false;try {
return containsAll(c); } catch (ClassCastException unused) {return false;} catch (NullPointerException unused) {return false;}} hashCode():Set的hash值等于将Set中所有元素的hash值相加这就保证了if(set1.equals(set2)) 那么set1.hashCode set2.hashCode。 public int hashCode() {int h 0;IteratorE i iterator();while (i.hasNext()) {E obj i.next();if (obj ! null)h obj.hashCode();}return h;} removeAll(): 移除c与当前Set的交集返回值代表是否有元素从当前Set中移除交集为空返回false否则返回true。 public boolean removeAll(Collection? c) {Objects.requireNonNull(c);boolean modified false;if (size() c.size()) {for (Iterator? i c.iterator(); i.hasNext(); )modified | remove(i.next());} else {for (Iterator? i iterator(); i.hasNext(); ) {if (c.contains(i.next())) {i.remove();modified true;}}}return modified;} SortedSet public interface SortedSetE extends SetE public interface SortedSetE extends SetE {//经过某种排序的set JDK1.7 java.util Comparator? super E comparator();//返回对此 set中的元素进行排序的比较器 SortedSetE subSet(E fromElement, E toElement);//返回此 set的部分视图其元素从 fromElement包括到 toElement不包括。 SortedSetE headSet(E toElement);//返回此 set 的部分视图其元素严格小于 toElement SortedSetE tailSet(E fromElement);//返回此 set的部分视图其元素大于等于 fromElement E first();//set中第一个元素 E last();//set中最后一个元素
} NavigableSet public interface NavigableSetE extends SortedSetE {//扩展的 SortedSet具有了搜索匹配元素方法 JDK1.7 java.util E lower(E e);//返回此 set中小于给定元素的最大元素 E floor(E e);//返回此 set中小于等于给定元素的最大元素 E ceiling(E e);//返回此 set中大于等于给定元素的最小元素 E higher(E e);//返回此 set中大于给定元素的最小元素 E pollFirst();//获取并移除第一个元素 E pollLast();//获取并移除最后一个元素 IteratorE iterator();//以升序返回在此set的元素上进行迭代的迭代器 NavigableSetE descendingSet();//返回此 set中所包含元素的逆序视图 IteratorE descendingIterator();//以降序返回在此 set的元素上进行迭代的迭代器。效果等同于 descendingSet().iterator()。 //返回此 set 的部分视图其元素范围从 fromElement 到 toElement NavigableSetE subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive);//返回此 set的部分视图其元素小于或等于如果 inclusive 为 truetoElement NavigableSetE headSet(E toElement, boolean inclusive);//返回此 set的部分视图其元素大于或等于如果 inclusive 为 truefromElement NavigableSetE tailSet(E fromElement, boolean inclusive);//返回此 set 的部分视图其元素从 fromElement包括到 toElement不包括。 SortedSetE subSet(E fromElement, E toElement);//返回此 set的部分视图其元素严格小于 toElement SortedSetE headSet(E toElement);//返回此 set的部分视图其元素大于等于 fromElement SortedSetE tailSet(E fromElement);
} HashSet
public class HashSetE extends AbstractSetE implements SetE, Cloneable, java.io.Serializable
阅读HashSet的源码其实很简单就是在里面维护了一个 HashMap类型的成员变量然后抽象出了几个增删改查的方法。需要深入了解的话可以阅读java容器类2Map及HashMap深入解读
这里有个疑问HashMap是存放键值对的而HashSet是存放一组数据的为什么可以用HashMap保存set数据
HashMap中的keySet()函数返回的就是一个 Set类型的数据(不能有重复的key值)所以HashSet将Set数组全部存放在HashMap的keySet中value值全部用默认的一个Object类型的常量表示。
HashSet中的add()函数可以看出
public boolean add(E e) {return map.put(e, PRESENT)null;}
TreeSet TreeSet的继承关系如下看上去还挺复杂 正如TreeSet继承自SortSet一样TreeSet中存储了排序的数组每个元素值不能有重复的元素。
同HashSet实现方法相同里面维护了一个mapNavigableMap类型类型的成员变量来保证所有数据是有序的。map里面的keySet字段可以保存TreeSet的所有值。
TreeSet中的方法都是基于NavigableMap的增删改查操作这里不详细分析。 参考:
http://www.cnblogs.com/NeilZhang/p/8577991.html
梦想不是浮躁,而是沉淀和积累