一.Set特点
特点:无序,不重复
思考:如果对List容器中的元素去重?
@Before public void setup() { list.add(1); list.add(2); list.add(3); list.add(3); list.add(4); list.add(5); list.add(3); list.add(4); //list.add(3); } //去重复 @Test public void test05() { HashSet<Integer> ll = new HashSet<Integer>(list); ll.forEach(t->System.out.println(t)); }
二.遍历:foreach,迭代器
//遍历方式 @Test public void test06() { Set<Integer> set = new HashSet<>();//里氏替换原则 set.add(3); set.add(2); set.add(1); //foreach for (Integer i : set) { System.out.println(i); } //迭代器 Iterator<Integer> it = set.iterator(); while(it.hasNext()) { Integer n =it.next(); System.out.println(n); } }
三.扩容: 初始容量16,负载因子0.75,扩容增量1倍
性能参数:初始容量,负载因子
默认值: 初始容量16,负载因子0.75
示例:new HashSet<>(20, 0.5f);
四.HashSet
- 它存储唯一元素并允许空值 依据对象的hashcode来确定该元素是否存在
- 由HashMap支持
- 不保持插入顺序
- 非线程安全
五.思考
1. 如何给ArrayList集合去重
@Before public void setup() { list.add(1); list.add(2); list.add(3); list.add(3); list.add(4); list.add(5); list.add(3); list.add(4); //list.add(3); } //去重复 @Test public void test05() { HashSet<Integer> ll = new ArrayList<Integer> (new HashSet<Integer>(list)); ll.forEach(t->System.out.println(t)); }
2. set有ArrayList中存在的通过下标删除,或foreach循环删除时的问题吗? 为什么
答:set无下标 所有没有
3. set是否存在List删除,传入整数需要区分是基本型还是对象型的问题,【例如:list.remove(2)】,为什么?
答:存在 基本型的整数
六.TreeSet
- 是一个包含有序的且没有重复元素的集合
- 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
- TreeSet是基于TreeMap实现的
示例:
//TreeMap @Test public void test07() { //回调函数 TreeSet<Integer> ts = new TreeSet<>( //匿名类 new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { //降序 return o2-o1; } } ); //测试数据 ts.add(1); ts.add(3); ts.add(4); ts.add(5); ts.add(6); ts.add(8); ts.add(2); //1. 默认自然排序 for(Integer e: ts) { System.out.println(e); } }
自定义比较器
①通过构造函数传入比较器
TreeSet<Integer> tset = new TreeSet<Integer>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return o2 - o1; } });
②实现排序接口
public class Student implements Comparable<Student>{ private Integer sid; private String name; private int age; //构造函数,getter,setter,hashCode,equals等方法省略 @Override public int compareTo(Student o) { // TODO Auto-generated method stub return o.getAge() - this.getAge(); } }