一.HashSet简介
此类实现 Set接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
二.HashSet常用方法
1.size():集合的长度
HashSet<String> hashSet=new HashSet<String>();
hashSet.add("ffff");
int num=hashSet.size();
2.isEmpty():集合是否为空
HashSet<String> hashSet=new HashSet<String>();
hashSet.add("ffff");
boolean b=hashSet.isEmpty();
3.add(E e):向集合中添加元素
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(null);
hashSet.add("ffff");
4.contains(Object o):集合中是否包含o元素
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(null);
hashSet.add("ffff");
hashSet.add("aaaa");
boolean b=hashSet.contains("aaaa");
boolean c=hashSet.contains("AAAAAAAAAA");
boolean d=hashSet.contains(null);
Log.d("TAG","b----:"+b);
Log.d("TAG","c----:"+c);
Log.d("TAG","d----:"+d);
b----:true
c----:false
d----:true
5.remove(Object o):删除集合中o元素
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(null);
hashSet.add("ffff");
hashSet.add("aaaa");
hashSet.add("aaaa");
hashSet.add("bbbb");
hashSet.add("bbbb");
hashSet.add("cccc");
hashSet.add("cccc");
hashSet.add("dddd");
hashSet.add(null);
int num1=hashSet.size();
Log.d("TAG","num1----:"+num1);
hashSet.remove("ffff");
int num2=hashSet.size();
Log.d("TAG","num2----:"+num2);
num1----:6
num2----:5
6.clear():清空集合所有元素
HashSet<String> hashSet=new HashSet<String>();
hashSet.add(null);
hashSet.add("ffff");
hashSet.add("aaaa");
hashSet.add("aaaa");
hashSet.add("bbbb");
hashSet.add("bbbb");
hashSet.add("cccc");
hashSet.add("cccc");
hashSet.add("dddd");
hashSet.add(null);
int num1=hashSet.size();
Log.d("TAG","num1----:"+num1);
hashSet.clear();
int num2=hashSet.size();
Log.d("TAG","num2----:"+num2);
num1----:6
num2----:0
7.iterator():遍历集合
package com.example.mytest;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import java.util.HashSet;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSet();
}
private void initSet() {
HashSet<String> hashSet = new HashSet<String>();
hashSet.add(null);
hashSet.add("ffff");
hashSet.add("aaaa");
hashSet.add("aaaa");
hashSet.add("bbbb");
hashSet.add("bbbb");
hashSet.add("cccc");
hashSet.add("cccc");
hashSet.add("dddd");
hashSet.add(null);
Iterator<String> i = hashSet.iterator();
while (i.hasNext()) {
Log.d("TAG", i.next() + "");
}
}
}
D/TAG: null
D/TAG: aaaa
D/TAG: bbbb
D/TAG: cccc
D/TAG: dddd
D/TAG: ffff
三.总结
HashSet 无序 元素不可重复 元素可为空 。且没有get方法。
四.源码
1.描述
HashSet怎样保证元素不可以重复呢,我们看一下它的add方法。
2.add方法源码
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
3.总结
也就是说,HashSet添加元素时,实际上底层是用的HashMap存储的,把要添加的元素当成HashMap的Key,Value值是固定的Object。
我们都知道,HashMap大致存储的原理是
先调用Key的hashCode()方法,然后在集合中查找是否有哈希值相同的对象。
如果没有哈希值相同的对象就直接存入集合。
如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较。
比较结果为false就存入。true则不存(替换)。
那么我们存入的Value值是固定的Object。那么 Value的equals()比较肯定是true。 如果Key一样,那么Key的HashCode也一样。所以HashMap存储时,肯定不会存储。这样就能够保证HashSet中元素的唯一性。