Java泛型基本知识附面试题

news2024/11/17 16:39:34

一次平平无奇的面试

为什么要写这篇文档,主要就是在字节二面的时候,面试官提了这么一个问题

面试官:Java中的List<Integer>里有可能存String类型元素吗?

当时的我:应该…不可以吧,好像编译器会报错!

面试官:你可以回去试一下,然后这题就嘎了

在这里插入图片描述
面试结束了以后,手撕了代码,结果发现通过反射的方式去操作是可行的!

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		
		list.getClass().getMethod("add", Object.class).invoke(list, true);
		System.out.println(list.toString()); //打印 [1, JAVA]
	}

这里面试官主要想考察的是Java基础中的泛型,想知道你对泛型了解多少,包括泛型擦除,泛型限制等

深入泛型擦除

为什么要执行泛型擦除,什么是泛型擦除

1.Java虚拟机(JVM)并不了解泛型类型,它只认识普通类型;

2.早期Java并没有泛型的概念,为了兼容早期版本。

所以,泛型擦除是指在编译时将泛型类型参数擦除为其上界或下界类型的过程,实现泛型代码的向后兼容性。

具体来说,当Java编译器遇到泛型类型时,它会将泛型类型擦除为其上界类型。例如,对于一个泛型类List<T>,编译器会将它的擦除类型设置为List<Object>。这样做可以保证泛型类型在编译时的可用性,同时也避免了编译错误。

根据上面的代码,Java编译器的泛型擦除机制,会在编译期的时候,将List<Integer> list 擦除为 List<Object> list,这样做可以减少生成的字节码文件的大小,提高程序的运行效率。

ArrayList源码解析

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
	...
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    
	transient Object[] elementData;

	public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

	@SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }

	public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
	
	...
}

从源码可以看出,在我们初始化ArrayList的时候传入的类型,最终都会擦除成Object

在调用 get(int index) 时,返回数据通过强转,最后变成我们最开始传入的类型返回给调用方

常见泛型面试题

1.泛型的好处是什么?

答:泛型是Java 5中引入的特性,它提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。泛型的好处包括:
将运行时期的问题提前到编译时期解决,避免了强制类型转换。
增加代码的可读性和可维护性。

2.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

答:在Java中,可以使用或等通配符来表示泛型参数。

// 在这个示例中,<T>表示一个泛型参数,可以接受任何类型的参数。return语句返回一个泛型类型T。
public static <T> T min(T a, T b) {  
    if (a < b) {  
        return a;  
    } else {  
        return b;  
    }  
}

3.如何使用泛型类来定义一个栈(Stack)?

// 在这个示例中,我们定义了一个名为Stack的类,并使用<T>来表示一个泛型参数。在类中,我们使用了一个List来保存栈中的元素,
// 并在push、pop、peek和isEmpty方法中分别对栈进行操作。由于使用了泛型类型,这个栈可以存储任何类型的元素。
public class Stack<T> {  
    private List<T> list = new ArrayList<>();  
  
    public void push(T item) {  
        list.add(item);  
    }  
  
    public T pop() {  
        return list.remove(list.size() - 1);  
    }  
  
    public T peek() {  
        return list.get(list.size() - 1);  
    }  
  
    public boolean isEmpty() {  
        return list.isEmpty();  
    }  
}

4.什么是Java泛型的上界和下界?

Java泛型的上界和下界是指在声明泛型类型时,可以设置的上界和下界类型。例如List<? extends Number>表示该列表中只能存储Number类型的元素或者其子类,而List<? super Integer>表示该列表中可以存储Integer类型的元素或者其父类。

5.泛型中的E V T K 是什么?

E、V、T、K分别是Java泛型中常用的标记符,分别表示Element、Value、Type和Key。这些标记符可以用来限定泛型的类型,提高泛型的灵活性和类型安全性。

