面试必备:每天都看见的instanceof,却不知道怎么描述
yuyutoo 2024-10-12 01:47 2 浏览 0 评论
instanceof ?
严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,基本用法为:
boolean result = obj instanceof Class
其中 obj 为一个对象,Class 表示一个类或者一个接口;当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
01.obj 必须为引用类型,不能是基本类型
int i = 0;
Integer j = 0;
System.out.println(i instanceof Integer);
System.out.println(i instanceof Object);
System.out.println(j instanceof Integer);
System.out.println(j instanceof Object);
其中,前两个是编译不通过的,而后两个可以;
这是为什么呢,补充一下int和Integer的关系
1、Integer是int的包装类,int是基本数据类型之一
2、Integer变量必须实例化以后才可以使用,而int变量不需要实例化
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而int是直接存储数据值
4、Integer的默认值是null,int的默认值是0
02.obj 为 null时,返回false
关于 null 类型的描述在官方文档:https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1 有一些介绍。
Java分为两种数据类型:
一种是基本数据类型,有八个分别是 byte short int long float double char boolean;
一种是引用类型,包括类,接口,数组等等;
而Java中还有一种特殊的 null 类型,该类型没有名字,所以不可能声明为 null 类型的变量或者转换为 null 类型,null 引用是 null 类型表达式唯一可能的值,null 引用也可以转换为任意引用类型。我们不需要对 null 类型有多深刻的了解,我们只需要知道 null 是可以成为任意引用类型的特殊符号。
03.obj 为 class 接口的实现类,返回true
这个比较简单,我们知道ArrayList就是实现List接口
List list = new ArrayList();
System.out.println(list instanceof ArrayList);
显而易见,结果时true;
04.obj 为 class 类的直接或间接子类,返回true
还是上方的ArrayList,它继承自AbstractList类;
ArrayList list2 = new ArrayList();
System.out.println(list2 instanceof AbstractList);
返回true;
05.obj 为 class 类的实例对象,返回true
Integer integer = new Integer(1);
System.out.println(integer instanceof Integer);
这个可以理解为对象,或者引用
面试提醒
面试官一般会让写instanceof实现原理。
首先,我们参考Java语言规范对 instanceof 运符:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.20.2
At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.
就是说,如果有表达式 obj instanceof T ,那么如果 obj 不为 null 并且 (T) obj 不抛ClassCastException 异常则该表达式值为 true ,否则值为 false 。
所以可以简单这么写:
if (obj == null)
{ result = false;}
else {
try {
T temp = (T) obj;
result = true; }
catch (ClassCastException e)
{
result = false; }
}
如果更细化一点,可以参考Java8的实现策略
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.instanceof
1、obj如果为null,则返回false;否则设S为obj的类型对象,剩下的问题就是检查S是否为T的子类型;
2、如果S == T,则返回true;
3、接下来分为3种情况,之所以要分情况是因为instanceof要做的是“子类型检查”,而Java语言的类型系统里数组类型、接口类型与普通类类型三者的子类型规定都不一样,必须分开来讨论。
①S是数组类型:如果 T 是一个类类型,那么T必须是Object;如果 T 是接口类型,那么 T 必须是由数组实现的接口之一;
②接口类型:对接口类型的 instanceof 就直接遍历S里记录的它所实现的接口,看有没有跟T一致的;
③类类型:对类类型的 instanceof 则是遍历S的super链(继承链)一直到Object,看有没有跟T一致的。遍历类的super链意味着这个算法的性能会受类的继承深度的影响。
不过这个问题涉及JVM实现,涉及编译器,还涉及一点点数据结构设计,可以很复杂的回答,我们之后再讨论,以上回答适合3年以下程序员。
相关推荐
- Google Chrome 100 Beta发布 用户代理字符串作用开始逐渐降低
-
GoogleChrome和MozillaFirefox都在迅速接近100版本,这有可能破坏一些错误识别浏览器版本的网站(可能导致访问不正常,这有点类似于众所周知的千年虫)。两种浏览器都在研究可能的...
- 如何在Chrome,Edge,Safari和Firefox中更改用户代理
-
无论您是SEO,营销人员还是Web开发人员,通常都可能需要更改浏览器的用户代理以测试其他内容。例如,您正在运行特定于MAC-OS的活动。要确定您的广告系列是否正常运行并且未针对Linux用户,更改浏览...
- Mozilla正在测试新的浏览器UserAgent
-
Mozilla最近发布了一个实验项目来测试3位数的UserAgent版本“Firefox/100.0”会不会让一些网站停止正常工作。浏览器UserAgent是一串字符串,里面包含了浏览器的软件信息,版...
- 爬虫与User-Agent
-
什么是User-Agent呢?User-Agent是一个特殊字符串头,被广泛用来标示浏览器客户端的信息,使得服务器能识别客户机使用的操作系统和版本,CPU类型,浏览器及版本,浏览器的渲染引擎,浏览器...
- 让你的浏览器充满魔性——User Agent Switche
-
对于前端人员,闲暇时就会研究各种插件,今天我就分享UserAgentSwitcher在Firefox和Chrome的使用情况。一、Firefox浏览器UserAgentSwitcher作为火...
- 亚马逊账号运营安全-浏览器指纹识别之User-Agent开篇
-
UA包含了一个约定的特征字符串。主要是面向受访问网络表明自己的操作系统,软件开发商,版本,应用类型等信息。这是一种主动暴露信息的方式。我们来看关于UA的简单语法定义:User-Agent:<p...
- 【每日学习】Python爬虫之伪装浏览器User-Agent
-
【主题】Python爬虫之伪装浏览器原理【分析】1.创建自定义请求对象的目的,对抗网站的反爬虫机制2.反爬虫机制1:判断用户是否是浏览器访问(User-Agent)3.对抗措施1:伪装浏览器进行访问【...
- 亚马逊账号运营安全-浏览器指纹识别之User-Agent二篇
-
大家好,上一篇亚马逊账号运营安全-浏览器指纹识别之User-Agent开篇为大家阐述了原理。下面是作者为大家整理的其他几个主流浏览器的UA配置。一下都是Windows1064X系统下整理。Chrom...
- 常见的爬虫UserAgent
-
通过前面的文章我们知道,UserAgent(用户代理)是HTTP请求的一部分,用于告诉服务器发起请求的客户端类型和属性等信息。同时,也了解了常见的UserAgent。...
- HTTP请求头之User-Agent
-
什么是User-AgentUser-Agent中文名为用户代理,简称UA,...
- 你想不到的浏览器流氓史!那些奇怪的User-Agent,是这么来的...
-
平时我们用chrome浏览器做开发测试。Chrome的Useragent字段怎么这么奇怪?...
- 谷歌宣布 Chrome 将逐步停止支持 User Agent
-
谷歌近日宣布将放弃对Chrome浏览器中用户代理字符串(User-AgentString)的支持。取而代之的是,Chrome将提供一个名为“客户端提示(ClientHints)”的新API...
- 数据采集-用户代理(useragent)
-
UserAgent分类:PC端的UserAgent。移动端UserAgent。使用UserAgent的必要性:在写python网络爬虫程序的时候,经常需要修改UserAgent,有很多原因,罗列几个如...
- 如何获取当前浏览器的useragent
-
有时候,我们需要得到浏览器的useragent,从而再进行后面的一系列判断,返回不同的值。网上有说,在浏览器地址栏输入:javascript:alert(navigator.userAgent)这种方...
- User Agent 解析:它是什么以及如何修改
-
什么是UserAgent?UserAgent,简称UA,是一个使服务器能够识别用户使用的浏览器类型、版本以及运行浏览器的操作系统等信息的字符串。它作为浏览器请求头部信息的一部分发送给服务器,以便服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)