hello,家人们,昨天外面学习了List,今天我们接着学下面的内容,set!!!
目录
一.🥘🥘Set的特点
无序,不重复
二.🍟🍟Set的遍历
foreach,迭代器
三.🍖🍖Set的扩容
初始容量16,负载因子0.75,扩容增量1倍
四.🍉🍉Set的实现方法
- HashSet
1. HashSet概述:
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素
2. HashSet的类图:
3. HashSet的特点
- HashSet不能存储重复元素
- HashSet不能确保插入顺序
- HashSet是非线程安全的
HashSet中没有重复元素,允许有一个为null
HashSet底层使用了哈希表来支持的,特点:存储快
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
1.如果算出的元素存储的位置目前没有任何元素存储,那么该元素可以直接存储在该位置上
2. 如果算出的元素的存储位置目前已经存在有其他的元素了,那么还会调用该元素的equals方法
与该位置的元素再比较一次,如果equals方法返回的是true,那么该位置上的元素视为重复元
素,不允许添加,如果返回的是false,则允许添加
- TreeSet
1. TreeSet的实现原理
TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了
NavigableSet<E>,Cloneable,java.io.Serializable
接口.一种基于TreeMap的NavigableSet实现
2. TreeSet的类图
3. TreeSet的特点
TreeSet是用于对元素进行排序的有序集合类,不允许有重复的元素
TreeSet也是不保证元素的顺序与插入的顺序一致,TreeSet是会对元素进行排序TreeSet数据结构:二叉树
特点:元素是有大小顺序的
- TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string
- TreeSet在遍历集合元素时,是有顺序的【从小到大】(我的理解,如果存的字母,按字典序排列)
- 排序:当向TreeSet中添加自定义对象时,有2种排序方法:
- 1:自然排序
- 2:定制排序自然排序:要求自定义类实现java.lang.Comparable接口并重写compareTo(Object obj)方法。在此方法中,指明按照自定义类的哪个属性进行排序
4. 实例
第一件事情就是导入jar包
第二件事情就是建一个com.xxx.jeelistdemo的包,
然后我们在类中定义两组数据
private List<Integer> list=new ArrayList<Integer>();
private Set<Integer> set=new HashSet<>();
@Before
public void setup() {
list.add(1);
list.add(2);
list.add(9);
list.add(9);
list.add(6);
set.add(1);
set.add(1);
set.add(5);
set.add(4);
set.add(2);
set.add(3);
}
第一种去重方法:
@Test
public void Test01() {
List<Integer> tmp=new ArrayList<Integer>(new HashSet<Integer>(list));
System.out.println(tmp);
}
点击@Test旁边,右击点击图中的指标执行
执行结果:
第二种方法:
@Test
public void Test02() {
for (Integer i : set) {
System.out.println(i);
}
}
运行结果:
第三种方法:
@Test
public void Test03() {//利用迭代器
Iterator<Integer> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
运行结果:
第四种方法:
@Test
public void Test04() {
Set<Student> str=new HashSet<>();
str.add(new Student(1,"小华",24));
str.add(new Student(2,"小k",35));
str.add(new Student(2,"小k",35));
str.add(new Student(3,"小七",2));
str.add(new Student(4,"小李",22));
str.add(new Student(5,"小平",9));
str.add(new Student(6,"小尼",11));
for (Student s : str) {
System.out.println(s);
}
}
运行结果:
第五种方法:
@Test
public void Test05() {
TreeSet<Student> str=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
});
str.add(new Student(1,"小华",24));
str.add(new Student(2,"小k",35));
str.add(new Student(2,"小k",35));
str.add(new Student(3,"小七",2));
str.add(new Student(4,"小李",22));
str.add(new Student(5,"小平",9));
str.add(new Student(6,"小尼",11));
for (Student s : str) {
System.out.println(s);
}
}
运行结果:
第六种方法:
@Test
public void Test06() {
set.remove(3);//删的是一个对象!!
System.out.println(set);
}
运行结果:
家人们,今天的小课堂的知识到这里就结束啦~ 咱们下期见
今天也要记得微笑呀.