Java集合框架|泛型知识点全面详解

PostgreSQL性能优化:如何搭建监控体系? 本文系统讲解如何构建企业级PostgreSQL监控体系,覆盖四大核心维度:基础设施层、数据库实例层、会话与查询层、对象与存储层。通过Prometheus+Grafana+ELK等工具链实现指标采集、可视化与告警闭环管理,详细解析关键监控指标、部署方法及告警策略设计,帮助DBA快速定位慢查询、连接泄漏、存储膨胀等典型故障,构建"看得见、管得住、防得早"的数据库运维能力。 阅读详情

注:本篇属于Colletion体系插曲,主要目的是全方位梳理泛型的知识点

泛型的概念

  • 泛型,即"参数化类型",也就是说所操作的数据类型被指定为一个参数。

泛型的特性

  • 泛型只是在java的编译期会产生错误,但是在java的运行期(已经生成字节码文件后)是会被擦除的,这个期间并没泛型的存在。
//传入的类型需与泛型的类型参数相同
public class GenericTest {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        //list.add("HelloWorld"); 编译报错
    }
}

public class GenericTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        //获取ArrayList的字节码文件
        Class clazz = Class.forName("java.util.ArrayList");
        //获取add() 方法,Object.class 代表任意对象类型的数据
        Method m = clazz.getMethod("add", Object.class);
        m.invoke(list,"HelloWorld");//通过反射添加字符串类型元素数据
        System.out.println(list);
    }
}
//输出结果:[1, 2, HelloWorld]

泛型的使用

泛型类

泛型类的基本格式

class 类名称 <泛型标识>{
   ......
}

泛型类的注意事项

  • 在Java泛型中,T 是类型形参,当我们调用的时候,则传入的是类型实参。
  • T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
  • 在实例化泛型类时,必须指定T的具体类型。
  • 在使用泛型的时候如果传入泛型实参,则会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。
class Person<T>{
    private T height;
    public Person(T height) {
        this.height = height;
    }
    public T getHeight() {
        return height;
    }
    public void setHeight(T height) {
        this.height = height;
    }
}
public class GenericTest {
    public static void main(String[] args)  {
        //因为是Integer类型 所以传入的实参应该是int类型。下面同理
        Person<Integer> person1=new Person<>(180);
        Person<String> person2=new Person<>("180");
        //在使用泛型类的时候不一定要传入泛型实参
        Person person3=new Person(180.5);
        System.out.println(person3.getHeight());
        Person person4=new Person("180厘米");
        System.out.println(person4.getHeight());
    }
}

泛型接口

泛型接口的基本格式

public interface 接口名称 <T> {
    ......
}

泛型接口的注意事项

  • 在子类定义的时候继续使用泛型
interface behavior <T> {
    String cry= "正在哭";
    //T run = "正在跑"; 编译报错,因为在接口中,public static final常量需赋值,所以必须确定类型
    void shout(T key);
}
class Animal<T,V> implements behavior<T>{
    V name;
    T age;
    public Animal(V name, T age) {
      this.name = name;
      this.age = age;
    }
    @Override
    public void shout(T key) {
      System.out.println("姓名:"+name+",年龄:"+age+",行为:"+key);
    }
}
public static void main(String[] args)  {
    Animal<String,String> animal=new Animal<>("小狗","6岁");
    animal.shout("正在大叫");
}
//输出结果:
姓名:小狗,年龄:6岁,行为:正在大叫
  • 在子类实现接口的时候明确给出类型
interface behavior <T> {
    String cry= "正在哭";
    //T run = "正在跑"; 编译报错,因为在接口中,public static final常量需赋值,所以必须确定类型
    void shout(T key);
}
class Teacher<V> implements behavior<String>{
    V name;
    public Teacher(V name) {
        this.name = name;
    }
    @Override
    public void shout(String key) {
        System.out.println(name+"正在"+key);
    }
}
public static void main(String[] args)  {
        Teacher<String> teacher=new Teacher<>("赵老师");
        teacher.shout("上课");
    }
