Set 哈希码

Set接口继承Collection接口,没有额外添加方法
*特点:唯一(不重复),无序(位置顺序),无法通过下标索引获取元素
*其下有三个常用的实现类
*HashSet***
* 常用的构造函数
* HashSet():构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
* HashSet(int initialCapacity):构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)
* 常用的函数:
* add(E e):如果此 set 中尚未包含指定元素,则添加指定元素。
* size():获取容器中元素的个数
* iterator():返回对此 set 中元素进行迭代的迭代器。
* isEmpty():如果此 set 不包含任何元素,则返回 true。
* contains(Object o) :如果此 set 包含指定元素,则返回 true。
* remove(Object o):如果指定元素存在于此 set 中,则将其移除。
* 遍历方式:
* 1.使用for-each遍历
* 2.使用迭代器进行遍历
*TreeSet*
*LinkedHashSet
*
*/
public class TestHashSet {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
System.out.println("容器是否为空:"+set.isEmpty());
set.add("java");
set.add("oracle");
set.add("html");
set.add("java");
System.out.println("元素的个数:"+set.size());
System.out.println("容器是否为空:"+set.isEmpty());
System.out.println("是否包含java:"+set.contains("java"));
//1.使用for-each进行遍历
for (String string : set) {
System.out.println(string);
}
System.out.println("------");
//2.使用迭代器进行遍历
Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.println(str);
}
}
}


//采用迭代器:Iterator
for(Iterator<String> iter = linkedHashSet.iterator();iter.hasNext();){
String str = iter.next();
System.out.println(str);

/**
* HashSet存储结构采用hashtable(哈希表+链表结构进行存储)
* 优点:
* 查询(哈希算法),添加,删除速(链表)度快
* hashcode(哈希码):同哈希码计算对象的存储位置 y=k(x)
* y:代表存储位置 x:哈希码
* 缺点:无序(位置顺序),无法通过下标访问--->get(i)
* 添加情况:添加时会计算存储位置--->获取哈希码--->通过调用hashcode()获取哈希码
* 情况1:一次添加成功
* 情况2:多次添加,存在重复,去掉重复项--->通过 equals()内容是否一致
* 情况3:在相同位置,多次添加成功
* hashcode()与equals()的关系
* 1。hashcode相同,equals()是不一定相同
* 2.equals()比较两个对象内容相同,hashcode是一定相同
*
*注意:
*hashSet中去掉重复项会调用hashCode()和equals()
*需要重写Object类中hashCode()和equals()
*1.先调用hashCode()获取对象的hash码,如果hash码不相同,对象肯定不同,不再调用equals方法进行比较
* 提高了效率:
* 传统做法:如果要比较1000的对象,需要调用1000次的equals()方法
* 使用hash码:先比较hash是否相同,如果hash码相同才调用equals进行比较
*2.通过hash码计算存储位置: y=k(x)
*
* hashCode如何计算:
* 1.Integer类型:用自身数值做hashcode
* 2.Student
*


*
* TreeSet:采用二叉树进行存储,实现类Set接口
* 特点:唯一,有序(自然顺序)
* 优点:
* 查找效率比List要高,但没有HashSet高
* 构造函数:
* TreeSet():构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
* TreeSet采用的二叉树进行存放(对要保存的元素要求有大小顺序,如果要比较对象大小必须实现Compareable接口,重写compareTo方法
TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
java.util.Comparator:比较器接口,可能更加灵活的完成对象的比较

*java.util.LinkedHashSet实现了Set接口,继承HashSet
* Set:唯一
* --HashSet:无序,唯一
*
* --TreeSet:唯一,有序(大小顺序)
* ----LinkedHashSet:特点:唯一,有序(位置顺序)
采用的存储为哈希表+链表的结构
*
* 常用的构造函数
* LinkedHashSet():构造一个带默认初始容量 (16) 和加载因子 (0.75) 的新空链接哈希 set。
* LinkedHashSet(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的新空链接哈希 set。
* 常用方法:
* add(E e):添加
* remove(E e):移除指定元素
* size():查看容器元素的个数
* contains(E e):是否包含指定元素
* iterator():返回一个迭代器






原文地址:https://www.cnblogs.com/seePoppy/p/6745350.html