【Java】集合进阶——泛型

简介: 【Java】集合进阶——泛型

4.泛型

   4.1泛型概述

 泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数


   一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口。

   泛型定义格式:

  •    <类型>:指定一种类型的格式。这里的类型可以看成是形参
  •   <类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
  •    将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用的数据类型。

     泛型的好处:

  •    把运行期间的问题提前到了编译期间
  •    避免了强制类型转换

4.2泛型类

   泛型类的定义格式:

  •    格式:修饰符class类名<类型>{}
  •    范例:public class Generic<T>{}

  此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

   

   4.3泛型方法

   泛型方法的定义格式:

  •   格式:修饰符<类型>返回值类型方法名(类型 变量名){}
  •    范例:public <T> void show(T t){}

 

   4.4泛型接口

   泛型接口的定义格式:

  •  格式:修饰符interface 接口名<类型>{}
  •    范例:public interface Generic<T>{}

 

   4.5类型通配符

   为了表示各种泛型List的父类,可以使用类型通配符

类型通配符:<?>

  •    List<?>:表示元素类型未知的List,他的元素可以匹配任何的类型。
  •    这种带通配符的List仅表示他是各种泛型List的父类,并不能把元素添加到其中。

    如果说我们不希望List<?>是任何泛型的父类,只希望他代表某一类泛型List的父类,可以使用类型通配符的上限

  •    类型通配符上限:<?extends 类型>
  •    List<? extends Number>:他表示的类型是Number或者其子类型

   除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限。

  •    类型通配符下限:<?super 类型>
  •    List<? super Number>:它表示的类型是Number或者其父类型。

//类型通配符:<?>

List<?> list1 = new ArrayList<Object>();

List<?> list2 = new ArrayList<Number>();

List<?> list3 = new ArrayList<Integer>();

 

 

//类型通配符上限:<? extends 类型>

List<? extends Number>list4 = new ArrayList<Number>();

List<? extends Number>list5 = new ArrayList<Integer>();

 

 

//类型通配符下限:<? super 类型>

List<? super Number>list6 = new ArrayList<Number>();


List<? super Number>List7 = new ArrayList<Object>();

   

   4.6可变参数

   可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了

  •    格式:修饰符 返回值类型 方法名(数据类型...变量名){}
  •    范例:public static int sum(int...a){}

 

   可变参数的注意事项:

  • 这里的变量是一个数组
  •    如果一个方法有多个参数,包含可变参数,可变参数要放在最后    

   4.7可变参数的使用

Arrays工具类中有一个静态方法:

  •    public static <T>List<T>asList(T...a):返回由指定数组支持的固定大小的列表
  •  返回的集合不能增删操作,可以做修改操作

 

   List接口中有一个静态方法:

  •    public static <E>List<E>of(E...elements):返回包含任意数量元素的不可变列表。
  • 返回的集合不能做增删改操作。    

 

   Set接口中有一个静态方法:

  • public static <E>Set<E> of(E... elements):返回一个包含任一元素的不可变集合。
  • 在给元素的时候,不能给重复的元素
  • 返回的集合不能做增删改操作,没有修改的方法。
目录
相关文章
|
2月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
52 3
|
2月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
60 5
|
3月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
72 4
|
3月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
3月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
62 2
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
3月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
47 0
|
6月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
6月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
4月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
99 5