目录
一.Set集合
二.HashSet集合
foreach循环遍历
迭代器遍历数组
三.TreeSet集合
一.Set集合
Set集合其实就是一个接口,HashSet和TreeSet实现了Set接口,所有Set所具备的方法HashSet和TreeSet也是具备的。
特点:
- set集合是无序的,不重复的(无序的意思是不会按照我们增加进集合的顺序)
- 遍历通过foreach,迭代器,无法通过下标,因为set集合没有下标
- 初始容量为16,负载因子0.75倍,扩容量增加1倍
二.HashSet集合
- HashSet是实现Set集合接口的,所以Set集合所具备的,它也具备。
- 它只储存唯一元素并且允许为空值。储存唯一元素的意思是,如果你增加两个1,那么有一个1会被干掉,只有1一个1存在。
- 由HashMap支持。
- 不保持插入顺序
- 线程不安全
foreach循环遍历
如果里面有的元素增加进去会被覆盖,大家可以按住Ctrl点击add进去看源码。源码里有一个boolean的方法,该方法是判断新增加的元素在该集合是否已经存在了,如果为false那么里面已经存在和该元素一样的元素,如果为true那么里面没有该元素,增加进该集合。
注:如果已经有元素存在
package com.yjx.test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
public class Test01 {
private Set<Integer> set=new HashSet<Integer>();
@Before
public void list() {
set.add(1);
set.add(1);
set.add(2);
set.add(3);
set.add(3);
set.add(4);
set.add(5);
set.add(6);
}
@Test
public void test01() {
for(Integer e:set) {
System.out.println(e);
}
}
}
set集合增加的源码里的判断元素是否在集合中存在的方法
boolean add(E e);
得到结果:
迭代器遍历数组
hasNext:判断集合中是否还有元素
public void test02() {
Iterator<Integer>it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
得到结果:
我们创建一个学生实体类,然后将学生增加进集合。
- Stundet类一定要实现hashCode()和equals方法,因为他们用来对比两个对象是否相等一致
- 大家可以试一下在stundet类中实现这两个方法,和去除这两个方法的区别,如果Studnet中没有这个方法,那么就算id和名字和年龄全相等,依旧可以增加进去
Studnet类
package com.yjx.test;
public class Stundet {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Stundet() {
// TODO Auto-generated constructor stub
}
public Stundet(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Stundet other = (Stundet) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
方法
像这种学生id和学生名字都相同,但是年龄不同,所以他们不是同一个人,两个都会增加进去的。
public void test03() {
//先创建一个集合
Set<Stundet> set=new HashSet<Stundet>();
set.add(new Stundet(1,"张三",18));
set.add(new Stundet(1,"张三",19));
set.add(new Stundet(3,"张五",16));
set.add(new Stundet(5,"张六",11));
set.add(new Stundet(3,"张七",12));
for(Stundet s:set) {
System.out.println(s);
}
}
得到结果
但是如果我们将第一个和第二个将id和名字和年龄都设置为一样的,那么只有一个会增加进去。
public void test03() {
//先创建一个集合
Set<Stundet> set=new HashSet<Stundet>();
set.add(new Stundet(1,"张三",18));
set.add(new Stundet(1,"张三",18));
set.add(new Stundet(3,"张五",16));
set.add(new Stundet(5,"张六",11));
set.add(new Stundet(3,"张七",12));
for(Stundet s:set) {
System.out.println(s);
}
}
得到结果:而且还会帮我们根据id进行一个排序
如果我们想用根据年龄进行一个排序,这个时候就要用到TreeSet,接着往下看。
三.TreeSet集合
- 是一个包含有序的且没有重复元素的集合
- 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
- TreeSet是基于TreeMap实现的
什么使用TreeSet集合?
当我们想根据什么进行排序的话就可以使用TreeSet集合,下面就教大家如何使用TreeSet集合进行排序。
- 第一种方法
我们使用Comparator进行一个排序,可以从小到大,也可以从大到小,但是这种方法存在一个很大的问题,如果有年龄相同的,那么只会有一个留下,其他的就会不存在该集合中了。
这个是从小到大排序的,想要从大到小,就o2.getAge-o1.getAge。
public void test04() {
TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
@Override
public int compare(Stundet o1, Stundet o2) {
return o1.getAge() - o2.getAge();
}
});
//先创建一个集合
tree.add(new Stundet(1,"张三",18));
tree.add(new Stundet(3,"张五",16));
tree.add(new Stundet(5,"张六",18));
tree.add(new Stundet(4,"张七",12));
tree.add(new Stundet(6,"张七",12));
for(Stundet s:tree) {
System.out.println(s);
}
}
得到结果:
刚刚我们也说了,出现年龄相同,只会留下一个,那么这种方法该如何解决嘞,大家看下面代码。
我们增加了一个判断,当年龄相减为0,他们相等,那就根据他们的id进行排序。就可以解决这样子的问题啦。
public void test04() {
TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
@Override
public int compare(Stundet o1, Stundet o2) {
if(o1.getAge() - o2.getAge()==0) {
return o1.getId()-o2.getId();
}
return o1.getAge() - o2.getAge();
}
});
//先创建一个集合
tree.add(new Stundet(1,"张三",18));
tree.add(new Stundet(3,"张五",16));
tree.add(new Stundet(5,"张六",18));
tree.add(new Stundet(4,"张七",12));
tree.add(new Stundet(6,"张七",12));
for(Stundet s:tree) {
System.out.println(s);
}
}
得到结果:所有的数据都存在,id根据从小到大的顺序。
- 第二种方法
我们在Studnet实体类中做判断,实现Comparable
package com.yjx.test;
import java.util.Comparator;
public class Stundet implements Comparable<Stundet>{
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Stundet() {
// TODO Auto-generated constructor stub
}
public Stundet(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Stundet other = (Stundet) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Stundet o) {
if(o.getAge()-this.getAge()==0) {
return o.getId()-this.getId();
}
return o.getAge()-this.getAge();
}
}
测试方法代码
@Test
public void test05() {
TreeSet<Stundet> tree=new TreeSet<Stundet>();
//先创建一个集合
tree.add(new Stundet(1,"张三",18));
tree.add(new Stundet(3,"张五",16));
tree.add(new Stundet(5,"张六",18));
tree.add(new Stundet(4,"张七",12));
tree.add(new Stundet(6,"张七",12));
for(Stundet s:tree) {
System.out.println(s);
}
}
这种方法也是可以的噢,大家最好做个判断,避免出现一样大的数据而只留下一个这种情况。