其中,E表示Element,即集合中的元素类型;V表示Value,即值类型;T表示Type,即类类型;K表示Key,即键类型。这些标记符可以用来限定泛型的类型,提高泛型的灵活性和类型安全性。例如,在Java中,可以使用Map<K, V>来创建一个键值对集合,其中K和V分别表示键和值的类型。

创作不易,期待三连!

在这里插入图片描述

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

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

相关文章

2023口腔护理行业分析:市场需求多元化,细分市场持续多变

随着人们生活水平的提高以及口腔护理意识的提升&#xff0c;消费者对于口腔护理的诉求愈发多样化&#xff0c;对于与此相关的产品&#xff0c;包括牙膏、牙刷、牙齿美白产品、漱口水、牙线等产品的需求也日益提高&#xff0c;在这种情况下&#xff0c;口腔护理相关细分产品的销…

软件研发管理高效的关键:11项自动化功能

1、自动锁定需求缺陷 为了提高用户需求分析质量&#xff0c;尽早发现需求缺陷&#xff0c;CoCode开发云特开发了需求分析工具&#xff0c;使用AI&#xff0c;通过需求测试和一致性检测&#xff0c;能够在几分钟内快速分析用户需求缺陷&#xff0c;如歧义、重复、遗漏、不一致和…

深度学习神经网络学习笔记-多模态方向-09-VQA: Visual Question Answering

摘要 -我们提出了自由形式和开放式视觉问答(VQA)的任务。给定一张图像和一个关于图像的自然语言问题&#xff0c;任务是提供一个准确的自然语言答案。镜像现实场景&#xff0c;比如帮助视障人士&#xff0c;问题和答案都是开放式的。视觉问题有选择地针对图像的不同区域&#…

nodejs+vue飞机机票在线预订票网站

本机票预订系统以vue作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库&#xff0c;同时使用Tomcat用为系统的服务器。本系统主要包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;机票类型管理&#xff0c;机票信息管理&#xff0c;订票信息管理&#x…

STM32F4_DMA直接存储器详解

目录 1. 什么是DMA 2. DMA的主要特性 3. DMA功能 3.1 DMA功能框图 3.2 DMA事务 3.3 通道选择 3.4 仲裁器 3.5 DMA数据流 3.6 源、目标和传输模式 3.6.1 外设到存储器模式 3.6.2 存储器到外设模式 3.6.3 存储器到存储器模式 3.7 指针递增 3.8 DMA内存占用 3.9 存…

<SQL>《SQL命令(含例句)精心整理版(1)》

《SQL命令精心整理》 1 SQL基础2 关键字 select & distinct3 排序检索 - order by & desc & asc4 where 语句5 操作符 -and & or & not & in6 通配符6.1 LIKE % 谓词 下划线 方括号 7 计算、拼接、别名 1 SQL基础 名词概念数据库&#xff08;database…

Mit6.006-problemSet03

3-1 哈希练习&#xff08;Hash Practice&#xff09; (a) 按顺序插入整数keys A[47, 61, 36, 52, 56, 33, 92]到尺寸为7的哈希表中&#xff0c;使用哈希函数 h ( k ) ( 10 k 4 ) m o d 7 h(k)(10k4)mod7 h(k)(10k4)mod7。哈希表的每个插槽&#xff0c;存储一个key&#xff…

【Eslint】vscode 配置 eslint 教程

文章目录 一、初始化配置二、文件配置2.1、.eslintrc.js 文件2.2、.eslintignore 文件2.3、settings.json 文件 一、初始化配置 操作步骤&#xff1a; 选择&#xff1a;上下方向键确定&#xff1a;enter 回车键退出&#xff1a;Ctrl c 安装&#xff1a;npm install -g eslint初…

Java高并发核心编程(JUC)—线程池详细笔记

线程池 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作 线程池作用&#xff1a; 降低资源消耗&#xff0c;减少了创建和销毁线程的次数&#xff0c;每个工作线程都可以被重复利用…

加密与解密 调试篇 动态调试技术