//输出结果:
赵老师正在上课

泛型通配符

协变、逆变和不变
  • 逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(比如,A≤B表示A是由B派生出来的子类)
    • f(⋅)是**逆变(contravariant)**的,当A≤B时有f(B)≤f(A)成立;
    • f(⋅)是**协变(covariant)**的,当A≤B时有f(A)≤f(B)成立;
    • f(⋅)是**不变(invariant)**的,当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系。
数组的协变
  • 可以把数组的协变看成是多态,因为B是A的子类,所以相当于B[ ]是A[ ]的子类。
class A{ }
class B extends A{ }
class C extends A{ }
class D extends B{ }

public class GenericTest2 {
    public static void main(String[] args) {
 				A[] a1=new B[10]; //和多态一样,子类对象数组可以向上转型为父类对象数组的引用
        B[] b=(B[])a1;
        //D[] d=(D[])a1; java.lang.ClassCastException 类型转换错误

        //只能向数组b赋值B类
        b[0]=new B();
        //b[1]=new D();
        //b[2]=new A();
        //b[3]=new C();
        System.out.println("----------");

        //数组a1的各个元素可以赋值以B或者B的子类
        a1[0]=new B();
        a1[1]=new D();
        //a1[2]=new A(); java.lang.ArrayStoreException 将错误类型的对象存储到一个对象数组时抛出的异常
        //a1[3]=new C(); java.lang.ArrayStoreException 将错误类型的对象存储到一个对象数组时抛出的异常
        System.out.println("----------");

        //数组a2的各个元素可以赋值以A或者A的子类
        A[] a2=new A[10];
        a2[0]=new B();
        a2[1]=new C();
        a2[2]=new D();
    }
}
泛型的不变
  • 泛型是不变的,也就是说虽然B是A的子类,但是ArrayList< A >和ArrayList< B >之间并没有内建的协变类型。
class A{ }
class B extends A{ }
class C extends A{ }
class D extends B{ }

ArrayList<A> list1=new ArrayList<A>();
//ArrayList<A> list2=new ArrayList<B>(); 编译报错
通配符的协变和逆变

协变 <? extends T>
  • extends指出了泛型的上界为T,<? extends T>称为子类通配符(上界通配符),<? extends A>意味着某个继承自A的具体类型。
  • <? extends T>不能往里存,只能往外取,取出来的东西只能存放在T或它的基类里。
class A{ }
class B extends A{ }
class C extends A{ }
class D extends C{ }
class E extends B{ }
class F extends B{ }
class G extends E{ }

public static void main(String[] args) {
    //<? extends T>不能往里存,只能往外取
    ArrayList aim=new ArrayList();
    aim.add(new B());
    ArrayList<? extends B> al = new ArrayList<E>(aim);
    //al.add(new A()); 编译错误
    //al.add(new B()); 编译错误
    //al.add(new C()); 编译错误
    //al.add(new D()); 编译错误
    //al.add(new E()); 编译错误
    //al.add(new F()); 编译错误
    //al.add(new G()); 编译错误

    //<? extends T>取出来的东西只能存放在T或它的基类里
    //所以<? extends B>只能放在B或它的基类里
    B newB=al.get(0);
    A newA=al.get(0);
    //C newc=al.get(0); 编译报错
    Object newObject=al.get(0);
    System.out.println("newB:"+newB);
    System.out.println("newA:"+newA);
    System.out.println("newObject:"+newObject);
}
//输出结果:
newB:javabase.javagather.B@5cad8086
newA:javabase.javagather.B@5cad8086
newObject:javabase.javagather.B@5cad8086
逆变 <? super T>
  • super指出泛型的下界为T,<? super T>称为超类通配符,<? extends B>代表一个具体类型,而这个类型是B的超类。
  • <? super T>往里存只能存T或T的子类,往外取只能放在Object对象里。
class A{ }
class B extends A{ }
class C extends A{ }
class D extends C{ }
class E extends B{ }
class F extends B{ }
class G extends E{ }

