Java中Set集合的学习(HashSet)
Set集合的接口关系
Set集合接口继承了Collection接口,也当然继承了Collection继承的Iterable迭代器。
Set集合接口的实现类有:
- HashSet
- EnumSet
- LinkedHashSet
- TreeSet
其中最常用的应该是HashSet。以下对每个实现类进行一个说明。
HashSet
学习心得主要来自博文https://www.cnblogs.com/LiaHon/p/11257805.html,如果有时间可以看看原文。
-
HashSet的类图结构(图片来自Idea中的HashSet类图):
-
构造方法解析
看完其构造方法会发现HashSet的底层逻辑都是通过HashMap实现的。 -
public方法解析(按照java源码顺序)
public int size()
通过map.size()实现,返回集合中元素的个数
public boolean isEmpty()
通过map.isEmpty()实现,判断这个集合是否是一个空集合
public boolean contains(Object o )
通过map.containsKey(o)实现,含义是传入一个对象,如果存在于这个集合,那么就返回true,否则返回false。底层的判断逻辑还是使用map
public boolean add(E e)
通过map.put(e,PERSENT)==null,直观上看其实就是添加一个元素到集合中,底层调用map,如果返回null则添加臣工。但是我们知道map需要的是一个key值一个value值。这里的含义就是把元素作为key值,在API中利用一个空对象作为PERSENT值,以此来利用Map。这里还有一个问题,就是添加相同和不相同的关系,在文档中明确的指出了如果添加的字符串相同,那么就不做改变直接返回,如果是不相同那么就会添加。
public boolean remove(Object o )
通过map.remove(o)方法,o就是作为索引进行删除。如果删除的这个元素对应的是当时我们添加时候对应的那个生成PRESENT那么我们就删除成功。
public void clear()
掉用map.clear()方法,这个方法运行后,整个集合清空。
public Object clone()
对当前的集合进行一个浅拷贝,当然这方法还是基于map的clone()方法。
浅拷贝:浅拷贝指开辟对象,但是对象里面的值的索引都是原来对象的。
深拷贝:开辟一个对象,里面的内容和原来的一模一样,但是里面的对象也是有自己的内存空间的。
public Spliterator spliterator()
实质上是返回一个拆分器,即如果你想去遍历这个集合时,你可以通过这个方法创造一个拆分器,传入你需要拆分的集合。遍历如下:
目前仅是初识此方面,肯定会有许多描述不准确或者不全面的地方,欢迎评论区留言讨论哦。
下面是关于应用。题选leetcode507最常见的单词
题目如下:
看完题目最直接的思路就是,你既然要我找最多,那么我就把一个String字符串变成String[]组,然后看里面的元素出现次数就好。而且统计每个单词出现的次数,那不就是意味着不能重复。所以对需要判断的字符串数组而言,需要key和value那么就使用map,对于禁用词只有一个value,所以就用到了今天学习的HashMap和HashSet。
代码以及注释如下:
public String mostCommonWord1(String paragraph, String[] banned){
//因为不区分大小写,应该直接全变成小写
paragraph= paragraph.toLowerCase();
//转换成小写后进行分割
String[] res = paragraph.split("[!?',;. ]");
//因为都是String不需要记录,所以用set
Set<String> ban = new HashSet<String>();
for (int i =0;i<banned.length;i++){
ban.add(banned[i]);
}
Map<String,Integer> frequency = new HashMap<String,Integer>();
//把单词加入一个Map中。
for (int i =0;i<res.length;i++){
if ((!ban.contains(res[i]))&&(res[i].length()>0)){
frequency.put(res[i],frequency.getOrDefault(res[i],0)+1);
}
}
//在HashMap中有了这几个单词的频度,现在相当于一个无序的列表
int max= -1;
String result= null;
for(String str : frequency.keySet()){
if (frequency.get(str)>max){
max = frequency.get(str);
result = str;
}
}
return result;
}