OllyDbg调试器的使用 CPU窗口 我们进行载入的时候 主要返回的是CPU窗口 是最主要的窗口 对应面板的C 反汇编窗口 我们先查看CPU窗口 打开后是有 5个面板 主要查看反汇编窗口 我们可以对这些列进行操作 操作都是进行双击地址&#xff1a; 显示被双击行地址的相对地址 再次双…

23种设计模式之代理模式(Proxy Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的代理模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

扩展磁盘大小

此虚拟机之前硬盘大小为40G&#xff0c;需扩展为500G 1.虚拟机设置中&#xff0c;扩展硬盘大小为500G 2.启动此虚拟机&#xff0c;查看当前磁盘大小 3.查看磁盘情况 可查看到当前磁盘大小总共537G&#xff0c;实际使用37G 4.对磁盘分区 刷新分区 查看磁盘情况&#xff0c;可查…

目标检测数据预处理——根据部件类别按照特定位置拼图,缩小学习空间

首先放效果图&#xff0c;更直观看到本片是要干嘛的&#xff1a; 如图&#xff0c;就是将大图划分为44宫格的&#xff0c;4个部件类的目标框按照固定位置拼图&#xff0c;其中head、body的大图为每个宫格一张图&#xff0c;hand、foot的小图为每个宫格22张图&#xff08;因为h…

LInux相关操作命令

目录 1、Linux用户和用户组管理 用户管理命令 系统管理 top命令 ps命令 kill命令 关机命令 重启命令 为什么学习命令 Linux刚面世是并没有图形界面&#xff0c;所有操作都靠命令完成&#xff0c;如磁盘操作、文件存取、目录操作、进程管理、文件权限等工作中&#xff…

react-naive工作原理

react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中&#xff0c;virtual dom 就像一个中间层&#xff0c;介于开发者描述的视图与实际在页面上渲染的视图之间。为了在浏览器上渲染出可交互的用户界面&#xff0c;开发者必须操作浏览器的Dom&#x…

系统分析师经典易错题,解题思路三

UML2.0包括14种图:分别如下:类图(class diagram),类图描述了一组类、接口、协作和他们之间的关系。在OO系统的建模中,最常见的图就是类图。类图给出了系统的静态设计视图,活动图的类图给出了系统的静态进程视图。对象图(object diagram)对象图描述了一组对象及它们之间…

linux centos 安装JDK、tomcat、nginx教程记录

一、安装jdk 1、查看linux系统的jdk位数&#xff08;64/32位&#xff09; 查看本机位数命令&#xff1a; sudo uname --m 2、进入jdk下载官网 Java Downloads | Oracle 现在默认是最新的jdk20 以为我是之前的项目&#xff0c;使用的是jdk1.8_181版本&#xff0c;所以我需要…

零基础自学网络安全/web安全,看这一篇就够了

作为一个安全从业人员&#xff0c;我自知web安全的概念太过于宽泛&#xff0c;我本人了解的也并不够精深&#xff0c;还需要继续学习。 但看到这个问题之后又想说说自己的看法&#xff0c;所以今天随手写写关于web安全的内容&#xff0c;希望对初次遇到web安全问题的同学提供帮…

Cadence+SPB16.2入门教程(上)

第1章焊盘制作 1.1用Pad Designer制作焊盘 Allegro中制作焊盘的工作叫Pad Designer,所有SMD焊盘、通孔焊盘以及过孔都用该工具来制作。 打开程序->Cadence SPB 16.2->PCB Editer utilities->Pad Designer,弹出焊盘制作的界面,如图1.1所示。 在Units下拉框中选择…

【CloudCompare教程】005:点云滤波处理大全

本文讲述基于cloudcompare软件的点云滤波方法及案例,包括:高斯滤波、低通滤波、双边滤波、统计滤波、CSF地面滤波等等。 文章目录 一、高斯滤波二、低通滤波三、双侧滤波四、统计滤波五、CSF地面滤波滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干…