public static void main(String[] args) {
    //因为<? super B>说明必须是B或者B的父类
    //所以等式右边可以是new ArrayList<A>()或new ArrayList<B>()
    ArrayList<? super B> b1 = new ArrayList<A>();

    //<? super T>往里存只能存T或T的子类
    //所以<? super B>只能添加B或B的子类
    //b1.add(new A()); 编译错误
    b1.add(new B());
    //b1.add(new C()); 编译错误
    //b1.add(new D()); 编译错误
    b1.add(new E());
    b1.add(new F());
    b1.add(new G());

    //<? super T>往外取只能放在Object对象里
    //B newB=b1.get(0); 编译错误
    //A newA=b1.get(0); 编译错误
    Object newObject=b1.get(0);
    System.out.println("newObject:"+newObject);
    System.out.println("--------------");

    //因为<? super D>说明等式右边必须是D或者D的父类
    //所以等式右边可以是new ArrayList<A>()、new ArrayList<C>()或new ArrayList<D>()
    ArrayList<? super D> b2 = new ArrayList<C>();

    //<? super T>往里存只能存T或T的子类
    //所以<? super D>所以只能添加D或D的子类
    //b2.add(new A()); 编译错误
    //b2.add(new B()); 编译错误
    //b2.add(new C()); 编译错误
    b2.add(new D());
    //b2.add(new E()); 编译错误
    //b2.add(new F()); 编译错误
    //b2.add(new G()); 编译错误

    //<? super T>往外取只能放在Object对象里
    //B newB=b1.get(0); 编译错误
    //A newA=b1.get(0); 编译错误
    Object newObject2=b2.get(0);
    System.out.println("newObject2:"+newObject2);
}
//输出结果:
newObject:javabase.javagather.B@5cad8086
--------------
newObject2:javabase.javagather.D@6e0be858
通配符?的其他使用
public class GenericTest3 {
    public static void main(String[] args) {
        infor(new Worker<Number>(100));
        infor(new Worker<Integer>(200));
    }
    //通配符?解决当具体类型不确定的时候
    public static void infor(Worker<?> workers){
        System.out.println("电子厂工人总数"+workers.num+"人");
    }
}
class Worker<T>{
    T num;
    public Worker(T num) {
        this.num = num;
    }
}
//输出结果:
电子厂工人总数100人
电子厂工人总数200人

泛型方法

泛型方法的基本格式

//<T>必不可少,这表明这是一个泛型方法
public <T> T 方法名(){
		......
}
//可以这样
public <T,K> T 方法名(泛型类<K> obj){
		......
}

泛型类中的泛型方法

class Elephant<T,K>{
    T name;
    K age;
    public Elephant(T name, K age) {
        this.name = name;
        this.age = age;
    }
    //可以创建完泛型方法,但不使用<U>
    public <U> void show2(){
        System.out.println("start...");
    }
    //Elephant<T>的T和此泛型方法的T不是一个T
    public <T> void show(Elephant<T,K> elephant){
        System.out.println(elephant.name+",年龄"+elephant.age+"岁,健康状态良好");
    }
    //泛型方法中有可变参数
    public <T> void show3(T...args){
        for (T arg : args) {
            System.out.println(arg);
        }
        System.out.println("end....");
    }
}
public static void main(String[] args) {
    Elephant<String,Integer> e=new Elephant<>("大壮",6);
    e.show2();
    e.show(e);
    e.show3(1,2);
}
//输出结果:
start...
大壮,年龄6岁,健康状态良好
1
2
end....

泛型和静态方法

  • 静态方法不能访问类中定义的泛型。
  • 如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法
class Doctor<T>{
    T name;
/*    public static void show(){ //编译报错
        System.out.println(name);
    }
*/
/*    public static void show(T age){ //编译报错
        System.out.println();
    }
*/
    public static <U> void show(U doctorName){
        System.out.println(doctorName+"医生已到岗");
    }
}
public static void main(String[] args) {
   Doctor.show("小月");
}
//输出结果:
小月医生已到岗

