临沂网站建设公司,网站建设旗帜条幅,wordpress纯图片主题,做演讲视频的网站Set集合的特点#xff1a;无下标#xff0c;无序(新增顺序和遍历顺序不一致#xff0c;新增顺序不影响遍历顺序#xff0c;而且有一个固定顺序)#xff0c;去重(不允许重复记录)public class TestOne {public static void main(String[] args) {// Set集合的特点#xff…Set集合的特点无下标无序(新增顺序和遍历顺序不一致新增顺序不影响遍历顺序而且有一个固定顺序)去重(不允许重复记录)public class TestOne {public static void main(String[] args) {// Set集合的特点无下标无序(新增顺序和遍历顺序不一致新增顺序不影响遍历顺序而且有一个固定顺序)去重(不允许重复记录)// Set接口没有独有方法Set set new HashSet();set.add(Jerry);//添加多个元素set.add(June);set.add(Tom);set.add(Mary);System.out.println(set); //新增顺序不影响遍历顺序而且有一个固定顺序set.add(Tom);set.add(Tom);set.add(Tom);System.out.println(set); // 去重同一个元素只能记录一次}
}HashSet()的底层源码是hashMapHashSet()里放东西就是往hashMap里放东西hashMap底层用一个链表数组存储元素那HashSet()也是往这个链表数组里存元素。Set接口实现类的底层都是Map接口的实现类Map是键值对集合link的list那个节点它有preview指向上一个节点有next指向下一个节点。所以link的list叫双向链表HashSet()里面的hashMap里的node就只有next。所以它是个单项链表。hashMap底层用什么实现数这个元素装元素它是个数组但它数组里的元素是一个链表所以那个玩意儿叫链表数组。往数组里边儿放东西最重要的一个要素是什么呢如果想把一个元素存在数组里必须要知道什么东西就是下标。数组名加访问下标。只要拿到下标就能往里放元素HashSet去重原理把自己的数新增到数组里下标怎么去确定1.首先调用元素的Hash Code方法获取哈希码。利用一个算法将哈希码经过计算变成二次哈希码。只要是个对象就有Hash CodeHash Code这个方法它返回当前对象内存地址经过哈希算法计算之后的一个整数码值。这个整数码值叫哈希码。2.利用二次哈希码配合一个算法计算当前元素在数组中的下标。3. 如何这个下标处无元素就将元素放到数组中。 如何这个下标处有元素我们就需要做一个判断调用equals方法判断原元素和新元素是否相等如果我们发现方法返回true意味着新元素跟原元素相等则不执行新增操作。当equals方法返回FALSE的时候我们就必须要把新元素放到集合里将新元素链接到原元素的next属性上然后拿个链表指向它新元素不在数组里但在集合里的原因。如果取数据可以把取看作是遍历。在遍历这个结构的时候首先遍历数组拿下标去访问第一个元素。但是和以往遍历数组不同的是拿到第一个元素之后看到第一个元素不会直接跳到第二个元素。看到第一个元素之后要看一看第一个元素的next的属性。如果next属性为空就去看下一个元素。如果next属性不为空就会把next属性返回然后再看next的next是不是为null 如果你的next的next为null那继续看下一个元素如果next的next不是null那继续看next。它在获取元素的时候会先遍历数组。然后每一个数组元素都把你当成链表去遍历。下标是Hash Code算出来的Hash Code是这个对象的内存地址内存地址是固定的不管是先AddAdd的还是后add的Hash Code都是一样的算出来的下标就是一样的遍历的顺序也就是一样的这个数组需要扩容吗数组满了就往链表上放元素理论上链表没有元素限制链表结构遍历的效率低频繁存取的效率高。而数组这种结构的特点遍历的效率高频繁存取的效率低。数组是需要扩容的当我们的同一个元素在用同样的算法算下标的时候。数组长度不一样它算出来的下标就会不一样。在数组扩容之后遍历顺序就有可能会变