当前位置: 首页 > article >正文

Java基础Day-Fifteen

Set集合体系及应用

  • Set集合代表一个元素无序、不可重复的集合

  • Set集合与List集合使用方法基本相同,只是处理行为略有不同

  • Set集合常用的实现类是:HashSet与TreeSet

        Set<String> mobileSet=new HashSet<String>();
        //通过add方法增加新的元素
        mobileSet.add("13542866666");
        mobileSet.add("15966666666");
        mobileSet.add("15323666666");
        System.out.println(mobileSet);
        //Set集合不允许出现重复,add方法返回值代表是否真正在集合中插入数据
        boolean isChanged=mobileSet.add("15366666666");
        System.out.println("Set集合是否发生改变:"+isChanged);
        //对于已有数据,再次调用add方法写入将返回false
        isChanged=mobileSet.add("15366666666");
        System.out.println("Set集合是否发生改变:"+isChanged);
        System.out.println(mobileSet);
        //Set集合可以使用所有Collection接口定义的方法
        int count=mobileSet.size();
        boolean result = mobileSet.contains("15366666666");
        System.out.println(result);
        //需要额外注意的是,get等以索引获取数据的方法属于List接口,因此Set实现类无法使用
  • Set集合如何确保数据的唯一性

    Set集合在新增数据时先判断数据的hashCode()是否已存在,若hashCode()在Set集合存在再调用equals()进行值的比较;hashCode()与equals()都存在的情况下,Set集合才认为数据已存在,不予新增

  • 为什么要用对象的hashCode(),直接用equals()判断不行吗

    出于执行效率考虑

    hashCode()返回的整数结果决定了Set集合中的存放位置,hashCode()计算速度很快,但可能出现哈希碰撞;equals()则对值进行比较,处理速度相对较慢

  • HashSet与TreeSet存储原理

    • HashSet

      • HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类

      • HashSet按Hash算法来决定集合元素的顺序,具有很好查找性能

      • 当向HashSet集合中存入一个元素时,根据该对象的hashCode值决定该对象在HashSet中的存储位置

      • Hash,一般翻译做散列,杂凑,或音译为哈希,是把任意长度的数据通过散列算法变换成固定的输出,该输出就是散列值

        int h;
        int hash=(h="a".hashCode())^(h>>>16);//97
        Set set=new HashSet();
        set.add("d");
        set.add("a");
        set.add("b");
        set.add("c");
        System.out.println(set);
        结果:[a,b,c,d]
    • LinkedHashSet

      • LinkedHashSet是HashSet的子类,除HashSet的特性外,它同时使用链表维护元素的次序,可以保障按插入顺序提取数据

      • LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能

      • 迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序

    • TreeSet

      • TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态

      • TreeSet采用红黑树的数据结构来存储集合元素

      • TreeSet默认采用自然排序对元素升序排列,也可以实现Comparable接口自定义排序方式

  • 掌握HashSet与TreeSet的应用

    package com.imooc.collection.set;
    ​
    import java.util.Comparator;
    import java.util.Set;
    import java.util.TreeSet;
    ​
    public class TreeSetSample {
        static class IntegerComparator implements Comparator<Integer>{
    ​
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        }
    ​
        public static void main(String[] args) {
            Set<Integer> set=new TreeSet<Integer>(new IntegerComparator());
            set.add(100);
            set.add(568);
            set.add(152);
            set.add(105);
            System.out.println(set);
        }
    }
    package com.imooc.collection.set;
    ​
    import java.util.LinkedHashSet;
    import java.util.Set;
    ​
    public class LinkedHashSetSample {
        public static void main(String[] args) {
            Set<String> mobileSet=new LinkedHashSet<String>();
            mobileSet.add("112233444555");
            mobileSet.add("002056554863");
            mobileSet.add("564643222355");
            mobileSet.add("137899655223");
            System.out.println(mobileSet);
        }
    }

Map映射体系及应用

  • Map映射特点

    • Map用于保存具有映射关系的数据,每组映射都是Key(键)与Value(值)组合而成

    • Key与Value可以是任何引用类型数据,但是Key通常是String

    • Map中的Key不允许重复,重复为同一个Key设置Value,后者Value会覆盖前者Value

HashMap
  • HashMap是Map接口的典型实现类,对Key进行无序存储

  • HashMap不能保证数据按存储顺序读取,且Key全局唯一

  • HashMap与HashSet的关系

    • Java先有Map后有Set,HashSet从HashMap精简而来

  • HashMap与LinkedHashMap的区别

    • HashMap的使用方法

              HashMap<String,Object> student=new HashMap();
              student.put("name","张三");
              //相同的key会覆盖内容
              String name=(String) student.put("name","李四");
              //先将李四进行赋值,再将张三返回给name
              System.out.println(name+"已被替换为李四");
              student.put("age", 18);
              student.put("height", 182);
              student.put("weight", 60);
              System.out.println(student);
              //获取键值对的数量
              System.out.println("当前kv的数量:"+student.size());
              //获取key的数据
              String n=(String)student.get("name");
              //判断key是否存在
              boolean r1=student.containsKey("name1");
              //判断当前数据中是否有对应的值
              boolean r2=student.containValue(61);
              //移除key值并把被移除的值赋值给w
              Integer w=(Integer)student.remove("weight");
      ​
      //运行结果:张三已被替换为李四
      //{name=李四, weight=60, age=18, height=182}
      //当前kv的数量:4
    • LinkedHashMap:放入的顺序和提取的顺序可以保持一致

              LinkedHashMap<String, Object> student = new LinkedHashMap<>();
              student.put("name","张三");
              student.put("age", 18);
              student.put("height", 182);
              student.put("weight", 60);
              System.out.println(student);
      //运行结果:{name=张三, age=18, height=182, weight=60}