不能实例化一个参数化类型的数组

  • 什么叫参数化类型的数组?就是这个数组里存储的对象是参数化类型,比如说ArrayList< String >就是一个类型参数为String的参数化类型,我们在Java中也称呼它为泛型。
public static void main(String[] args) {
    //ArrayList<String>[] arrayList=new ArrayList<String>[10]; 编译报错
}
  • 由于泛型具有擦除机制,在运行时的类型参数会被擦除,对于Java的数组来说,他必须知道它持有的所有对象的具体类型,而泛型的这种运行时擦除机制违反了数组安全检查的原则。
  • 如何解决这种情况呢?我们可以通过创建一个非参数化类型的数组,然后将他强制类型转换为一个参数化类型数组。
public class GenericArray {
    public static void main(String[] args) {
        //Cat<String>[] cat = new Cat<String>[10]; 编译报错
        Cat<String>[] cat;
        Cat[] c=new Cat[10];
        cat=(Cat<String>[])c;
        cat[0]=new Cat<String>("小花");
        System.out.println(cat[0].getName());
    }
}
class Cat<T>{
    T name;
    public T getName() {
        return name;
    }
    public Cat(T name) {
        this.name = name;
    }
}

Hi, welcome to JasperのBlog!

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume) 【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行? 阅读详情

相关推荐

基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取)

其他不懂的可以把代码发给AI哦,让它给你解读。

热爱分享,热爱记录 1298

Java集合框架、泛型知识点

集合 Collection 集合接口: 主要方法: 1、boolean add(Object o)添加对象到集合 2、boolean remove(Object o)删除指定的对象 3、int size()返回当前集合中元素的数量 4、boolean contains(Object o)查找集合中是否有指定的对象 5、boolean isEmpty()判断集合是否为空 6、Iterator it...

weixin_43413602的博客 365

特征选择(模型输入参数的分析选择)方法汇总

特征选择是模式识别和机器学习领域的重要研究课题之一。为了提高准确率, 人们往往最大限度地提取特征信息。然而, 过大的特征向量维数不仅导致计算成本的增加, 复杂运算也随之带来分类识别率的下降。因此, 通过合适的特征选择算法, 去除无关特征和冗余特征, 获得有助于分类的最优特征子集, 对提高识别性能和降低计算成本具有重要意义。 特征选择主要有两个功能: 减少特征数量、降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 参考资料: 优快云《几种常用的特征选择方法》 知乎《机器学习中,.

David's Tweet 1万+

Collection泛型

day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够使用泛型定义集合对象 能够理解泛型上下限 能够阐述泛型通配符的作用 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList ,那

tangiwang的博客 299

2025认证杯数学建模第二阶段B题完整论文(代码齐全):谣言在社交网络上的传播

这需要我们深入理解抽样检测所得的次品率的不确定性及其对生产决策的影响。对于问题二的决策分析,我们可将其细分为四个关键的决策节点,分别是零件 1 的质量检测、零件 2 的质量检测、成品的质量检测,以及成品检测不合格时的拆解处理。该策略的实施,保证了在算法迭代过程中,表现最为优异的个体能够得到保留,并顺利传递至下一代,从而保障了算法在寻求最优解过程中的收敛性和优化效果。因此,我们采用假设检验的方法,将次品分布构造成 t 分布,从而确定在相应置信度的条件下,抽样次数 n 和次品数 k 所需满足的要求。

2301_81596622的博客 1007

数字电路基础(CMOS电路、低功耗方法)

文章目录一、CMOS器件1.1.CMOS反相器1.2. CMOS与非门1.3.CMOS或非门1.4 CMOS与门和CMOS或门二、CMOS电路参数——功耗 一、CMOS器件 1.1.CMOS反相器 CMOS反相器实现非门功能,由一个PMOS管和一个NMOS管组成,其逻辑电路图如下: 其真值表如下: In PMOS NMOS Out 0 √ 导通 ×关闭 1 1 ×关闭 √...

Mr.翟的博客 1万+

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7442

上网第二课:办了百兆宽带,为什么测速只有一半?

最慢的那一环。

qq_36765170的博客 110

