J2EE&集合框架&Set

目录

一.Set特点

特点:无序,不重复

思考:如果对List容器中的元素去重?

二.遍历:foreach,迭代器

三.扩容: 初始容量16,负载因子0.75,扩容增量1倍

性能参数:初始容量,负载因子

默认值: 初始容量16,负载因子0.75

示例:new HashSet<>(20, 0.5f);

四.HashSet

五.思考

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 ll = new ArrayList (new  HashSet(list));            ll.forEach(t->System.out.println(t));    }

2. set有ArrayList中存在的通过下标删除,或foreach循环删除时的问题吗? 为什么

答:set无下标  所有没有

3. set是否存在List删除,传入整数需要区分是基本型还是对象型的问题,【例如:list.remove(2)】,为什么? 

答:存在 基本型的整数

六.TreeSet

示例:

 自定义比较器

①通过构造函数传入比较器

②实现排序接口


一.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

  1. 它存储唯一元素并允许空值  依据对象的hashcode来确定该元素是否存在
  2. 由HashMap支持
  3. 不保持插入顺序
  4. 非线程安全

五.思考

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();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_73126462/article/details/131603759