Set
1. 特点
无序、无下标、元素不可重复。
2. 方法
全部继承自Collection中的方法。
3. 实现类
3.1 HashSet【重点】
给予HashCode实现元素不重复
当存入元素的哈希吗相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
存储结构:数组+链表+红黑树
字符串类型:
package com.setDemo.hashSetDemo;
import java.util.HashSet;
import java.util.Iterator;
/**
* HashSet 集合使用
* 存储结构:hash表(数组 + 链表 + 红黑树)
* (1)
*/
public class Demo01 {
public static void main(String[] args) {
// 新建集合
HashSet<String> hs = new HashSet<String>();
// 1. 添加元素
hs.add("张梓康");
hs.add("真的");
hs.add("帅");
hs.add("哎");
System.out.println("元素个数:"+ hs.size());
System.out.println(hs.toString());
// 2. 删除数据
hs.remove("刘德华");
System.out.println("删除之后:"+hs.size());
System.out.println("=============");
// 3. 遍历操作
// 3.1 增强for
for (String h : hs) {
System.out.println(h);
}
System.out.println("=============");
Iterator<String> iterator = hs.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("=============");
// 4. 判断
System.out.println(hs.contains("郭富城"));
System.out.println(hs.isEmpty());
}
}
人类链表:
package com.setDemo.hashSetDemo;
import java.util.HashSet;
import java.util.Iterator;
/**
* HashSet 使用
* 存储结构:哈希表(数组+链表+红黑树)
* 存储过程
* (1) 根据hashcode,计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二布。
* (2) 再执行equals 方法,如果equals方法,则认为是重复元素。
*/
public class Demo02 {
public static void main(String[] args) {
// 创建
HashSet<Person> hs = new HashSet<>();
// 添加
Person p1 = new Person("钟照例", 23);
Person p2 = new Person("刘少奇", 25);
Person p3 = new Person("请勿发", 24);
hs.add(p1);
hs.add(p2);
hs.add(p3);
// 重复不能添加
hs.add(new Person("请勿发", 24));
System.out.println("元素个数:"+hs.size());
System.out.println(hs.toString());
// 删除操作
hs.remove(new Person("请勿发", 24));
System.out.println("元素个数:"+hs.size());
System.out.println(hs.toString());
// 遍历
// 增强for
for (Person h : hs) {
System.out.println(h);
}
System.out.println("================");
Iterator<Person> it1 = hs.iterator();
while (it1.hasNext()){
System.out.println(it1.next());
}
// 判断
System.out.println(hs.contains(p2));
System.out.println(hs.contains(new Person("请勿发", 24)));
System.out.println(hs.isEmpty());
}
}
人类重写equals和hashcode:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
// (1) 31是一个质数,减少散列的冲突()31可以提高执行的效率
return Objects.hash(name, age);
}
3.2 TreeSet
给予排序顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序。
元素对象的类型必须实现Comparable接口,指定排序规则。
通过CompareTo方法确定是否为重复元素。
元素必需要实现Comparable接口,compareTo() 方法返回值为0,认为是重复元素
Demo01:
package com.setDemo.treeDemo;
import com.setDemo.hashSetDemo.Person;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 使用treeset 保存数据
* 存储结构:红黑树
* 要求:元素必需要实现Comparable接口,compareTo() 方法返回值为0,认为是重复元素
*/
public class Demo02 {
public static void main(String[] args) {
// 创建一个集合
TreeSet<Person> ts1 = new TreeSet<>();
Person p1 = new Person("钟照例", 23);
Person p2 = new Person("刘少奇", 25);
Person p3 = new Person("请勿发", 24);
// 添加元素
ts1.add(p1);
ts1.add(p2);
ts1.add(p3);
System.out.println("个数:"+ts1.size());
System.out.println(ts1);
System.out.println("=========================");
// 删除
ts1.remove( new Person("请勿发", 24));
System.out.println("个数:"+ts1.size());
System.out.println(ts1);
// 遍历
// 增强for
for (Person person : ts1) {
System.out.println(person);
}
System.out.println("==============");
// 迭代器
Iterator<Person> it = ts1.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
Demo02:
package com.setDemo.treeDemo;
import com.setDemo.hashSetDemo.Person;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
* TresSet集合的使用
* Comparator : 实现定制比较(比较器)
* Comparable : 可比较的
*/
public class OtherDemo {
public static void main(String[] args) {
// 创建集合,并指定比较规则
TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getAge() - o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1 == 0 ? n2 : n1;
}
});
Person p1 = new Person("钟照例", 23);
Person p2 = new Person("刘少奇", 25);
Person p3 = new Person("请勿发", 24);
// 添加元素
ts.add(p1);
ts.add(p2);
ts.add(p3);
System.out.println("个数:"+ts.size());
System.out.println(ts);
System.out.println("=========================");
// 删除
ts.remove( new Person("请勿发", 24));
System.out.println("个数:"+ts.size());
System.out.println(ts);
// 遍历
// 增强for
for (Person person : ts) {
System.out.println(person);
}
System.out.println("==============");
// 迭代器
Iterator<Person> it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
4. Set 接口使用
package com.setDemo;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 测试Set接口的使用
* 特点:
* (1) 无序 没有下标
* (2) 不能重复
*/
public class Demo01 {
public static void main(String[] args) {
// 1 创建集合
Set<String> s1 = new HashSet<>();
// 2 添加数据
s1.add("苹果");
s1.add("菠萝");
s1.add("喜欢");
System.out.println("数据个数:"+s1.size());
System.out.println(s1.toString());
System.out.println("============");
// 3 删除数据
s1.remove("苹果");
System.out.println(s1.toString());
System.out.println("============");
// 4 遍历
// 4.1 增强 for
for (String s : s1) {
System.out.println(s);
}
System.out.println("============");
// 4.2 迭代器
Iterator<String> it1 = s1.iterator();
while (it1.hasNext()){
System.out.println(it1.next());
}
System.out.println("============");
// 5 判断
System.out.println(s1.contains("菠萝"));
System.out.println(s1.isEmpty());
}
}