Java进阶13讲__第八讲

2024-09-01 18:36
文章标签 java 进阶 13 第八

本文主要是介绍Java进阶13讲__第八讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

集合:Collection,List,Set,Map

集合体系

集合结构

单列集合

1.Collection

1.初识Collection

package cn.hdc.oop8.Collection;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;/*** 目标:认识collection集合体系*/public class Test1 {public static void main(String[] args) {//简单确认一下collection集合的特点ArrayList<String> list = new ArrayList<>();list.add("java1");list.add("java2");list.add("java1");list.add("java2");System.out.println(list);//[java1, java2, java1, java2]//有序,可重复,有索引HashSet<String> set = new HashSet<>();set.add("java1");set.add("java2");set.add("java1");set.add("java2");set.add("java3");System.out.println(set);//[java3, java2, java1]//无序,不可重复,无索引}
}

2.常用API

package cn.hdc.oop8.Collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;public class api {public static void main(String[] args) {Collection<String> list = new ArrayList<>();//实现类对象给到顶级的父类接口,这是一种多态现象//1.public boolean add (E e):添加元素,添加成功返回true。System.out.println(list.add("jsz"));//2.public void clear(): 清空集合的元素list.clear();System.out.println(list);//3.public boolean isEmpty():判断集合是否为空 是空返回true,反之。System.out.println(list.isEmpty());//4.public int size():获取集合的大小。System.out.println(list.size());//5.public boolean contains(object obj): 判断集合中是否包含某个元素。System.out.println(list.contains("jsz"));//6.public boolean remove(E e):删除某个元素:如果有多个重复元素默认删除前面的第一个!System.out.println(list.remove("jsz"));//7.public 0bject[] toArray():把集合转换成数组System.out.println(Arrays.toString(list.toArray()));Object[] objects = list.toArray();//默认是Object类型的数组//转成指定类型的数组String[] strArr = list.toArray(new String[list.size()]);System.out.println(Arrays.toString(strArr));System.out.println("-----------------------------------------------------");//把一个集合中的数据倒入到另一个集合中去Collection<String> lis = new ArrayList<>();lis.add("java1");lis.add("java2");Collection<String> lis1 = new ArrayList<>();lis1.add("java3");lis1.addAll(lis);//addAll:把lis集合的全部数据倒入到lis1集合中,lis1和lis集合的数据类型需一致System.out.println(lis1);}
}

3.遍历方式

1.迭代器

package cn.hdc.oop8.Collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class iterator {public static void main(String[] args) {Collection<String> list = new ArrayList<>();list.add("庆桑");list.add("乐桑");list.add("卓桑");list.add("毅桑");System.out.println(list);Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {//hasNext判断当前位置有没有数据,位置的变化是由next进行的,hasNext与下一个位置有没有数据无关,不要被名称表面所迷惑System.out.println(iterator.next());//hasNext判断一次,取一次/*** 错误写法:* while (iterator.hasNext()) {*     System.out.println(iterator.next());*     System.out.println(iterator.next());* }* 这样的话当集合里面数据为奇数个时第二个next会报空*/}}
}

2.增强for循环

package cn.hdc.oop8.Collection;import java.util.ArrayList;
import java.util.Collection;public class forPlus {public static void main(String[] args) {Collection<String> list = new ArrayList<>();list.add("庆桑");list.add("乐桑");list.add("卓桑");list.add("毅桑");System.out.println(list);for (String str : list) {System.out.println(str);}}
}

 增强for除了可以用来遍历集合,还可以用来遍历数组

3.Lambda

package cn.hdc.oop8.Collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class Lambda {public static void main(String[] args) {Collection<String> list = new ArrayList<>();list.add("庆桑");list.add("乐桑");list.add("卓桑");list.add("毅桑");System.out.println(list);list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});System.out.println("-----------------------------------------");list.forEach((String s) -> {System.out.println(s);});System.out.println("-----------------------------------------");list.forEach(item -> System.out.println(item));System.out.println("-----------------------------------------");list.forEach(System.out::println);}
}

为什么没有支持for循环?

因为for循环必须是支持索引的,Collection集合并不是所有集合都支持索引

4.案例

package cn.hdc.oop8.Collection.demo;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;public class Test1 {public static void main(String[] args) {Collection<Movies> list = new ArrayList<>();list.add(new Movies("《肖申克的救赎》", 9.7, "罗宾斯"));list.add(new Movies("《霸王别姬》", 9.6, "张国荣、张丰毅"));list.add(new Movies("《阿甘正传》", 9.5, "汤姆.汉克斯"));for (Movies movies : list) {System.out.println(movies);}Iterator<Movies> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}list.forEach(System.out::println);}
}

package cn.hdc.oop8.Collection.demo;public class Movies {private String name;private double score;private String actor;@Overridepublic String toString() {return "Movies{" +"name='" + name + '\'' +", score=" + score +", actor='" + actor + '\'' +'}';}public Movies() {}public Movies(String name, double score, String actor) {this.name = name;this.score = score;this.actor = actor;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}
}

2.List

1.特点、特有方法

package cn.hdc.oop8.List;import java.util.ArrayList;
import java.util.List;public class special {public static void main(String[] args) {//1.创建一个ArrayList集合对象(有序、可重复、有索引)List<String> list = new ArrayList<>();//多态list.add("666");list.add("777");list.add("888");list.add("999");System.out.println(list);System.out.println("--------------------------------------");//2.public void add(int index,E element):在某个索引位置插入元素。list.add(0, "java");list.add(4, "java");list.add(6, "java");System.out.println(list);System.out.println("--------------------------------------");//3.public E remove(int index): 根据索引删除元素,返回被删除元素System.out.println("删除的元素是:" + list.remove(0));System.out.println(list);System.out.println("--------------------------------------");//4.public E get(int index): 返回集合中指定位置的元素。System.out.println("集合首位元素是:" + list.get(0));System.out.println("--------------------------------------");//5.public E set(int index,E element): 修改索引位置处的元素,修改成功后,会返回原来的数据list.set(5, "这是末尾元素");System.out.println(list);System.out.println("--------------------------------------");}
}

2.遍历方式

3.ArrayList集合的底层原理

4.LinkedList集合的底层原理

1.什么是链表

 2.链表的特点

3.单链表和双链表

4.LinkedList集合的底层原理

5.应用场景

 1.用于设计队列

package cn.hdc.oop8.List;import java.util.LinkedList;public class LinkedListTest {public static void main(String[] args) {
//        创建一个队列LinkedList<String> list = new LinkedList<>();//入队list.addLast("sq");list.addLast("sq1");list.addLast("sq2");list.addLast("sq3");list.addLast("sq4");list.addLast("sq5");list.addLast("sq6");list.addLast("sq7");System.out.println(list);//出队list.removeFirst();list.removeFirst();list.removeFirst();System.out.println(list);}
}

2.用于设计栈 

//          创建一个栈LinkedList<String> list1 = new LinkedList<>();//压栈pushlist1.addFirst("wsn");list1.addFirst("wzn");list1.addFirst("wyr");System.out.println(list1);//弹栈poplist1.removeFirst();list1.removeFirst();System.out.println(list1);System.out.println("--------------------------------");list1.push("wsn");list1.push("wzn");list1.push("wyr");System.out.println(list1);list1.pop();list1.pop();list1.pop();System.out.println(list1);System.out.println("--------------------------------");

3.Set

1.Set集合特点

package cn.hdc.oop8.Set;import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;public class SetTest1 {public static void main(String[] args) {Set<Integer> s1 = new TreeSet<>();//可排序不重复无索引s1.add(34);s1.add(36);s1.add(37);s1.add(37);s1.add(31);s1.add(33);s1.add(33);s1.add(34);System.out.println(s1);System.out.println("-------------------------------------------");Set<Integer> s = new LinkedHashSet<>();//有序不重复无索引s.add(4);s.add(6);s.add(7);s.add(7);s.add(1);s.add(3);s.add(3);s.add(4);System.out.println(s);System.out.println("-------------------------------------------");Set<Integer> set = new HashSet<>();//创建了一个HashSet的集合对象,一行经典代码,HashSet:无序不重复无索引set.add(666);set.add(555);set.add(555);set.add(777);set.add(777);set.add(888);System.out.println(set);}
}

 Set无特殊新增常用方法

 2.HashSet集合的底层原理

1.为什么添加的元素无序、不重复、无索引?

2.增删改查数据有什么特点,适合什么场景?

1.哈希值

2.底层原理

JDK8_Before

当集合数组长度有 默认数组长度 * 默认加载因子 即16*0.75=12时,也就是当HashSet存储了12个位置的元素时,集合会扩容成其的两倍。 

如果数组快占满了,会出现什么问题?该怎么办?

会出现:链表会过长,导致查询性能降低 的问题

应该:    扩容

JKD8_After 
 二叉查找树

平衡二叉树
红黑树

 3.HashSet集合去重

深入理解HashSet集合去重复的机制

package cn.hdc.oop8.Set.DuplicateRemove;import cn.hdc.oop8.Set.Student;import java.util.HashSet;public class Test1 {public static void main(String[] args) {HashSet<Student> set = new HashSet<>();Student s1 = new Student("蜘蛛精", 25, 169.5);Student s2 = new Student("蜘蛛精1", 25, 169.5);Student s3 = new Student("蜘蛛精", 25, 169.5);Student s4 = new Student("蜘蛛精2", 25, 169.5);set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);}
}

 重写HashSet的equals和hashCode方法

    //只要两个对象内容一样,就返回true@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Double.compare(student.height, height) == 0 && Objects.equals(name, student.name);}//只要两个对象内容一样,返回的哈希值就是一样的。@Overridepublic int hashCode() {//姓名,年龄,身高return Objects.hash(name, age, height);}

重写一路回车,无需更改。

运行结果 

重写前

重写后

3.LinkedHashSet

4.TreeSet

1.定义

2.自定义排序规则

方式一

实现Comparable接口 

package cn.hdc.oop8.Set;import java.util.Objects;//public class Student {public class Student implements Comparable<Student> {private String name;private int age;private double height;//TreeSet自定义排序规则//只要两个对象内容一样,就返回true@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Double.compare(student.height, height) == 0 && Objects.equals(name, student.name);}//只要两个对象内容一样,返回的哈希值就是一样的。@Overridepublic int hashCode() {//姓名,年龄,身高return Objects.hash(name, age, height);}......getter   setter  toString    有参   无参等.......//年龄降序
//    @Override
//    public int compareTo(Student o) {
//        return o.getAge() - this.getAge();
//    }//身高升序@Overridepublic int compareTo(Student o) {
//        return this.getHeight() - o.getHeight() > 0 ? 1 : -1;return Double.compare(o.getHeight(), this.getHeight());}
}

compareTo需要的返回值是int
double数据类型的数据可以通过两种方式进行比较:

1.三元运算符
2.Double的compare方法

package cn.hdc.oop8.Set;import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;public class TreeSetTest2 {public static void main(String[] args) {//就近选择自己自带的比较器对对象进行排序
//        Set<Student> set = new TreeSet<>(Comparator.comparingInt(Student::getAge));Set<Student> set = new TreeSet<>();set.add(new Student("蜘蛛精", 250, 169.5));set.add(new Student("蜘蛛精1", 259, 169.6));set.add(new Student("蜘蛛精2", 257, 169.7));set.add(new Student("蜘蛛精3", 257, 169.8));System.out.println(set);}
}
方式二
package cn.hdc.oop8.Set;import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;public class TreeSetTest2 {public static void main(String[] args) {//就近选择自己自带的比较器对对象进行排序Set<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getAge() - o2.getAge();}});
//        Set<Student> set = new TreeSet<>();set.add(new Student("蜘蛛精", 250, 169.5));set.add(new Student("蜘蛛精1", 259, 169.6));set.add(new Student("蜘蛛精2", 257, 169.7));set.add(new Student("蜘蛛精3", 257, 169.8));System.out.println(set);}
}

Comparable接口和TreeSet集合自带比较器Comparator同时存在时,就近使用集合自带的比较器对对象进行比较排序。

5.小结

1.Collection单列集合小结

2.补充

1.集合的并发修改异常问题

package cn.hdc.oop8.zongjie;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class CollectionHighTogetherException {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("王麻子");list.add("许李国");list.add("李慕婉");list.add("藤化元");list.add("唐舞桐");list.add("圣采儿");System.out.println(list);//[王麻子, 李慕婉, 藤化元, 许立国, 唐舞桐, 圣采儿]//需求:需要找出集合中全部带“李”的名字并从集合中删除
//        Iterator<String> it = list.iterator();
//        while (it.hasNext()) {
//            if (it.next().contains("李")) {
//                list.remove(it.next());//控制台报错
//            }
//        }System.out.println("-----------------------------------------");Iterator<String> it = list.iterator();while (it.hasNext()) {if (it.next().contains("李")) {it.remove();//迭代器自带删除方法}}System.out.println("-----------------------------------------");//使用for循环遍历集合并删除集合中带“李”的名字
//        for (int i = 0; i < list.size(); i++) {
//            if (list.get(i).contains("李")) {
//                list.remove(i);//删除可能不完全
//            }
//        }System.out.println("-----------------------------------------");
//        for (int i = list.size() - 1; i >= 0; i--) {
//            if (list.get(i).contains("李")) {
//                list.remove(i);//可以删除
//            }
//        }System.out.println("-----------------------------------------");//增强for循环和Lambda表达式是无法解决这个问题的,他们都是迭代器的一种简化写法,但又无法调用迭代器的删除方法
//        for (String s : list) {
//            if (s.contains("李")) {
//                list.remove(s);
//            }
//        }System.out.println(list);}
}
2.可变参数

定义

可变参数注意事项

1.一个形参列表中,只能有一个可变参数
错误案例:public static void t(int... id,int...num) {}

2.可变参数必须放在形参列表的最后面
错误案例:public static void t(int... id,int age) {}

3.可变参数在方法内部就是一个数组,并且是一个有序数组

3.Collections工具类

1.定义及常用方法

package cn.hdc.oop8.collections;import java.util.*;public class collections {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println(list);
//1、public static <T> boolean addAll(collection<? super T>c,T...elements):为集合批量添加数据Collections.addAll(list, 6, 7, 8, 9, 0);System.out.println(list);
//2、public static void shuffle(List<?> list):打乱List集合中的元素顺序。Collections.shuffle(list);System.out.println(list);
//3、 public static <T> void sort(List<T> list):对List集合中的元素进行升序排序。Collections.sort(list);System.out.println(list);
//4、public static <T> void sort(List<T> list,Comparator<? super T> c):对List集合中元素,按照比较器对象指定的规则进行排序。Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(list);}
}

 自定义对象排序规则

        List<Student> set = new ArrayList<>();set.add(new Student("蜘蛛精", 250, 169.5));set.add(new Student("蜘蛛精1", 259, 169.6));set.add(new Student("蜘蛛精2", 257, 169.7));set.add(new Student("蜘蛛精3", 257, 169.8));
//        System.out.println(set);Collections.sort(set, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getAge() - o2.getAge();}});System.out.println(set);

4.Collection案例:斗地主

1.分析业务需求

2.分析实现

双列集合

1.Map

1.认识Map集合

2.应用场景

 3.Map集合体系

特点

package cn.hdc.oop8.Map;import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;public class knowMap {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>();//多态、经典代码,按照键无序、不重复、无索引
//        Map<String, Integer> map = new HashMap<>();//多态、经典代码,按照键无序、不重复、无索引map.put("dsb", 100);map.put("dsb", 220);//后添加的数据会覆盖之前添加的数据map.put("sj", 2);map.put("java", 2);map.put(null, null);System.out.println(map);Map<Integer, String> map1 = new TreeMap<>();map1.put(23, "java");map1.put(23, "MySQL");//后覆前map1.put(19, "Vue");map1.put(20, "Ele");System.out.println(map1);}
}

4.Map集合常用方法

package cn.hdc.oop8.Map;import java.util.HashMap;
import java.util.Map;public class MapAPI {public static void main(String[] args) {Map<Integer, String> map = new HashMap<>();map.put(23, "Java");map.put(24, "MySQL");//后覆前map.put(19, "Vue");map.put(20, "Ele");map.put(27, "Ajax");map.put(29, "React");HashMap<Integer, String> mp = (HashMap<Integer, String>) ((HashMap<Integer, String>) map).clone();//2.public int size():获取集合的大小System.out.println(map.size());System.out.println(mp.size());System.out.println("3=========");//3、public void clear():清空集合map.clear();System.out.println(map);System.out.println(mp);System.out.println("4=========");// 4.public boolean isEmpty():判断集合是否为空,为空返回true,反之!System.out.println(map.isEmpty());System.out.println(mp.isEmpty());System.out.println("5=========");//5.public V get(object key):根据键获取对应值System.out.println(mp.get(20));System.out.println(mp.get(201));System.out.println("6=========");//6.public V remove(object key):根据键删除整个元素(删除键会返回键的值):System.out.println(mp.remove(20));System.out.println(mp.remove(201));System.out.println("7=========");//7.public boolean containsKey(0bject key):判断是否包含某个键 ,包含返回true,反之System.out.println(mp.containsKey(29));System.out.println(mp.containsKey(292));System.out.println("8=========");//8.public boolean containsValue(object value): 判断是否包含某个值。System.out.println(mp.containsValue("Java"));System.out.println(mp.containsValue("JavaSpring"));System.out.println("9=========");//9.public Set<K> keySet():获取Map集合的全部键。System.out.println(map.keySet());System.out.println(mp.keySet());System.out.println("10=========");//10.public Collection<V> values():获取Map集合的全部值。System.out.println(map.values());System.out.println(mp.values());System.out.println("11=========");//11.把其他Map集合的数据倒入自己的集合中map.putAll(mp);map.putAll(mp);System.out.println(map);System.out.println(map.values());}
}

5.Map集合的遍历方式

 Map遍历测试模版

package cn.hdc.oop8.Map.bianli;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class m1 {public static void main(String[] args) {// 创建一个 HashMap 并填充数据Map<Integer, String> map = generateFixedMap();// 打印 HashMapSystem.out.println(map);}public static Map<Integer, String> generateFixedMap() {Map<Integer, String> map = new HashMap<>();// 填充固定的数据map.put(1, "Java");map.put(2, "Python");map.put(3, "C++");map.put(4, "JavaScript");map.put(5, "Go");map.put(6, "Ruby");map.put(7, "Swift");map.put(8, "Kotlin");map.put(9, "Rust");map.put(10, "PHP");map.put(11, "Scala");map.put(12, "TypeScript");map.put(13, "Dart");map.put(14, "Perl");map.put(15, "Lua");map.put(16, "Haskell");map.put(17, "Groovy");map.put(18, "Julia");map.put(19, "Elixir");map.put(20, "R");return map;}
}

1.方式一:键找值

        Set<Integer> set = map.keySet();for (Integer integer : set) {System.out.println(integer + ":" + map.get(integer));}

2.方式二:键值对

        Set<Map.Entry<Integer, String>> set = map.entrySet();for (Map.Entry<Integer, String> entry : set) {System.out.println(entry);System.out.println(entry.getKey() + ":" + entry.getValue());}

3.方式三:Lambda

        map.forEach(new BiConsumer<Integer, String>() {@Overridepublic void accept(Integer integer, String s) {System.out.println(integer + ":" + s);}});map.forEach((Integer integer, String s) -> {System.out.println(integer + ":" + s);});map.forEach((integer, s) -> System.out.println(integer + ":" + s));

6.Map集合案例:统计投票人数

案例代码 

package cn.hdc.oop8.Map.demo;import java.util.*;public class d1 {public static void main(String[] args) {List<String> list = createList();long t1 = System.currentTimeMillis();Map<String, Integer> map = statistics(list);System.out.println(map);long t2 = System.currentTimeMillis();System.out.println("time1:" + (t2 - t1));long t3 = System.currentTimeMillis();int a = 0, b = 0, c = 0, d = 0;for (int i = 0; i < list.size(); i++) {if (list.get(i).equals("A")) {a++;} else if (list.get(i).equals("B")) {b++;} else if (list.get(i).equals("C")) {c++;} else {d++;}}System.out.println("A:" + a + "\tB:" + b + "\tC:" + c + "\tD:" + d);long t4 = System.currentTimeMillis();System.out.println("time2:" + (t4 - t3));}private static Map<String, Integer> statistics(List<String> list) {Map<String, Integer> map = new HashMap<>();for (String s : list) {if (map.containsKey(s)) {map.put(s, map.get(s) + 1);} else {map.put(s, 1);}}
//        for (int i = 0; i < list.size(); i++) {
//            if (map.containsKey(list.get(i))) {
//                Integer v = map.get(list.get(i));
//                map.put(list.get(i), ++v);
//            } else {
//                map.put(list.get(i), 1);
//            }
//        }return map;}private static List<String> createList() {String[] strArr = {"A", "B", "C", "D"};List<String> list = new ArrayList<>();Random r = new Random();for (int i = 0; i < 80; i++) {list.add(strArr[r.nextInt(4)]);}return list;}
}

运行结果 

通过比较可得,map相较for循环来说,更快。

2.HashMap

1.底层原理

2.底层是基于哈希表实现的

 3.案例代码

package cn.hdc.oop8.Map.HashMap;import java.util.HashMap;
import java.util.Map;public class t1 {public static void main(String[] args) {Map<Student, String> map = new HashMap<>();map.put(new Student("wzn", 158.4, 20), "泗上");map.put(new Student("wzn", 158.4, 20), "辛集");map.put(new Student("wsn", 162.7, 21), "晋州");map.put(new Student("wyr", 165.2, 22), "邯郸");map.put(new Student("jsz", 178.7, 22), "北京");System.out.println(map);}
}

重写hashCode和equals方法 

package cn.hdc.oop8.Map.HashMap;import java.util.Objects;public class Student {private String name;private double height;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Double.compare(student.height, height) == 0 && age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, height, age);}......有参、无参、getter、setter、toString
}

3.LinkedHashMap集合原理

1.原理

2.使用 

4.TreeMap集合的原理、使用

1.原理 

2.使用

package cn.hdc.oop8.Map.TreeMap;import cn.hdc.oop8.Map.HashMap.Student;import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;public class t2 {public static void main(String[] args) {// 使用情况一的ComparatorComparator<Student> comparator1 = new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getAge() > o2.getAge() ? 1 : -1;}};Map<Student, String> map1 = new TreeMap<>(comparator1);map1.put(new Student("wyr", 165.2, 22), "邯郸");map1.put(new Student("jsz", 178.7, 22), "北京");System.out.println("Map with Comparator 1:\n " + map1);// 使用情况二的ComparatorComparator<Student> comparator2 = (o1, o2) -> {int ageCompare = Integer.compare(o1.getAge(), o2.getAge());int heightCompare = Double.compare(o1.getHeight(), o2.getHeight());if (ageCompare != 0) {return ageCompare;} else if (heightCompare != 0) {return heightCompare;} else {return o1.getName().compareTo(o2.getName());}};Map<Student, String> map2 = new TreeMap<>(comparator2);map2.put(new Student("wyr", 165.2, 22), "邯郸");map2.put(new Student("jsz", 178.7, 22), "北京");System.out.println("Map with Comparator 2: \n" + map2);}
}

2.1运行结果

 

3.可能会遇到的问题参考:

自定义对象排序方法之谁前谁后问题-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/XiaomeiGuiSnJs/article/details/141780415?spm=1001.2014.3001.5501

5.补充知识:集合的嵌套

1.什么是集合的嵌套

即一个集合内的元素是另一个集合

2.案例:省和市

 3.案例代码

package cn.hdc.oop8.Map.qiantao;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;public class t1 {public static void main(String[] args) {Map<String, ArrayList<String>> map = new HashMap<>();ArrayList<String> l1 = new ArrayList<>();Collections.addAll(l1, "南京市", "扬州市", "苏州市", "无锡市", "常州市");ArrayList<String> l2 = new ArrayList<>();Collections.addAll(l2, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");ArrayList<String> l3 = new ArrayList<>();Collections.addAll(l3, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");map.put("江苏省", l1);map.put("湖北省", l2);map.put("河北省", l3);System.out.println(map);System.out.println(map.get("河北省"));for (String s : map.get("江苏省")) {System.out.println(s);}map.forEach((p, c) -> System.out.println(p + ":" + c));}
}

4.运行结果

这篇关于Java进阶13讲__第八讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127731

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定