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

TreeMap源码分析,Collections工具类的使用

 TreeMap源码分析

代码演示:

源码分析:

/*

    源码分析:
    1. 构造器. 把传入的实现了 Comparator接口的匿名内部类(对象),传给给TreeMap的comparator的属性
     public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
    2. 调用put方法
    2.1 第一次添加, 把k-v 封装到 Entry对象,放入root  因为是第一次添加表中都为空,所以会走这个逻辑
    Entry<K,V> t = root;
    if (t == null) {
        compare(key, key); // type (and possibly null) check

        root = new Entry<>(key, value, null);
        size = 1;
        modCount++;
        return null;
    }
    2.2 以后添加
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
        do { //遍历所有的key , 给当前key找到适当位置
            parent = t;
            cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compare
            if (cmp < 0)
                t = t.left;
            else if (cmp > 0)
                t = t.right;
            else  //如果遍历过程中,发现准备添加Key 和当前已有的Key 相等,就不添加
                return t.setValue(value);
        } while (t != null);
    }
 */
package idea.chapter14.map_;

import java.util.Comparator;
import java.util.TreeMap;

/**
 * TreeMap源码分析
 */
@SuppressWarnings({"all"})
public class TreeMap_ {
    public static void main(String[] args) {

        //如果使用的是默认的构造器,创建TreeMap, 是无序的(也没有排序)
        /*
            要求:按照传入的 k(String) 的大小进行排序,就是按照首字符大小排序
         */
        //使用无参构造器
//        TreeMap treeMap = new TreeMap();
        //使用有参构造器,传入一个comParator比较器,也是一个匿名内部类
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //按照传入的 k(String) 的大小进行排序
                //按照K(String) 的长度大小排序
                //return ((String) o2).compareTo((String) o1);
                return ((String) o2).length() - ((String) o1).length();
            }
        });
        treeMap.put("jack", "杰克");
        treeMap.put("tom", "汤姆");
        treeMap.put("kristina", "每天");
        treeMap.put("smith", "每日");
        treeMap.put("hsp", "你好");//加入不了 因为我们当前是按照字符串的长度进行比较  因此加入key加入不了,但是value的值会被替换

        System.out.println("treemap=" + treeMap);

        /*

            源码分析:
            1. 构造器. 把传入的实现了 Comparator接口的匿名内部类(对象),传给给TreeMap的comparator的属性
             public TreeMap(Comparator<? super K> comparator) {
                this.comparator = comparator;
            }
            2. 调用put方法
            2.1 第一次添加, 把k-v 封装到 Entry对象,放入root  因为是第一次添加表中都为空,所以会走这个逻辑
            Entry<K,V> t = root;
            if (t == null) {
                compare(key, key); // type (and possibly null) check

                root = new Entry<>(key, value, null);
                size = 1;
                modCount++;
                return null;
            }
            2.2 以后添加
            Comparator<? super K> cpr = comparator;
            if (cpr != null) {
                do { //遍历所有的key , 给当前key找到适当位置
                    parent = t;
                    cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compare
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else  //如果遍历过程中,发现准备添加Key 和当前已有的Key 相等,就不添加
                        return t.setValue(value);
                } while (t != null);
            }
         */

    }
}

Collections工具类

基本介绍

1)Collections是一个操作 Set、List和 Map等集合的工具类

2)Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作

排序操作:(均为static方法)

1.reverse(List):反转 List 中元素的顺序

2.shuffle(List):对 List 集合元素进行随机排序

3.sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序

4.sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序

5.swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换

查找、替换

  1. Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素

  2. Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素

  3. Object min(Collection)

  4. Object min(Collection, Comparator)

  5. int frequency(Collection,Object):返回指定集合中指定元素的出现次

  6. void copy(List dest,List src):将src中的内容复制到dest中

  7. boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值

代码演示:

package idea.chapter14.collection_;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 演示Collections工具类的使用
 */
