Java基础(7)--set故事

1.set接口简介

  1. set接口是Collection接口的子接口,set接口没有提供额外的方法;

  2. set接口的特性是 容器类的元素是没有顺序的,而且是不可重复的;

  3. 提供set容器的类有HashSet,TreeSet等;

  4. Set的底层是通过map来实现的;

2.set接口的常见方法(所有的方法都是继承set接口的引用类创建的实例来调用的)

  • size()方法:返回元素的个数;
  • contains(Object b):是boolean返回值,表明容器中是否含有这个元素;
  • toArray():将容器转换成一个Object数组;
  • add(Object b):添加元素;
  • remove(Object b):移除某个元素(只是指移除出容器,并非是删除);
  • containsall(Collection c):判断是否有这个容器中的所有元素;
  • addall(容器对象):添加某个容器中的所有元素到指定的容器中去;
  • retainall(容器):和指定的容器中的元素去交集;
  • removeall(容器对象):删除容器中和指定容器相同的元素(判断相等的条件是以equals为准);
  • clear()方法:清空容器中的元素;
  • equals():用来进行元素的比较;
  • hashcode():用来求哈希值;
    如以下代码一样使用这些方法即可:
public class TestHashSet {
	
	public static void main(String[] args) {
		Set hashset = new HashSet();
		hashset.add("sss");//给容器添加元素
		hashset.add("dxs");
		System.out.println(hashset.size());
	}
}

3.HashSet类的底层模式

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable{
    }

首先HashSet类创建时是继承AbstractSet类(一个继承set的抽象类),

在这里简要说一下AbstractSet类中有什么

  1. 重写的equals()方法,用来比较其中的元素;
  2. hashcode()方法,其中还有一个迭代器,目前还没学,暂且不论;但是简单看来应该是为了遍历元素,求哈希值;
  3. removeAll()方法,主要使用来删除所有的元素,其中也有个迭代器,不贪多,了解基础构造;

  private transient HashMap<E,Object> map;

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

从上面的add()方法,就可以简单的看出啦,HashSet添加元素的方法就是使用map,而且添加进去的元素是放在map的key上面的(这同样也是为什么set中元素不能重复发最大原因,因为key不能重复);

map是使用键值对存储的,即key-value;key就如同数据库的主键一样;不能重复;

HashSet的基本结构就是这样了,为什么要了解HashSet,而不是什么treeSet之类的类,那是因为这个类用的最多;

猜你喜欢

转载自blog.csdn.net/dxsdcyy/article/details/105147867