重学java 52.Collections集合工具类、泛型

"我已不在地坛,地坛在我"

                         —— 《想念地坛》 24.5.28

一、Collections集合工具类

1.概述:集合工具类

2.特点:

        a.构造私有
        b.方法都是静态的

3.使用:类名直接调用

4.方法:

        static <T> boolean addAll(collection<? super T>c,T... elements) —> 批量添加元素

        static void shuffle(List<?> list) —> 将集合中的元素顺序打乱

        static <T> void sort(List<T> list) —> 将集合中的元素按照默认规则排序
        static <T> void sort(List<T> list,comparator<? super T> c) —> 将集合中的元素按照指定规则排序

5.Comparator比较器

a.方法:

        int compare(T ol,T o2)
                o1-o2 ->升序
                o2-o1 -> 降序    

package S84Collections;public class Person {private String name;private Integer age;public Person() {}public Person(Integer age, String name) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package S84Collections;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Demo233Collections2 {public static void main(String[] args) {ArrayList<Person> list = new ArrayList<>();list.add(new Person(18,"小明"));list.add(new Person(19,"小红"));list.add(new Person(17,"小刚"));Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {// 按年龄排序return o1.getAge()-o2.getAge();}});}
}

compareTo提前定义好排序规则

package S84Collections;public class Student implements Comparable<Student>{private String name;private Integer score;public Student() {}public Student(String name, Integer score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getScore() {return score;}public void setScore(Integer score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overridepublic int compareTo(Student o) {return this.getScore()-o.getScore();}
}
package S84Collections;import java.util.ArrayList;
import java.util.Collections;public class Demo234ArraysAsList {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();list.add(new Student("小明",100));list.add(new Student("小红",98));list.add(new Student("小刚",75));Collections.sort(list); // Student提前决定排序规则System.out.println(list);   // [Student{name='小刚', score=75}, Student{name='小红', score=98}, Student{name='小明', score=100}]}
}

6.Arrays中的静态方法:

        static <T> List<T> asList(T...a) —> 直接指定元素,转存到list集合

        public static void main(string[] args){

                List<string> list = Arrays.asList("张三","李四”,"王五”);

                System.out.printin(list):

        }

package S84Collections;import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;public class Demo235ArraysAsList {public static void main(String[] args) {// static <T> List<T> asList(T...a) —> 直接指定元素,转存到list集合中// public static void main(string[] args){//      List<string> list = Arrays.asList("张三","李四”,"王五”);//      System.out.printin(list):// }List<String> list = Arrays.asList("张三","李四","王五");System.out.println(list);}
}

二、泛型 E/T/V/R

1.为什么要使用泛型?

        ① 从使用层面上说:

                统一数据类型,防止将来的数据类型转换异常

        ② 从定义层面来看:

                定义带泛型的类、方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更加灵活

import java.util.ArrayList;public class Demo236Genericity1 {public static void main(String[] args) {ArrayList<Object> list = new ArrayList<>();list.add("hello");list.add("world");list.add(1);list.add(2.5);list.add(true);// 获取元素中为String类型的字符串长度for (Object o : list) {String s = (String) o;System.out.println(s.length());}}
}

2.什么时候确定类型

        new对象的时候确定类型

3.含有泛型的类

package S85Genericity;import java.util.Arrays;public class MyArrayList <E>{// 定义一个数组,充当ArrayList底层的数组,长度直接规定为10Object[] obj = new Object[10];// 定义size,代表集合元素个数int size;// 定义一个add方法,参数类型需要和泛型类型保持一致,数据类型为E,变量名随意public boolean add(E e){obj[size] = e;size++;return true;}// 定义一个get方法。根据索引获取元素public E get(int index){return (E) obj[index];}@Overridepublic String toString() {return Arrays.toString(obj);}
}
package S85Genericity;public class Demo238Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();list.add("一切都会好的");list.add("我一直相信");System.out.println(list);   // 直接输出对象名,默认调用toString// [一切都会好的, 我一直相信, null, null, null, null, null, null, null, null]System.out.println("————————————————————————");MyArrayList<Integer> list1 = new MyArrayList<>();list1.add(1);list1.add(2);list1.add(3);System.out.println(list1);// [1, 2, 3, null, null, null, null, null, null, null]Integer ele = list1.get(1);System.out.println(ele);    // 2}
}

4.含有泛型的方法

① 格式:

        修饰符 <E> 返回值类型 方法名(E e)

② 什么时候确定类型

        调用的时候确定类型

③ 示例

import java.util.ArrayList;public class ListUtils {// 定义一个静态方法addAll,添加多个集合的元素// 可变参数: E...e 可变参类型// E是声明不是返回值类型,还要另外传参数类型public static <E> void addAll(ArrayList<E> list,E ...e){// 遍历数组for (E element : e) {list.add(element);}}
}
public class Demo238Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();list.add("一切都会好的");list.add("我一直相信");System.out.println(list);   // 直接输出对象名,默认调用toString// [一切都会好的, 我一直相信, null, null, null, null, null, null, null, null]System.out.println("————————————————————————");MyArrayList<Integer> list1 = new MyArrayList<>();list1.add(1);list1.add(2);list1.add(3);System.out.println(list1);// [1, 2, 3, null, null, null, null, null, null, null]Integer ele = list1.get(1);System.out.println(ele);    // 2}
}

5.含有泛型的接口

① 格式:

        public interface 接口名<E>{

        

        }

② 什么时候确定类型:

        a.在实现类的时候还没有确定类型,只能在new实现类的时候确定类型了 —> ArrayList

        b.在实现类的时候百接确定类型了 —> 比如Scanner

③ 示例

        接口

package S85Genericity;public interface MyList <E>{public boolean add(E e);
}
package S85Genericity;import java.util.Arrays;public class MyArrayList1<E> implements MyList<E>{// 定义一个数组,充当ArrayList底层的数组,长度直接规定为10Object[] obj = new Object[10];// 定义size,代表集合元素个数int size;// 定义一个add方法,参数类型需要和泛型类型保持一致,数据类型为E,变量名随意public boolean add(E e){obj[size] = e;size++;return true;}// 定义一个get方法。根据索引获取元素public E get(int index){return (E) obj[index];}@Overridepublic String toString() {return Arrays.toString(obj);}
}
package S85Genericity;public class Demo239MyListTest {public static void main(String[] args) {MyArrayList<String> list1 = new MyArrayList<>();list1.add("nov 新的");list1.add("port 站点");list1.add("trans 转变");list1.add("fer 拿");list1.add("cover 覆盖 表面");list1.add("fess 说 讲");list1.add("view 看作 视作");list1.add("mean 意思 包含");list1.add("con 一起");list1.add("age 年龄 年代 作名词");System.out.println(list1);System.out.println(list1.get(0));}
}

6.泛型的上限下限

        1.作用:可以规定泛型的范围

        2.上限:

                a.格式:<? extends 类型>
                b.含义:?只能接收extends后面的本类类型以及子类类型

        3.下限:

                a.格式:<? super 类型>
                b.含义:?只能接收super后面的本类类型以及父类类型

7.应用场景:

        1.如果我们在定义类,方法,接口的时候,如果类型不确定,我们可以考虑定义含有泛型的类、方法、接口

        2.如果类型不确定,但是能知道以后只能传递某个类的继承体系中的子类或者父类,就可以使用泛型的通配符

package S85Genericity;import java.util.ArrayList;
import java.util.Collection;/*Integer ——> number ——> objectString ——> Object*/
public class Demo240Genericity4 {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();ArrayList<String> list2 = new ArrayList<>();ArrayList<Number> list3 = new ArrayList<>();ArrayList<Object> list4 = new ArrayList<>();get1(list1);// get1(list2);  错误get1(list3);// get1(list4); wojA\System.out.println();// get2((list1)); 错误// get2(list2);get2(list3);get2(list4);}//    上限    ? 只能接受extends后面的本类类型以及子类类型public static void get1(Collection<? extends Number> collection){}//    下限    ? 只能接收super后面的技术类型以及父类类型public static void get2(Collection<? super Number> collection){}//    应用场景:
//1.如果我们在定义类,方法,接口的时候,如果类型不确定,我们可以考虑定义含有泛型的类,方法,接口
// 2.如果类型不确定,但是能知道以后只能传递某个类的继承体系中的子类或者父类,就可以使用泛型的通配符}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv10(1):初探,训练自己的数据

目录 1. 写在前面 2. 值得关注的点 3. 训练自己的数据集 4. 阅读代码的小建议 1. 写在前面 很多人YOLOv9还没有完全研究透&#xff0c;YOLOv10出来了。 惊不惊喜&#xff0c;意不意外&#xff01; 据论文里提到&#xff0c;YOLOv10就是为了加速推理&#xff0c;在保证精度的…

深入分析 Android BroadcastReceiver (二)

文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…

VSCode插件Sort Lines

Sort Lines是一款VSCode中的扩展&#xff0c;可以帮助你对所选文本或整个文件中的行进行排序。可以给你按字母大小排序&#xff08;升序、降序&#xff09;&#xff0c;也可以进行排序去重。而且还能将所有文本打乱顺序。做短文本分类的训练&#xff0c;清洗数据集的时候&#…

汽车IVI中控开发入门及进阶(二十五):CVBS视频流

前言: AHD和CVBS是两种视频格式,在车载摄像头中,有支持传统CVBS模拟视频的摄像头,也有支持新的高分辨率AHD格式的摄像头。 CVBS视频是经典的模拟视频格式,在视频经常显示在小型监视器上的车辆上仍然最受欢迎。如果想要车辆的最大分辨率,可选择AHD格式,即高分辨率模拟视…

VRRP联动BFD的相关配置

今天就与大家分享VRRP联动BFD的相关配置&#xff0c;同时也会演示一下没有BFD的情况下&#xff0c;又是如何呢&#xff1f;前后做个对比&#xff0c;只要把情况了解清楚了&#xff0c;初学者才能更加深刻地掌握它。 一、实验拓扑图 二、配置思路 我们在做任何事情&#xff0c…

CTF中的命令执行绕过方式

引言 不论在CTF还是实战中&#xff0c;命令执行的场景五花八门&#xff0c;那么往往在一些小型比赛中&#xff0c;会以那种PING接口进行getflag操作。 0x01&#xff1a;管道符 在用linux命令时候,我们可以一行执行多条命令或者有条件的执行下一条命令&#xff0c;下面我们讲解…

24.6.2(动态开点线段树)

星期一&#xff1a; cf edu round 36 E cf传送门 题意&#xff1a;1到n天初始全为工作日&#xff0c;有两种操作&#xff0c;将 l-r 区间变为 工作日/休息日&#xff0c;每次操作后询问剩余总工作日有多少 思路&…

假指纹与活体指纹检测

目录 1. 假指纹简介 2. 假指纹制作流程 3. 活体指纹检测 4. 活体指纹检测竞赛 1. 假指纹简介 随着科学技术的发展&#xff0c;指纹技术以各种各样的形式进入了我们的生活。在大多数情况下&#xff0c;指纹识别应用于移动设备和桌面设备解决方案&#xff0c;以提供安全方便的…

android高效读图方式——Hardwarebuffer读图

安卓上有许许多多使用OpenGL来渲染的原因&#xff0c;比方说做特效/动画/硬解/人脸识别等等。渲染完成后如何从gpu中把数据快速读取出来也是高效图像处理中的重要的一环。 相对于glReadPixel的同步读取方式&#xff0c;安卓GLES3.0提供了更高效快速的Hardwarebuffer读图方式&a…

摸鱼大数据——Hive调优1-3

hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation 1、调优方式 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮助定位问题。然而实践中…

利用人工智能实现量子计算

转载自&#xff1a;利用人工智能实现量子计算 2024年 5月 12日 By Mark Wolf https://developer.nvidia.com/zh-cn/blog/enabling-quantum-computing-with-ai/ 文章目录 一、概述二、改进量子处理器三、校正噪声量子位的误差四、开发高效的量子算法五、探索量子计算的人工智能 …

编写一个问卷界面 并用JavaScript来验证表单内容

倘若文章和代码中有任何错误或疑惑&#xff0c;欢迎提出交流哦~ 简单的html和css初始化 今天使用JavaScript来实现对表单输入的验证&#xff0c; 首先写出html代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

Halcon 双相机标定与拼图(一)

二、算子解释 get_calib_data camera-pose 获得基于第一个相机的第二个相机的Pose get_calib_data (CalibDataID, camera, 1, pose, RelPose2) *relative 相对 * To get the absolute pose of the second camera, its relative pose needs * to be inverted and combined…

QT 音乐播放器【二】 歌词同步+滚动+特效

文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现&#xff0c;你所看到的歌词都是QGraphicsObject&#xff0c;在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…

1121 祖传好运

solution 好运数&#xff1a;去除任意位末尾数位 所得到的数都满足能够被当前数位整除 #include<iostream> #include<string> using namespace std; int main(){int k, flag;string s;cin >> k;while(k--){flag 1;cin >> s;for(int i 1; i < s.…

【Linux】进程(3):运行,阻塞,挂起

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;3&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09; 运行&#xff08;R&#xff09;进程切…

在gitlab上发布npm二进制文件

❝ 允许奇迹发生 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。 前言 还记得之前我们讲过如何在 npm 上发布二进制文件&#xff1f;吗。我们通过npm将我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中生成Rust二进制文…

生物制药企业选择谷歌云的理由有哪些?

AI发展的这一年&#xff0c;科学家也紧随其后&#xff0c;透过AI拓展更多微观层面的生物学奥义&#xff0c;包括蛋白质折叠等。生物制药公司也加大了在药物研发领域的投入&#xff0c;其中一方面就是搭载云平台。那么&#xff0c;生物制药公司选择谷歌云的原因有哪些呢&#xf…

Python | Leetcode Python题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest_streak 0num_set set(nums)for num in num_set:if num - 1 not in num_set:current_num numcurrent_streak 1while current_num 1 in num_set:curre…

Flutter基础 -- Dart 语言 -- 进阶使用

目录 1. 泛型 generics 1.1 泛型使用 1.2 泛型函数 1.3 构造函数泛型 1.4 泛型限制 2. 异步 async 2.1 异步回调 then 2.2 异步等待 await 2.3 异步返回值 3. 生成器 generate &#xff08;了解&#xff09; 3.1 同步生成器 sync* 使用 sync* 的场景 总结 3.2 异…