Java集合框架详解:从Collection到泛型

固定长度:数组长度在初始化后不可改变​单一类型:只能存储同一种数据类型(基本类型或对象)​操作繁琐:需手动维护容量,无法动态扩展// 传统数组示例students[0] = new Student("张三", 20);students[1] = new Student("李四", 21);// 超出容量需手动处理。

Lotarli的博客 1762

软考嵌入式 第五讲 嵌入式Linux系统技术

5.1 inittab配置文件 Linux实时操作系统开机引导时首先启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程,它是系统运行的第一个进程,进程号为1。在init运行完成并启动其他必要的后续进程后,系统开始运行,引导过程结束。 在任何时候,可以在文件inittab中添加新的记录项。重新检查inittab文件时,可以通过命令:init q/ Q使init进程立即重新读取并处理文件inittab。 5.1.1 inittab文件记录

Leon的博客 526

弱小目标检测跟踪算法研究(5) 基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制

基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制1. 前言2. 顶帽变换(Top_hat)算法3. Matlab仿真4. 小结 1. 前言 红外图像中的弱小目标,目标属性包涵“弱"和“小’’两个方面:“弱’’是指目标在红外波长上所表现出来的强度,具体反映到所拍摄的红外图像上,就是指目标的灰度值;而“小’’是指目标的尺寸大小,也就是前面所述的成像面积很小,反映到红外图像上就是指目标所占的像素数目很少。 SPIE国际光学工程学会(Societyof Photo一0ptical Instrument

sinat_34897952的博客 5293

Java的集合框架和泛型

Java 集合框架,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes。其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

2302_77179144的博客 1179

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6215

Java 集合框架与泛型

本文系统梳理了Java集合框架与泛型的核心知识,包括集合框架的结构、常用容器及其底层数据结构、算法与复杂度分析、包装类与泛型的基本用法。内容涵盖集合接口与实现、常见数据结构、算法效率衡量标准(时间复杂度、空间复杂度)、泛型类和泛型方法的实际应用与语法。通过丰富的示例和图示,帮助读者理解Java集合与泛型的设计思想及其在开发中的实际意义。

weixin_73966418的博客 1306

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Java】集合框架和泛型(三)

(1)将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。这就是泛型。泛型的本质就是参数化类型。(2)泛型的定义语法格式如下:类1或者接口 对象 = new 类2();注意:-->“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类。-->“类2”的类型实参必须和“类1”中的类型实参相同。(3)例如:ArrayList list = new ArrayList();

swy2560666141的博客 872

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 集合:泛型、Set 集合及其实现类详解

Set 集合中不能存储重复的元素,这使得 Set 集合在需要确保元素唯一性的场景中非常有用,例如去重操作。

码银的博客 1377

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java泛型详解

