Java泛型基本知识附面试题

一次平平无奇的面试

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

面试官: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分别表示键和值的类型。

创作不易,期待三连!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

前言 在上一篇文章中&#xff0c;我们已经实现了游戏的所有界面和逻辑代码&#xff0c;并且在 Android 上已经可以正常运行。 这篇文章我们将讲解如何将其从使用 jetpack compose 修改为使用 compose-jb 从而实现跨平台。 老规矩&#xff0c;先看效果图&#xff1a; 可以看到…

BurpSuite—-Target模块(目标模块)

前言 本文主要介绍BurpSuite—-Target模块(目标模块)的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt Target功能 目标工具包含了SiteMap&#xff0c;用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工…

「车型分析」控制系统典型应用车型 —— 辊筒AGV

辊筒AGV (Roller conveyor ) 是一种常见的AGV机器人类型&#xff0c;它利用辊筒和轮子在巷道中实现货物的搬运和运输&#xff0c;可实现托盘物品的卸载和运输等功能, 具有更高的灵活性、适应性和效率。本文将基于这款市场上常见的AGV进行一次简单的介绍。 1 车型介绍: 辊筒AGV…

Java基础学习(18)反射、动态代理

Java基础学习 一、反射1.1 什么是反射1.2 获取class对象 二、综合练习2.1 保存信息2.2 文件的动态创建 三、动态代理3.1 什么是动态代理3.2 创建代理 一、反射 1.1 什么是反射 反射允许对封装类的字段&#xff0c;方法和构造函数的信息进行编程访问 个人理解&#xff1a; 就是…

Mysql常见的索引模型

目录 有序数组哈希表二叉搜索树B-TreeBTree 有序数组 我们指定一个列为索引&#xff0c;然后按照这个列的值排序&#xff0c;以有序数据存放入数据表中&#xff0c;如下所示 这样&#xff0c;我们在查找数据的时候&#xff0c;就可以通过id这个列&#xff0c;在数据表中进行二…

坚持刷题2个月,终于......

最近一个读者和我反馈&#xff0c;他坚持刷题2个月&#xff0c;终于去了他梦寐以求的大厂&#xff0c;薪资涨幅非常可观&#xff0c;期间面字节跳动还遇到了原题…并表示目前国内的大厂和一些独角兽&#xff0c;已经越来越效仿硅谷公司的做法&#xff0c;通过面试给定题&#x…

zookeeper的安装使用

zookeeper的安装使用 一、下载安装 https://zookeeper.apache.org/ 点击 download 以我自己的安装为例,linux,3.8.0 准备3台linux服务器&#xff1a;192.168.10.128、192.168.10.129、192.168.10.130 1.上传解压 把apache-zookeeper-3.8.0-bin.tar.gz 上传到 /usr/local/zo…

耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道····

一提及外包测试&#xff0c;大部分人的第一印象就是&#xff1a;工作强度大&#xff0c;技术含量低&#xff0c;没有归属感&#xff01; 本人毕业于某普通二本院校非计算机专业&#xff0c;跨专业入行测试&#xff0c;至今有近 5年工作经验。 第一份测试工作是在华为做了两年外…

Github Copilot 的补强工具Github Copilot Labs的常用功能介绍

一、什么是Github Copilot Labs Github Copilot Labs是由GitHub推出的一款基于人工智能技术的代码协作工具&#xff0c;旨在协助开发者更加快速、高效地编写代码。该工具使用了机器学习技术&#xff0c;通过学习大量的开源代码和编写实践&#xff0c;提供了对于代码变量、函数…

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析&#xff0c;但是都是针对机器人的手&#xff08;夹爪&#xff09;眼睛&#xff08;相机&#xff09;进行标定。例如&#xff1a; 标定学习笔记&#xff08;四&#xff09;-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…

四、数据仓库详细介绍(规范)

大家好&#xff0c;这是数据仓库系列的第三个话题&#xff0c;排序在架构之后、建模之前。为什么会提的这么靠前呢&#xff1f; 因为规范约束的是数仓建设的全流程&#xff0c;以及后续的迭代和运维。事实上&#xff0c;数仓规范文档&#xff0c;应该随着架构设计文档&#xf…

Java 与排序算法(5):归并排序

一、归并排序 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组&#xff0c;然后对这两个子数组分别进行归并排序&#xff0c;最后将两个排好序的子数组合并成一个有序的数组。 具体实现过程如下&#xf…

要做存储业务,我解析了一个项目的源码

最近在做存储相关的业务&#xff0c;更具体的来说是存储相关的研发&#xff0c;于是就上网查了一下相关的资料&#xff0c;思虑再三打算从最简单的 Json 数据交换格式开始研究。 JSON是独立于编程语言的数据交换格式&#xff0c;几乎所有与网络开发相关的语言都有JSON函数库&am…

基于Java+SpringMvc+vue+element实现高效学生社团平台管理

基于JavaSpringMvcvueelement实现高效学生社团平台管理 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

系列文章目录 (3条消息) oracle数据库简介 文章目录 系列文章目录 前言 一、用户的创建 1.1、创建命令 1.2、给予scott用户权限 1.3、以scott用户进行连接登录 二、表和表的设计原则 2.1、表的概念 2.1.1、表是从属于用户的 2.1.2、表是逻辑表(概念表)&#xff0c;不…

gpt.4.0-gpt 国内版

gpt 使用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种预训练的语言模型&#xff0c;可用于多种自然语言处理任务&#xff0c;如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议&#xff1a; 确定任务和数据集&#xff1a;首先&…

Hibernate 快速入门

Hibernate 快速入门 〇、前言一、搭建 Hibernate 项目步骤1:新建 Java 项目附录1:新建Java项目中的相关文件信息步骤2:添加 Hibernate 框架支持附录2:添加Hibernate框架支持后,Java项目中的相关文件信息步骤3:其他关键配置1、添加数据库驱动包(本文以MySQL为例)2、配置…

C++11 列表初始化initializer_list

引子 C11&#xff0c;是继C98后的一次有力更新&#xff0c;引进了很多好用的语法&#xff0c;STL也添加了几个新容器&#xff0c;也解决了很多的问题。本篇博客就学习一下C11列表初始化的新语法和 initializer_list 文章目录 引子一. 列表初始化二. initializer_list结束语 一…

计算机底层知识

汇编语言&#xff08;机器语言&#xff09;的执行过程 汇编语言的本质&#xff1a;机器语言的助记符 其实他就是机器语言 计算机通电->CPU读取内存中程序&#xff08;电信号输入&#xff09; ->时钟发生器不断震荡通电 ->推动CPU内部一步一步执行&#xff08;执行多…

安卓开发 | 将Vue项目打包为app

知识目录 一、写在前面✨二、Hbuilder X准备&#x1f495;2.1 Hbuilder X简介2.2 下载 三、打包&#x1f495;3.1 获取dist目录3.2 新建5app3.3 替换文件3.4 编写manifast.json文件3.5 app云打包 四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xf…