Set
无序、无下标、不可以重复元素
方法:全部继承Collection的方法
Set接口的使用
Set迭代
HashSet
使用了哈希表。
使用 HashCode计算元素 的存放位置。
当 存入元素的哈希码相同时 ,会调用equals进行确认 ,如 结果为true,那么拒绝后者存入。
存储结构:哈希表(数组+ 链表 +红黑树)
可以理解成火车站窗口买票排队,
每个人根据hashcode来计算,计算去哪个窗口,如果没有元素直接放入,如果有元素了,那么 比较equals,一样就放,不一样就弄 一个链表。
hashset使用
HashSet <String> hashSet = new HashSet<这里的string可以写也可以不写>();
hashset的遍历。
使用迭代器:
Iterator<String> it = hashSet.iterator(); while(it.hashNext()) { xxx }
hashset使用2
注意最后一个p3是不能加进去的。
persons.add(new Persons(“梁朝伟”,25)能不能成功能。
答案是能。
由于是new的方式 ,相当于这个是 没有名字的一个新的对象,所以 可以添加进去。
hashset的存储方式
1、根据hashcode计算保存的位置 ,如果位置为空,则直接保存,如果不为空,那么执行第二步
2、再执行equals方法,如果为true,则认为是 重复元素,否则false形成链表。
如果要使刚刚的new student是同一个对象 ,那么重写hashcode方法就可以了。
这个时候如果 年龄和名字一样,那么就肯定是一样的了,这个hashcode就一样了。
这个时候发现加进来了,有两个梁朝伟,形成了链表。
hashcode意味加进来了,但是equals不一样,所以 形成了链表。
这个 时候 重写equals方法就可以使他们不加进来。
首先判断是不是同一个,如果是同一个就没必要比 了,returnture。
然后比较obj是不是为空,为空返回false即可。
然后判断obj是不是instance of person的类型,就进行一个强转换进行接收然后进行比较 ,如果 名字那些都一样就返回一样。
删除也是这样 的,如果remove(new。。。)也是可以删除的 。因为 重写了方法。
这个是可以 编辑器自带的 提供 的 生成重写代码,思路基本一致 的。
为什么使用31呢,是因为31是一个prime质数 素数。
这样可以尽量减少散列冲突。即hashcode计算出来的位置尽量不一样
除此之外还可以提升效率,因为31*i=i左移5位再-i。(i<<5-i)这样效率更高一些。