32.0/TreeSet使用定制排序/ Map键值对集合/Collections集合工具类

目录

32.1TreeSet使用定制排序。

 32.2Map键值对集合

32.3往hashMap存放元素

32.3修改

32.4查询

 32.5map集合的遍历

32.6HashMap底层原理。

 32.7Collections

 排序↓


32.1TreeSet使用定制排序。

如果该类class People implements Comparable<People> 之前别人定义好,

但是没有实现自然排序规则的接口Comparable。

例如:

TreeSet中添加字符串类,按照字符串的长度。

这时使用自然排序就不行了。只能使用定制排序。

public class Test01 {
    public static void main(String[] args) {
        //Comparator<? super E> comparator:定义排序规则接口.
        TreeSet<String> set=new TreeSet<>(new MyComparator());
        set.add("java01");
        set.add("jav3");
        set.add("j2");
        set.add("j");
        set.add("jjava");
        System.out.println(set);
    }
}
public class MyComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
}

 上面定义的排序规则类,只使用了一次。可以不用创建一个排序规则类,使用匿名内部类的。

public class Test01 {
    public static void main(String[] args) {
        //Comparator<? super E> comparator:定义排序规则接口.
        //直接创建接口对象时,并重写接口中的方法这种方式就匿名[内部类]实现类
        Comparator<String> comparator=new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        };


        TreeSet<String> set=new TreeSet<>(comparator);
        set.add("java01");
        set.add("jav3");
        set.add("j2");
        set.add("j");
        set.add("jjava");
        System.out.println(set);
    }
}

 32.2Map键值对集合

里面存放的元素:Entry类型的元素,该元素包含key和value。

它是所有键值对集合的根类。它的子类: HashMap

32.3往hashMap存放元素

 Map m=new HashMap();//创建一个Map对象
        m.put("name","吴韩煜");//往map中添加元素。
        m.put("age",18); //里面的key不能重复。如果出现重复,则后置把前缀替换。
        m.put("name","欧炜健"); //里面的key不能重复。如果出现重复,则后置把前缀替换。判断key的重复性:按照hashcode和equals方法判断的。
        System.out.println(m);

32.3修改

m.replace("name","刘德华");

 建议:使用put替换

32.4查询

 Object name = m.get("name");//根据key获取对应的值
        System.out.println("name对应的值:"+name);

        //如果指定的key存在,则获取对应的value值,否则获取defaultValue值.
        Object orDefault = m.getOrDefault("name", "闫克起");
        System.out.println("names对应的值:"+orDefault);

        Set keySet = m.keySet();//获取map中所有的key
        System.out.println("map中所有的key:"+keySet);

        Collection values = m.values();//获取map中所有的value值
        System.out.println("获取map中所有的value值"+values);

 32.5map集合的遍历

  1. 根据key遍历---阿里巴巴不建议使用

 //1.获取map中所有的key
        Set keySet1 = m.keySet();
        //2.遍历key
        for(Object k:keySet1){
            //3.根据key获取map对应的value
            Object v = m.get(k);
            System.out.println(k+"->"+v);
        }

 2.增强循环↓

System.out.println("===============增强循环==================");
        Set<Map.Entry> set = m.entrySet(); //获取map中所有的元素.---
        for(Map.Entry entry:set){
            System.out.println(entry.getKey()+"======="+entry.getValue()); //key=value
        }

32.6HashMap底层原理。

jdk1.7之前 底层使用的是数组+链表。而且链表是头部插入。

jdk1.8之后 底层使用的是数组+链表,数组+红黑树。而且链表是尾部插入。

HashMap通过put(key,value)进行存储数据,通过get(key)来获取数据,在传入key时,会对key进行hash计算,得到一个hash值,如果hash一致且equals不同,这种现象称为hash冲突。HashMap通过链表和红黑树解决hash冲突问题,如果hash冲突少,使用链表。hash冲突多[个数超过8且数组长度大于64位],则使用红黑树。

public V put(K key, V value) {
        //hash(key):对key进行hash计算。
        return putVal(hash(key), key, value, false, true);
    }

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            //表示key得hash相同,且equals也相同。替换原来的元素。
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            //表示树形节点--把元素放入红黑树中
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        //把节点放入链表后
                        p.next = newNode(hash, key, value, null);
                        //hash冲突个数大于TREEIFY_THRESHOLD转化为树形结构 8个
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        //当数组长度大于原本的长度--扩容
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

 32.7Collections

它是一个工具类。---里面的方法全部是静态方法。

二分查找List。

static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 

package demo01;

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

/**
 * @program: day1113
 * @description:
 * @author: 闫克起2
 * @create: 2023-11-13 17:30
 **/
public class Test03 {
    public static void main(String[] args) {
//        List<String> list=new ArrayList<>();
//        list.add("java05");
//        list.add("java06");
//        list.add("java02");
//        list.add("java03");
//        list.add("java04");
//        list.add("java01");
//
//        int i = Collections.binarySearch(list, "java02");
//        System.out.println("位置:"+i);
        List<Student> list=new ArrayList<>();
        list.add(new Student("吴韩煜",99));
        list.add(new Student("赖林龙",199));
        list.add(new Student("欧炜健",19));
        list.add(new Student("胡荣纯",119));
        list.add(new Student("陈政君",11));

        int i = Collections.binarySearch(list, new Student("欧炜健", 17), new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("位置:"+i);
    }
}
class Student{
    private String name;
    private int age;

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

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
static void reverse(List<?> list)
 List<Student> list=new ArrayList<>();
        list.add(new Student("吴韩煜",99));
        list.add(new Student("赖林龙",199));
        list.add(new Student("欧炜健",19));
        list.add(new Student("胡荣纯",119));
        list.add(new Student("陈政君",11));

        System.out.println(list);

        System.out.println("+========================倒置后============================");
        Collections.reverse(list);
        System.out.println(list);

 洗牌功能↓

static void shuffle(List<?> list)  
  List<Student> list=new ArrayList<>();
        list.add(new Student("吴韩煜",99));
        list.add(new Student("赖林龙",199));
        list.add(new Student("欧炜健",19));
        list.add(new Student("胡荣纯",119));
        list.add(new Student("陈政君",11));

        System.out.println(list);

        System.out.println("+========================洗牌后============================");
        Collections.shuffle(list);
        System.out.println(list);

 排序↓

static <T> void sort(List<T> list, Comparator<? super T> c) 
  List<Student> list=new ArrayList<>();
        list.add(new Student("吴韩煜",99));
        list.add(new Student("赖林龙",199));
        list.add(new Student("欧炜健",19));
        list.add(new Student("胡荣纯",119));
        list.add(new Student("陈政君",11));

        System.out.println(list);

        System.out.println("+========================按照年龄排序============================");
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o2.getAge()-o1.getAge();
            }
        });
        System.out.println(list);

把线程不安全的集合转化为线程安全的集合。↓

static <T> List<T> synchronizedList(List<T> list)  
List<Student> students = Collections.synchronizedList(list);
System.out.println(students);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明是人的信仰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值