java day20 Set集合 Map集合

1、集合

1.1、Set集合

java.util.Set 接口继承了Collection接口,是常用的一种集合类型

  • set集合的特点
    1. set是一种无序的集合
    2. set是一种不带下标索引的集合
    3. set是一种不能存放重复数据的集合
  • List和Set的区别
    1. List存放有序的且可重复的数据
    2. Set存放是无序的且不可重复的数据

1.2、Set实现类

Set有两个实现类

  • HashSet
  • TreeSet(Set接口的子接口SortedSet的shixianl)
  1. HashSet依靠的是HashMap实现的

  2. HashSet中存储的元素是无序的,主要是因为它是靠对象的哈希值来确定元素在集合中的存储位置

  3. Hashset中元素不可重复,主要是靠对象的hashCode和equals方法来判断对象是否重复的

    • 判断两个对象是否重复首先要判断两个对象的hashCode是否相同
    • 如果hashCode相同,就用equals比较,如果相同就是重复对象
    • hashCode和equals是可以自己重写的
  4. TreeSet可以将我们存进去的数据进行排序

  5. 排序方式有两种:

    • 自然排序

      1. 如果一个类,实现了java.lang.Comparable接口,那么这个类的两个对象就是可以比较大小的

        public interface Comparable<T> {
          public int compareTo(T o);
        }
        
      2. compareTo方法使用说明:

        int result = o1.compareTo(o2);

        • result的值大于0,说明o1比o2大
        • result的值小于0,说明o1比o2小
        • result的值等于0,说明o1等于o2

        数据排序的前提,一定是可以比较出数据的大小

        Integer实现Comparable的接口

        public class Integer implements Comparable<Integer>{
          public int compareTo(Integer anotherInteger) {
            return compare(this.value,
        anotherInteger.value);
         }
          public static int compare(int x, int y) {
            return (x < y) ? -1 : ((x == y) ? 0 : 1);
         }
        }
        

        当然可以自己定义一个类实现Comparable接口

        public class Student implements Comparable{
          String name;
          int age;
          public Student(){}
          public Student(String name, int age) {
            this.name = name;
            this.age = age;
         }
          @Override
          public String toString() {
            return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
         }
             public int compareTo(Object o) {
            //注意,这里this代表我,other代表你,也就是当前要和
        我比较大小的对象
            Student other = (Student)o;
            //如果我的年龄比你大,就返回正数,说明我比你大
            if(this.age > other.age){
              return 1;
           }
            //如果我的年龄比你小,就返回负数,说明我比你小
            else if(this.age < other.age){
              return -1;
           }
            //其他情况返回0,说明俩个对象(我和你)一样大
            else {
              return 0;
           }
        /*
        可以直接写:
        public int compareTo(Object o){
        return this.age-(Student)o.age;
        }
        */
        

        compareTo方法只关心返回值

    • 比较器排序

      1. java.util.Comparator接口,是一个比较器接口,它的实现类可以对两个对象做出大小的比较

        public interface Comparator<T> { 
          int compare(T o1, T o2);
        }
        
      2. 比较器的使用规则:

        int result = compare(o1 ,o2)

        • result的值大于0,说明o1比o2大
        • result的值小于0,说明o1比o2小
        • result的值等于0,说明o1等于o2
        public TreeSet(Comparator<? super E> comparator) {
          this(new TreeMap<>(comparator));
        }
        public class Student{
          String name;
          int age;
          public Student(){}
          public Student(String name, int age) {
            this.name = name;
            this.age = age;
         }
          @Override
          public String toString() {
            return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
         }
        }
        public static void main(String[] args) {
          //使用Comparator接口,创建出匿名内部类对象,这个对象就是
        要用的比较器对象
          Comparator c = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
              Student s1 = (Student) o1;
              Student s2 = (Student) o2;
              return s1.age > s2.age? 1 :
        (s1.age==s2.age? 0 : -1);
           }
         };
          //创建TreeSet对象的时候,把比较器对象传入
          Set set = new TreeSet(c);
         
          set.add(new Student("mary",23));
          set.add(new Student("jack",21));
          set.add(new Student("tom",20));
        思考:这两种排序方式区别是什么
        自然排序:
        存入集合的数据要实现Comparable接口
        创建TreeSet对象不需要传入比较器
        Comparable 是在 java.lang
        比较器排序
        存入的数据不需要实现某些接口
        创建TreeSet需要传入一个比较器
        Comparator 实在java.util
        共同点:
        方法返回值的意义是相同的
          set.add(new Student("lucy",22));
          for(Object obj : set){
            System.out.println(obj);
         }
        }
        //运行结果:
        Student{name='tom', age=20}
        Student{name='jack', age=21}
        Student{name='lucy', age=22}
        Student{name='mary', age=23}
        
    • 这两种排序方式的区别

      1、自然排序

      存入集合的数据要实现Comparable接口

      创建TreeSet对象不需要传入比较器

      Comparable是在java.lang

      2、比较器排序

      存入的数据不需要实现某些接口

      创建TreeSet需要传入一个比较器

      Comparator是在java.util

      共同点:

      方法返回值的意义相同

