【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):返回一个包含任一元素的不可变集合。
  • 在给元素的时候,不能给重复的元素
  • 返回的集合不能做增删改操作,没有修改的方法。
目录
相关文章
|
12天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
29天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
44 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
49 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
38 0
|
网络协议 Java API
Java新人必学课程,Java进阶学习全路线(内涵Java超级干货推送及专家社群福利)
自从拉了java社群之后,发现经常有一些新手java开发在吐槽,吐槽java不知道从何学起,感觉路很迷惘。其实小编想说,沉下心,你会发现要走的路并不是很难。为了帮助新人更好的成长,小编特意邀请了最课程的陆敏技老师来给大家进行java基础课程直播分享。
19120 0
|
6天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
45 17
|
17天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者