Java List<Integer>能存字符串对象吗?

简介: Java List<Integer>能存字符串对象吗?

背景

今天在写代码时,想到一个有趣的面试题,List<Integer>能存String对象吗?

粗看好像问了一个Java语法相关的知识点,其实我想考的是你对Java泛型的理解。

回答不能,那么可以说对Java泛型几乎是没有理解,而仅仅回答能,也是远远不够的。

一、怎么存?

首先来讲讲怎么存,话不多说,直接上代码,也不复杂大家都能看懂。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
 * @author Mark
 * @date 2022-11-27 17:37
 */
public class ListGeneric {
    private void genericTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        Method method = integerList.getClass().getDeclaredMethod("add", Object.class);
        method.invoke(integerList, "String");
        System.out.println(integerList);
    }
}

我们通过反射来实现,最终打印输出的内容是[1, String],是不是有点匪夷所思。当然这里需要提一点,直接通过add方法来添加"String"字符串对象,显然是不可行的。

或许回答不能的,这个结论应该从这里来,市面上的idea在编写时也都会报错。

二、为什么能存?

关键点来了,我所期望的是面试者能提出泛型擦除,与Java的泛型只在编译期生效。

简单整个笔试可能出现的题,或许又能加深你对它的印象。

接着问,以下两个方法能否定义在同一个类的成员方法中,

public List<Integer> func(List<Integer> list) {
    return List.of(1);
}
public List<String> func(List<String> list) {
    return List.of("String");
}

显然也是不能的,另外有一点我可能还会问一下,以上代码入参一致的话是不是方法的重载?显然也不是,方法的重载不考虑返回值。

三、泛型存在的意义?

紧接着,又一个关键点来了,既然有擦除那么泛型存在的意义是?

1、泛型避免了代码在运行时才发现问题,例如上章节的例子。

2、如果都是使用Object基类替代,使用时需要强转,泛型减少了ClassCastException发生。

3、减少来自强制类型转换的性能消耗。

小结

每天一个小知识点,轻松带你了解真实的Java面试。

相关文章
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
314 0
|
3月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
382 108
|
5月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
183 0
|
4月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
5月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
349 14
|
4月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
59 0
|
5月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
117 0
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
169 19
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
104 10
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
116 4