1.3、Map集合

Map类型集合和Collection类型集合,前者是存储双列数据,后者存储单列数据

Map存储的都是键值对-----一个key值对应一个value值,这种也称为映射

Java.util.Map<K,V>接口,就是专门处理这种映射关系数据的集合类型

Map集合特点

  1. key值必须是唯一的,value值允许重复
  2. 键(key)和值(value)一一映射,一个key对应一个value
  3. 在Map中,可以通过唯一的key值,快速找到value值
  • Map接口中的方法

    //把key-value存到当前Map集合中
    V put(K key, V value)
    //把指定map中的所有key-value,存到当前Map集合中
    void putAll(Map<? extends K,? extends V> m)
    //当前Map集合中是否包含指定的key值
    boolean containsKey(Object key)
    //当前Map集合中是否包含指定的value值
    boolean containsValue(Object value)
    //清空当前Map集合中的所有数据
    void clear()
    //在当前Map集合中,通过指定的key值,获取对应的value
    V get(Object key)
    //在当前Map集合中,移除指定key及其对应的value
    V remove(Object key)
    //返回当前Map集合中的元素个数(一对key-value,算一个元素数
    据)
    int size()
    //判断当前Map集合是否为空
    boolean isEmpty()
    //返回Map集合中所有的key值
    Set<K> keySet()
    //返回Map集合中所有的value值
    Collection<V> values()
    //把Map集合中的的key-value封装成Entry类型对象,再存放到set集
    合中,并返回
    Set<Map.Entry<K,V>> entrySet()
    

1.4、Map实现类

经常用到Map实现类有

HashMap,HashTable,TreeMap,LinkedHashMap

  1. HashMap :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。(重要,最常用)
  2. HashTable :和之前List集合中的 Vector 的功能类似,可以在多线程环境中,保证集合中的数据的操作安全,类中的方法大多数使用了 synchronized 修饰符进行加锁。(线程安全)(不能够存储null值)
  3. TreeMap :该类是 Map 接口的子接口 SortedMap 下面的实现类,和 TreeSet 类似,它可以对key值进行排序,同时构造器也可以接收一个比较器对象作为参数。支持key值的自然排序和比较器排序俩种方式。(支持key排序)
  4. LinkedHashMap :该类是 HashMap 的子类,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;存入顺序就是取出顺序)

1.5、Map遍历

  • Map中的keySet方法,可以返回Map集合中所有的key值的集合

    拿到Set集合后,就可以遍历Set集合拿到Map中每个key值,通过key值可以获取到对应的value值(get方法)

  • Map中的values方法,可以返回Map集合中所有的value值的集合

    拿到Collection集合后,可以可以遍历Collection集合拿到Map中每一个value值,但是这时候拿不到相应的key

  • Map中的entrySet方法
    Map 接口中有定义了一个内部接口 Entry :(类似于内部类)

    public interface Map<K,V>{
     
      interface Entry<K,V> {
        K getKey();
        V getValue();
     }
     
    }
    

    一个Entry类型的对象,可以代表Map集合中的一组key-value(键值对),并且提供了获取key值和value值的方法。
    Map 接口中的 entrySet() 方法,就是将 Map 集合中的每一组key-value(键值对)都封装成一个 Entry 类型对象,并且把这些个Entry 对象存放到Set集合中,并返回

1.6、集合工具类

java.util.Collections 也是一个工具类,专门用来操作集合对象的,里面都是静态方法,可以直接调用。

** Collection 接口 和 Collections 类 的区别**

Collections 中的常用方法:

  • fill方法,使用指定元素替换指定列表中的所有元素
  • max方法,根据元素的自然顺序,返回给定集合的最大元素
  • min方法,根据元素的自然顺序,返回给定集合的最小元素
  • reverse方法,反转集合中的元素
  • sort方法,根据元素的自然顺序,对指定列表按升序进行排序
  • shuffle方法,使用默认随机源对指定列表进行置换
  • addAll方法,往集合中添加一些元素
  • synchronizedCollection,把非线程安全的Collection类型集合,转为线程安全的集合
  • synchronizedSet,把非线程安全的Set类型集合,转为线程安全的集合
  • synchronizedMap,把非线程安全的Map类型集合,转为线程安全的集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值