package asdfg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class aaa {
public static void main(String[] args) {/*** 小提示:* 1.对于所有没有索引的方法,我们都不能使用for循环进行遍历* 2.提到接口,我们就应该想到他下面有多少个实现类,并且实现类的方法是怎样使用的* 3.哈希表结构的速度是非常快的* 4.哈希表的顺序是无序的* 5.可以通过重写的方法使哈希值的值相等* * * Set接口简介:* 1.Java.util.set接口和Java.util.list接口同样继承来自collection接口,与collection接口中的方法基本上是一样的,* 并没有对collectIon接口进行功能上的扩充,只是比collectIon接口在形式上更加严格,与lIst接口不同的是,Set接口中的元素* 是无序的,并且都会以某种规则保证存入的元素不出现重复* 2.Set接口的两个集合:Hashset集合和HashmAP集合* * 小问题:* 1.Hashset是根据什么来确定元素在集合中的存储位置的?具有什么功能?* 解释:是根据对象的哈希值来确定元素在结合中的存储位置,具有良好的存储和查找性能,* 2.Hashset是如何保证元素在集合当中的唯一性的?* 解释:保障元素唯一性的方式依赖于Hashcode方法与EQuals方法*//** Set接口的特点:* 1.不允许存储重复元素* 2.没有索引,没有带索引的方法也不能使用普通for循环进行遍历;* * java.util.HashSet集合 implements(实现)set接口;* HshSet方法的特点:* 1.不允许存储重复元素* 2.没有索引,没有带索引的方法也不能使用普通for循环进行遍历* 3.是一个无序的集合,存储元素和起初元素的分析有可能不一致* 4.底层是一个哈希表结构,(查询的速度是相当迅速的)* *///创建一个HashSet集合Set<Integer> set= new HashSet<>();//添加元素使用add方法set.add(1);set.add(3);set.add(2);set.add(1); //1.使用迭代器进行遍历set集合Iterator<Integer> it=set.iterator();//判断是否有下一个while(it.hasNext()){//如果有的话,将下一个的值进行返回然后进行输出Integer n=it.next();System.out.println(n);}//2.使用增强for遍历for集合System.out.println("+++++++++++++++++++++");for(Integer i :set){System.out.println(i);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/*** HashSet集合存储数据的结构使用的是哈希表,下面我们进行了解哈希值是怎么一回事* 哈希值:是一个十进制的整数 由系统随机给值,是一个模拟地址,不是真实存在的,也就是逻辑上的地址值,注意:是逻辑地址值,而不是物理地址* * 如何获取对象的哈希值?* 使用Object类当中的方法来获取对象的哈希值* 该方法位于java.long.Object类中的hashcode()方法 其作用是返回该对象的哈希值码* * *//*** hashcode方法的源码:* public native int hashCode();* native代表该方法调用的是本地操作系统的方法* * *///因为person extends Object,所以可以使用其中的hashCode方法person p1=new person();int h1=p1.hashCode();//对象的哈希值System.out.println(h1);//31168322System.out.println(p1);//asdfg.person@1db9742就是上面逻辑地址当中的十六进制的表示//在创建另外的一个对象person p2=new person();int h2=p2.hashCode();//对象的哈希值System.out.println(h2);//17225372System.out.println(p2);//asdfg.person@106d69c就是上面逻辑地址当中的十六进制的表示//String 的哈希值String s1=new String("abc");String s2=new String("abc");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354//字符串重写之后的哈希值是相同的//哈希值的改变是可以通过方法的程序进行的,如果哈希值不被重写,就是由系统随机给出的,/*** 什么是哈希表?* 在JDK1.8之前,哈希表底层采用数组+链表结构,及使用链表处理冲突,这里的冲突是指当一个哈希值对应多个数据的时候,不行,* 但是它位于一个桶中的元素较多及hash值相等的元素较多时,通过key查找效率较低,而JDK1.8中,哈希值存储结构采用数据+链表+红黑树实现,* 超过8(阀值)将链表转换为红黑树,这样大大减少了查找时间,简单来说,链表是由数组+链表+红黑树实现的,* * 哈希表的结构特点:* 查询速度快* * 哈希表结构当中数组的个数一开始是16个块,从0开始,初始容量是16个* * 数组结构:将相同哈希值的元素分为一组* 链表/红黑树:将哈希值相同的元素放到一起或者说是连接到一起* */
}
}