@SuppressWarnings({"all"})
public class Collections_ {
    public static void main(String[] args) {

        //创建ArrayList 集合,用于测试.
        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("milan");
        list.add("tom");


//        reverse(List):反转 List 中元素的顺序
        Collections.reverse(list);
        System.out.println("list=" + list);
        
//        shuffle(List):对 List 集合元素进行随机排序
//        for (int i = 0; i < 5; i++) {
//            Collections.shuffle(list);
//            System.out.println("list=" + list);
//        }

//        sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
        Collections.sort(list);
        System.out.println("自然排序后");
        System.out.println("list=" + list);
        //该方法可以根据我们传入的比较器指定比较方法
//      sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
        //我们希望按照 字符串的长度大小排序
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //可以加入校验代码.
                return ((String) o2).length() - ((String) o1).length();
            }
        });
        System.out.println("字符串长度大小排序=" + list);
//        swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

        
        //比如
        Collections.swap(list, 0, 1);
        System.out.println("交换后的情况");
        System.out.println("list=" + list);

        //Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
        System.out.println("自然顺序最大元素=" + Collections.max(list));
        //Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
        //比如,我们要返回长度最大的元素
        Object maxObject = Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String) o1).length() - ((String) o2).length();
            }
        });
        System.out.println("长度最大的元素=" + maxObject);


        //Object min(Collection)
        //Object min(Collection,Comparator)
        //上面的两个方法,参考max即可
//        Object minObject= Collections.min(list, new Comparator() {
//            @Override
//            public int compare(Object o1, Object o2) {
//                return ((String)o1).length() - ((String)o2).length();
//            }
//        });
//
//        System.out.println("最小值为"+minObject);

        //int frequency(Collection,Object):返回指定集合中指定元素的出现次数
        System.out.println("tom出现的次数=" + Collections.frequency(list, "tom"));

        //void copy(List dest,List src):将src中的内容复制到dest中

        ArrayList dest = new ArrayList();
        //为了完成一个完整拷贝,我们需要先给dest 赋值,大小和list.size()一样
        // 如果不这样处理会报异常,因为新创建出来的集合是null,在底层会分别对两个集合进行比较,如果发现原来的集合大于新的集合就会报异常
        /*          源码
            public static <T> void copy(List<? super T> dest, List<? extends T> src) {
                int srcSize = src.size();
                if (srcSize > dest.size())
                    throw new IndexOutOfBoundsException("Source does not fit in dest");

         */
        for (int i = 0; i < list.size(); i++) {
            dest.add("");
        }
        //拷贝
        Collections.copy(dest, list);
        System.out.println("dest=" + dest);

        //boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
        //如果list中,有tom 就替换成 汤姆
        Collections.replaceAll(list, "tom", "汤姆");
        System.out.println("list替换后=" + list);
    }
}


http://www.kler.cn/news/18137.html

相关文章:

  • 相对路径的详细用法
  • 行为型模式-中介者模式
  • 武忠祥老师每日一题||定积分基础训练(十)
  • 9大Python常用技巧 经验之谈
  • 安全访问服务边缘 (SASE) 技术的优缺点及工作原理
  • 基于海鸥算法改进的随机森林回归算法 - 附代码
  • 美句分享~程序员的放松时间~
  • 并发编程01:基础篇
  • Linux常用命令,你需要了解多少呢?
  • Java字符串的用法、原理、性能分析和总结
  • 杜甫经典长诗“三吏”“三别”赏析
  • FAST协议解析2 FIX Fast Tutorial翻译【PMap、copy操作符】
  • 代码随想录算法训练营day30 | 332. 重新安排行程,51. N 皇后,37. 解数独
  • Ubuntu22.04.2 LTS 安装nvidia显卡驱动及配置pytorch
  • David Silver Lecture 4: Model-Free Prediction
  • 【Java|golang】2432. 处理用时最长的那个任务的员工
  • ES堆内存:大小和交换
  • Mermaid流程图
  • .net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃
  • 内网:定位域管理员
  • TokenGT:Transformer是强大的图学习器
  • java反序列化cc3链分析
  • docker基础命令
  • python基础实战7-字符串的format方法
  • 【观察】更懂业务的数智平台,才能应对数智化转型的“千变万化”
  • 5件关于JavaScript中this参数的事
  • 记录--极致舒适的Vue页面保活方案
  • linux内核:笔记1-内核和操作系统的关系
  • java程序员容易被人误解?我来聊聊常见的三种情况
  • 如何用Redis实现用户关注