泛型(Generics)是Java 5引入的一个重要特性,它允许类、接口和方法操作未知类型的对象。通过使用泛型,我们可以编写更加通用、类型安全的代码,同时保持代码的简洁性和可读性。泛型本质上是一种"代码模板",它使用类型参数来表示类型,这些类型参数可以在实际使用时被实际的类型替换。这样,一份代码可以适用于多种不同的数据类型,而不需要为每种数据类型编写单独的实现。简单来说,泛型就是允许我们在定义类、接口和方法时使用类型参数(type parameters),这些类型参数稍后会被用来指定具体的类型(实际类型参数

yk_dflkg的博客 1427

第一章 集合框架和泛型

Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性、本质是参数化类型。Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作,最常用的实现类是HashMap。Map.Entry() 返回的是当前Map的item,但是这个方法只在遍历的时候有用。map.entrySet()方法,返回的是当前Map的 item Set集合。

weixin_62008675的博客 1462

【Java高级编程】集合框架和泛型

Java集合框架提供了比数组更灵活的存储方案,主要包括List(有序可重复)、Set(无序不可重复)和Map(键值对)三大接口。ArrayList基于动态数组实现,适合随机访问;LinkedList基于链表,适合频繁增删。HashSet实现Set接口,存储唯一元素;HashMap实现Map接口,提供高效键值查询。泛型可增强类型安全性,避免强制转换。Collections工具类提供排序、查找等功能。集合框架通过不同实现类满足各类数据存储需求,解决了数组长度固定、操作受限等问题。

2401_84149564的博客 1078

Java_泛型集合的定义及使用

泛型集合的定义及使用 引入 什么是泛型、为什么要引入泛型、泛型类和泛型方法的使用 实例泛型: ​ 创建对象时,为类所定义的泛型,进行参数化赋值。 类:创建对象时,为类所定义的泛型,进行参数化赋值 接口:实现接口时,为接口所定义的泛型,进行参数化赋值 静态泛型: 定义在方法的返回值类型前面:、、<T extends Comparable>、<T extends Comparable<? super T>> 可应用在形参列表、返回值两种场景上,不单单可以规范泛型,还可

Willing卡卡的博客 6717

Java 泛型详解

泛型是指在类、接口、方法的定义中,允许参数化数据类型。通过这种方式,可以编写更加通用的代码,避免重复为不同的数据类型编写相同的逻辑。泛型引入的背景: 在 Java 泛型引入之前,集合类(如ArrayList)只能存储Object类型的对象,意味着我们可以将任何对象添加到集合中,但取出对象时需要进行强制类型转换。如果转换不正确,程序会在运行时抛出。泛型的引入解决了这个问题,通过在编译期对数据类型进行约束,从而提高了代码的类型安全性和可读性。

Rockivy的博客 1410

Java高级编程–集合框架和泛型

本文介绍了Java集合框架的核心内容,重点讲解了List和Set接口及其实现类。主要内容包括:1)集合框架的作用是动态存储对象,位于java.util包中;2)List接口有序可重复,常用实现类ArrayList基于动态数组,LinkedList基于双向链表,分别适用于查询和增删场景;3)Set接口无序唯一,HashSet通过equals()方法判断对象是否重复,使用迭代器遍历Set集合。文章通过代码示例详细演示了ArrayList和LinkedList的常用操作方法,以及HashSet的特性与遍历方式,为

2301_77287584的博客 1563

Java 泛型与集合知识点总结

Java 泛型与集合知识点总结 泛型 泛型的应用 在编译时通过一个标识表示类中某个 属性/方法/参数 的类型 编译时,检查添加元素的类型,提高安全性 减少类型转换的次数,提高效率 泛型的语法 1.泛型的声明 泛型类 class 类名<K, V> {} interface 接口 {} 泛型方法 泛型方法可以定义于普通类或泛型类(区别方法使用泛型) public static T getMiddle(T… a) { } 2.泛型的使用 实例化 在类名后面指定类型参数

m0_53112262的博客 1354

Java深度探索:集合框架与泛型综合指南

《Java深度探索:集合框架与泛型综合指南》为Java开发者提供了全面且深入的集合框架和泛型知识指南。通过生动有趣的示例和图解,深入剖析Java集合框架的各个接口和实现类,深度解析泛型的使用技巧和高级应用。为读者提供从入门到精通的学习路径,助力开发者编写高效、稳定的Java程序。无论是初学者还是有一定经验的开发者,都能从本书中获得实战经验和深入知识,成为Java集合框架和泛型的专家。立即开始您的Java深度探索之旅吧!

qq_36293447的博客 2874

集合框架和泛型

Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现List集合的概述有序集合,这里的有序指的是存取顺序用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素与Set集合不同,列表通常允许重复的元素List集合的特点存取有序可以重复有索引

qq_74181819的博客 1349

Java集合框架和泛型

1、了解Java集合框架体系结构 2、会使用ArrayList存取数据 3、会使用ListedList存取数据 4、了解ArrayList与LinkedList区别 5、使用Map存取数据 6、掌握泛型的使用 7、Collections的使用

2302_76764006的博客 993
上一篇: Java集合框架|Collection体系和核心源码详解(二)
下一篇: Java集合框架|Collection体系的Set分支详解
I'm Jasper
博客等级 码龄8年 4粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值