嗨喽大家好,今天博主简单介绍一下常用的集合框架里的set集合框架
目录
1.特点
- 不可重复
- 无序
1.HashSet,特点:
- 它不按照存储的顺序保存,具有不确定性,也就是说每一次遍历集合出的元素相同;排序不一定相同
- 允许使用null元素
2.TreeSet,特点:
- 及实现Set接口,也实现了SortedSet接口,具有排序功能
- 存入TreeSet中的对象元素需要实现Comparable接口
set不可重复,并且是无序的,基本数据类型&String
跟着博主看看效果吧!
源代码:
package com.ps.set;
import java.util.HashSet;
import java.util.Iterator;
/**
* set集合的特点
* 不重复:基本数据类型&String="abc";
* @author Ps
*
* @time 2022年6月8日 下午4:41:52
*/
public class Demo1 {
public static void main(String[] args) {
HashSet<Object> set =new HashSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.add("老六");
set.add("ls");
System.out.println(set.size());
System.out.println("---------------增强for--------------");
for (Object obj : set) {
System.out.println(obj);
}
System.out.println("---------------增强for--------------");
Iterator<Object> it =set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
效果:
2.遍历方式
HashSet集合遍历方式有两种:
foreach和迭代器(Iterator)
代码也在上面;
3.HashSet哈希表存储,重复元素底层探究
set底层去重原理
1.set去重底层原理是与对象的hashcode以及equals方法相关
2.判断重复元素的时候,是比较hashcode值,再调用equals比较内容
看代码吧!
package com.ps.set;
import java.util.HashSet;
/**
* set底层去重原理
* 1.set去重底层原理是与对象的hashcode以及equals方法相关
* 2.判断重复元素的时候,是比较hashcode值,在调用equals比较内容
* @author ps
*
* @time 2022年6月8日 下午5:09:11
*/
public class Demo2 {
public static void main(String[] args) {
HashSet<Object> set =new HashSet<>();
set.add(new Person("zs",18));
set.add(new Person("ls",14));
set.add(new Person("ww",24));
set.add(new Person("老六",22));
set.add(new Person("zs",18));
System.out.println(set.size());
}
}
class Person /*implements Comparable<Person>*/{
private String name;
private int age;
private int level;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", level=" + level + "]";
}
@Override
public int hashCode() {
System.out.println("-----------hashCode------------");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("-----------equals------------");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
效果如下:
4.TreeSet(自然排序,比较器排序)
4.1自然排序:
图上就是自然排序
但是当你需要用对象进行排序的时候,就会遇到问题:
就是下面这个类型转换异常:
Exception in thread "main" java.lang.ClassCastException:
com.ps.set.Person cannot be cast to java.lang.Comparable
这时候我们得把那个对象找一个接口:Comparable<Person>(person是博主写的对象类)
实现方法后便可以排序了
源代码:
package com.ps.set;
import java.util.TreeSet;
public class Demo4 {
public static void main(String[] args) {
TreeSet set =new TreeSet<>();
set.add(new Person("aa",1,1));
set.add(new Person("bb",2,2));
set.add(new Person("cc",3,4));
set.add(new Person("dd",4,5));
set.add(new Person("ee",1,1));
for (Object obj : set) {
System.out.println(obj);
}
}
}
现象:
- String默认是能够排序的
- 自定义的对象无法排序,报类型转换异常
结论:
java.lang.Comparable:自然排序 排序的规则是单一的,不能够应对复杂的变化的需求
4.2比较器排序:
需要implements Comparator 也是实现比较器接口的意思
实现后不需要用到上面在实体类中实现Comparable接口了
效果如下:
源代码:
package com.ps.set;
import java.util.Comparator;
import java.util.TreeSet;
public class Demo4 {
public static void main(String[] args) {
TreeSet set =new TreeSet<>(new levelCompartor1());
set.add(new Person("aa",1,1));
set.add(new Person("bb",2,2));
set.add(new Person("cc",3,4));
set.add(new Person("dd",4,5));
set.add(new Person("ee",1,1));
for (Object obj : set) {
System.out.println(obj);
}
}
}
class levelCompartor1 implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
int levelRes =o1.getLevel()-o2.getLevel();
return levelRes == 0? o1.getAge()-o2.getAge():levelRes;
}
}
好啦,到这里今天的分享也接近尾声了,如果喜欢的话记得点赞加收藏哦!我们下次再见!