java day14 set集合(HashSet、TreeSet、Queue)

1、Collections工具类

集合工具类,定义了除了存取以外的集合常用方法。

方法描述
sort升序排序(元素类型必须实现Comparable接口)
addAll将所有指定元素添加到指定 collection 中。
max根据元素的自然顺序,返回给定 collection 的最大元素。
min根据指定比较器产生的顺序,返回给定 collection 的最小元素。

代码示例:

package Day14_set.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 18:51
 */
public class Demo01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        System.out.println(list);

        //通过工具类进行多个数据添加
        Collections.addAll(list,"1","2","3","4");
        System.out.println(list);

        String[] strs = {"wzy","p","ljd"};
        Collections.addAll(list,strs);
        System.out.println(list);

        for (int i=0;i<strs.length;i++){
            list.add(strs[i]);
        }
        System.out.println(list);

    }
}

代码示例2:

package Day14_set.collections;

import java.util.ArrayList;
import java.util.Collections;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 19:03
 */
public class Demo02 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,656,1000);
        System.out.println(list);

        //将集合中的对象存储到数组中,再通过Collections.sort进行排序,在存储到list集合中
        Collections.sort(list);
        System.out.println(list);
    }
}

2、Set接口

2.1 set接口

  • 特点:无序、无下标、元素不可重复。
  • 方法:全部继承自Collection中的方法。
  • 使用foreach循环遍历: for(数据类型 局部变量 : 集合名){ //循环内部的局部变量,代表当次循环从集合中取出的对象 }

使用set接口存储数据:

public class Demo1 {
	public static void main(String[] args) {
		//创建集合
		Set<String> set=new HashSet<>();
		//1添加数据
		set.add("小米");
		set.add("苹果");
		set.add("华为");
		//set.add("华为");
		System.out.println("数据个数:"+set.size());
		System.out.println(set.toString());
		//2删除数据
//		set.remove("小米");
//		System.out.println(set.toString());
		//3遍历 【重点】
		//3.1使用增强for
		System.out.println("-----增强for-------");
		for (String string : set) {
			System.out.println(string);
		}
		//3.2使用迭代器
		System.out.println("-----使用迭代器------");
		Iterator<String> it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		//4判断
		System.out.println(set.contains("华为"));
		System.out.println(set.isEmpty());
	}
}

3、Set实现类

3.1 TreeSet

set:无序不可重复的集合

  • TreeSet:无序不可重复的集合,不可以存储null对象
  • 存储Integer类型数据会自动从小到大排序
  • 存储自定义数据对象 需要实现 自然排序或者比较器,否则会报类型异常

自然排序:

  • 存储的对象需要事先Comparable接口,重写compareTo()方法,在
  • compareTo()实现比较规则
  • compareTo返回正数则在节点的右边,返回负数则在节点的左边,返回0则不存储

比较器:

  • 在实例化TreeSet集合的时候,通过构造方法传递Compareator实现类的对象
  • 并重写compare(),根据compare()中的规则进行排序

代码示例:

package Day14_set.treeSet;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 19:16

set:无序不可重复的集合
    TreeSet:无序不可重复的集合,不可以存储null对象
    存储Integer类型数据会自动从小到大排序
    存储自定义数据对象  需要实现  自然排序或者比较器,否则会报类型异常

自然排序:
存储的对象需要事先Comparable接口,重写compareTo()方法,在
compareTo()实现比较规则
compareTo返回正数则在节点的右边,返回负数则在节点的左边,返回0则不存储

比较器:
在实例化TreeSet集合的时候,通过构造方法传递Compareator实现类的对象
并重写compare(),根据compare()中的规则进行排序


    当实体类无法修改时,使用比较器进行排序,反之则使用自然排序。
 *
 *          ctrl+alt+b  罗列方法实现的类
 *
 *
 *
 */
public class Demo01 {
    public static void main(String[] args) {
        TreeSet<Integer> set = new TreeSet<>();
        //添加
        set.add(10);
        set.add(62);
        set.add(80);
        set.add(101);
        set.add(1);
        set.add(7);
        set.add(98);
        System.out.println(set);

        //迭代器
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

        System.out.println(set);
        //删除
        set.remove(98);
        System.out.println(set);

        //lambda表达式
        set.forEach(item-> System.out.println(item));

        //修改  先删除,再添加
        set.remove(100);
        set.add(101);
        System.out.println(set);

        //lambda表达式
        set.forEach(i-> System.out.println(i));

    }
}

代码示例2:

存储数据对象

  1. 建立User.java类
  2. 建立Demo02.java实现类类
package Day14_set.entity;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 19:43
 */
public class User  implements Comparable<User>{
    private int id;

    public User(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                '}';
    }


    @Override
    public int compareTo(User o) {
        return o.id-this.id;
    }
}

package Day14_set.treeSet;

import Day14_set.entity.User;

import java.util.TreeSet;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 19:43
 *
 */
public class Demo02 {
    public static void main(String[] args) {
        TreeSet<User> set = new TreeSet<>();
        set.add(new User(1));
        set.add(new User(2));
        set.add(new User(3));
        set.add(new User(5));
        set.add(new User(10));
        set.add(new User(1));

        set.forEach(i-> System.out.println(i));
        System.out.println(set);
    }
}
 	

代码示例3

  1. 使用TreeSet存储数据
  2. 重写compare()方法
  1. 建立 Animal.java
  2. 建立 MyComparator.java
  3. 建立 Demo04.java
package Day14_set.entity;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 15:09
 */
public class Animal {
    private int id;
    private String name;
    private int age;

    public Animal(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

package Day14_set.treeSet;

import Day14_set.entity.Animal;

import java.util.Comparator;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 15:08
 */
public class MyComparator implements Comparator<Animal> {
    //第一个参数是要存储的对象
    //第二个参数是已存储的对象
    @Override
    public int compare(Animal o1, Animal o2) {
        if (o1.getId()!=o2.getId()){
            return o2.getId()-o1.getId();
        }
        return o1.getAge()-o2.getAge();
    }
}

package Day14_set.treeSet;

import Day14_set.entity.Animal;

import java.util.TreeSet;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 15:08
 */
public class Demo04 {
    public static void main(String[] args) {
        /**
         * 首先按id进行从大到小排序,如果id相等则按年龄进行从小到大排序
         */
        TreeSet<Animal> set = new TreeSet<>(new MyComparator());

        set.add(new Animal(1,"wzy",18));
        set.add(new Animal(1,"wzy",17));
        set.add(new Animal(1,"wzy",16));
        set.add(new Animal(2,"wzy",20));
        set.add(new Animal(2,"wzy",21));
        set.add(new Animal(3,"wzy",21));
        set.add(new Animal(4,"wzy",91));

        set.forEach(item->{
            System.out.println(item.getId()+":"+item.getAge());
        });
    }
}

3.2 HashSet

HashSet:无序不可重复集合

  • JDk1.7 hash表(不可变数组)+链表
  • JDk1.8 hash表(可变数组)+链表+红黑树
  • hash表中的元素超过当前容量的负载因子,则会发生数组扩容机制容量扩展为原来的两倍
  • 如果链表中的元素超过8个,则会转变为红黑树(平衡二叉树)

代码示例:

package Day14_set.hashset;

import java.util.HashSet;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 19:08
 */
public class Demo01 {
    /**
     HashSet:无序不可重复集合
     JDk1.7 hash表(不可变数组)+链表
     JDk1.8 hash表(可变数组)+链表+红黑树
     
     hash表中的元素超过当前容量的负载因子,则会发生数组扩容机制
     容量扩展为原来的两倍
     果链表中的元素超过8个,则会转变为红黑树(平衡二叉树)
     
     * @param args
     */
    public static void main(String[] args) {
        HashSet<Integer> list = new HashSet<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(4);
        list.forEach(item-> System.out.println(item));
    }
}

3.3 Queue

Queue:线性队列

  • 特点:先进先出,用完即删
    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

  • LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

package Day14_set.queue;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author wzy
 * @version 1.0
 * @date 0003 2020-12-03 16:50
 */
public class Demo01 {
    /**
     * Queue:线性队列
     * 特点:先进先出,用完即删
     * 作业:研究Queue队列的呃poll()方法如何先进先出,用完即删的效果
     * @param args
     */
    public static void main(String[] args) {
        Queue<Object> queue = new LinkedList<>();
        for (int i=1;i<=10;i++){
            queue.offer(i);
        }

        System.out.println(queue);
        System.out.println(queue.size());
        System.out.println(queue.poll());
        System.out.println(queue.size());
        System.out.println(queue);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值