TreeMap
  • TreeMap存储key-value对时,需要根据key对节点进行排序

  • TreeMap支持两种Key排序:自然排序与定制排序

  • 与TreeSet相同,TreeMap也是基于红黑树结构对数据进行排序

package com.imooc.collection.Map;
​
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
​
public class TreeMapSample {
    public void sort(){
        //按自定义规则对TreeMap进行排序
        class RecordComparator implements Comparator<String>{
​
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);//升序排列
                //o2.compareTo(o1);降序排列
            }
        }
        Map<String, Object> record = new TreeMap<>(new RecordComparator());
        record.put("A1", "1");
        record.put("C1", "2");
        record.put("B1", "3");
        record.put("D9", "4");
        record.put("G5", "5");
        record.put("S6", "6");
        record.put("Z1", "7");
        record.put("P1", "8");
        record.put("D8", "9");
        System.out.println(record);
    }
    public static void main(String[] args) {
        TreeMapSample sample = new TreeMapSample();
        sample.sort();
    }
}
Map集合的三种遍历方式
  • 第一种方式:利用for循环

    package com.imooc.collection.Map;
    ​
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Set;
    ​
    public class LoopSample {
        public void doForLoop(Map map){
            Set<String> keys=map.keySet();
            for(String k:keys){
                System.out.println(k+":"+map.get(k));
            }
        }
    ​
        public static void main(String[] args) {
            Map<String, Object> student = new LinkedHashMap<>();
            student.put("name","张三");
            student.put("age", 18);
            student.put("height", 182);
            student.put("weight", 60);
            System.out.println(student);
            LoopSample loopSample=new LoopSample();
            loopSample.doForLoop(student);
        }
    }
    ​
    /*运行结果:
    {name=张三, age=18, height=182, weight=60}
    name:张三
    age:18
    height:182
    weight:60*/
  • 第二种方式:

    package com.imooc.collection.Map;
    ​
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Set;
    ​
    public class LoopSample {
    ​
        public void doForEach(Map map){
            map.forEach((key,value)->{
                System.out.println(key+":"+value);
            });
        }
    ​
        public static void main(String[] args) {
            Map<String, Object> student = new LinkedHashMap<>();
            student.put("name","张三");
            student.put("age", 18);
            student.put("height", 182);
            student.put("weight", 60);
            System.out.println(student);
            LoopSample loopSample=new LoopSample();
            loopSample.doForEach(student);
        }
    }
    /*运行结果:
    {name=张三, age=18, height=182, weight=60}
    name:张三
    age:18
    height:182
    weight:60*/
  • 第三种方式:利用迭代器

    package com.imooc.collection.Map;
    ​
    import java.util.*;
    ​
    public class LoopSample {
    ​
        public void doIterator(Map map){
            Iterator<Map.Entry<String,Object>> itr=map.entrySet().iterator();
            while(itr.hasNext()){
                Map.Entry<String,Object> entry=itr.next();
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
        }
    ​
        public static void main(String[] args) {
            Map<String, Object> student = new LinkedHashMap<>();
            student.put("name","张三");
            student.put("age", 18);
            student.put("height", 182);
            student.put("weight", 60);
            System.out.println(student);
            LoopSample loopSample=new LoopSample();
            loopSample.doIterator(student);
        }
    }
    /*运行结果:
    {name=张三, age=18, height=182, weight=60}
    name:张三
    age:18
    height:182
    weight:60*/

http://www.kler.cn/a/386895.html

相关文章:

  • mac终端使用pytest执行iOS UI自动化测试方法
  • 在 Service Worker 中caches.put() 和 caches.add()/caches.addAll() 方法他们之间的区别
  • 软件测试面试2024最新热点问题
  • springboot 之 整合springdoc2.6 (swagger 3)
  • hadoop大数据平台
  • 算法演练----24点游戏
  • 小红书图文矩阵的运营策略与引流技巧解析
  • 兵马未动,粮草先行-InnoDB统计数据是如何收集的
  • Webserver(5.4)项目整体
  • 国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?
  • 教程:FFmpeg结合GPU实现720p至4K视频转换
  • PySimpleGUI 库 和 pymsql 库
  • 内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪
  • SQLI LABS | Less-36 GET-Bypass mysql_real_escape_string
  • Python 函数专题:可变参数详解
  • Redis(3):持久化
  • 【提高篇】3.1 GPIO(一,基础知识)
  • Doris 游戏数据分析实战,计算留存
  • 寻找存在的路径/寻找图中是否存在路径 C# 并查集
  • 亲测有效:Maven3.8.1使用Tomcat8插件启动项目
  • 《数据治理精选案例集2.0(2024版)》592页PDF(已授权分享)
  • AI大模型如何重塑软件开发流程
  • PostgreSQL 删除数据库
  • 蓝桥杯2022年第十三届省赛真题-求和
  • 《Python编程实训快速上手》第四天--字符串操作
  • 【嵌入式开发——Linux操作系统】7进程管理