返回顶部
首页 > 资讯 > 精选 >Java的整型类型中如何实现2+2=5
  • 360
分享到

Java的整型类型中如何实现2+2=5

2023-06-02 22:06:42 360人浏览 泡泡鱼
摘要

Java的整型类型中如何实现2+2=5,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。先看下这段神奇的Java代码:public static void&nb

Java的整型类型中如何实现2+2=5,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

先看下这段神奇的Java代码:

public static void main(String[] args) throws Exception {      doSomethingMagic();      System.out.printf("2 + 2 = %d", 2 + 2);}

Java的整型类型中如何实现2+2=5

执行结果:2 + 2 = 5

Java的整型类型中如何实现2+2=5

那么doSomethingMagic到底做了什么神奇的事情呢?先看代码:

private static void doSomethingMagic() throws Exception {   Class cache = Integer.class.getDeclaredClasses()[0];   Field c = cache.getDeclaredField("cache");   c.setAccessible(true);   Integer[] array = (Integer[]) c.get(cache);   array[132] = array[133];}

所以这个例子其实包含了Java中整型类型Integer的一个知识点。

Java的整型类型中如何实现2+2=5

可能有的朋友对于doSomethingMagic里面的代码有点摸不着头脑,让我们先查看上图第17行 2 + 2反编译出来的代码:

编辑器将2+ 2的值先计算出来,等于4。最后System.out.println打印出来的值,实际上是Integer.valueOf(4)的返回值。

Java的整型类型中如何实现2+2=5

那么我们就查看jdk里Integer.valueOf的实现:

Java的整型类型中如何实现2+2=5

上面的实现代码,从830行到832行,逻辑非常清楚:如果valueOf的参数i在IntegerCache.low和IntegerCache.high之间,即[-128, 127]的闭区间,则直接从IntegerCache这个缓存区域里返回。只有当输入参数i不在[-128,127]区间内,才执行代码832,基于输入参数i创建一个新的Integer实例。

带着这个理念,我们再看doSomethingMagic就清楚多了。这个方法通过Java反射将上图IntegerCache的成员cache设置成可访问:setAccessible(true), 然后将IntegerCache的第132个元素的值用第133个元素的值覆盖。

Java的整型类型中如何实现2+2=5

我们从Eclipse调试器里发现,Integer cache里第132个元素的值为4,第133个元素的值为5。本来Integer.valueOf方法,对于输入4,从Integer cache里返回第132个元素的值,即4。现在这个元素的值被第133个元素即5覆盖了,所以最后得到了 2 + 2 = 5。

用一句话概括这个场景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因为4在Integer cache里对应的记录已经被我们的代码显式替换成了5)。

Java的整型类型中如何实现2+2=5

Java的整型类型中如何实现2+2=5

看完上述内容,你们掌握Java的整型类型中如何实现2+2=5的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java的整型类型中如何实现2+2=5

本文链接: https://lsjlt.com/news/231488.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java的整型类型中如何实现2+2=5
    Java的整型类型中如何实现2+2=5,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。先看下这段神奇的Java代码:public static void&nb...
    99+
    2023-06-02
  • 如何用JavaScript实现2+2=5?
    我大学毕业找工作时,经常做一些稀奇古怪的面试题。这不,给大家分享一道整蛊的面试题,它其实不能算一道正式的面试题,大家可以用它来捉弄你们那些程序员朋友。题目:如何用JavaScript实现2+2=5?答案如下。新建一个txt文件,然后把后缀名...
    99+
    2023-06-03
  • SQL Server time(2)类型存储为int后如何转换
    time(2)类型将毫秒保留两位,应用程序将time(2)类型转换为int存储到SQL Server后,以下两种方法均可将int转换为time(2):--方法1 DECLARE @T i...
    99+
    2024-04-02
  • PHP中如何将Decimal类型转为整数类型
    今天小编给大家分享一下PHP中如何将Decimal类型转为整数类型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Deci...
    99+
    2023-07-05
  • java如何实现类型转换与强制类型转换
    这篇文章主要介绍了java如何实现类型转换与强制类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java类型转换与强制类型转换如果你以前有编程经验,那么你已经知道把一种...
    99+
    2023-06-03
  • java中byte[]类型如何转换为String类型
    在 Java 中将 byte[] 类型转换为 String 类型,可以使用 String 的构造函数或者静态方法。 使用 String 构造函数 byte[] byteArray = {97, 98, 99}; String str = n...
    99+
    2023-09-08
    java servlet 开发语言
  • Android判断用户的网络类型实例讲解(2/3/4G、wifi)
    很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。 一加手机一代,移动4G 网络,得到的...
    99+
    2022-06-06
    4g 网络类型 Android
  • Java中如何判断类型
    这篇文章给大家介绍Java中如何判断类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 instanceofinstanceof是Java的一个运算符,用来判断一个对象是否为一个类的实例 。用法:boolea...
    99+
    2023-06-16
  • Java中如何获取泛型类型信息
    这篇文章主要讲解了“Java中如何获取泛型类型信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中如何获取泛型类型信息”吧!根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。声...
    99+
    2023-07-05
  • 如何查看redis的5种数据类型
    小编给大家分享一下如何查看redis的5种数据类型,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、redis的5种数据类型: string 字符串(可以为整形、浮点型和字符串,统称为元...
    99+
    2024-04-02
  • 教程:PHP中整数类型如何转换为字符串类型
    在PHP编程中,经常会遇到整数类型需要转换为字符串类型的情况。这种转换可以通过多种方法来实现,包括使用强制类型转换或者调用特定的函数。接下来将介绍几种常用的方法来实现整数类型向字符串类...
    99+
    2024-04-02
  • PHP编程中如何实现2的幂运算?
    在PHP编程中,实现2的幂运算是一项常见的需求。通常情况下,可以通过使用内置函数pow()或者自定义函数来实现2的幂运算。下面将分别介绍这两种方法的具体实现。 使用内置函数pow() ...
    99+
    2024-04-02
  • C#如何实现泛型类
    这篇文章主要为大家展示了“C#如何实现泛型类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何实现泛型类”这篇文章吧。使用泛型集合有些人问我"面向对象编程(OOP)的承诺在哪里?&...
    99+
    2023-06-17
  • Java中如何区分引用类型和原始类型
    今天就跟大家聊聊有关Java中如何区分引用类型和原始类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java中区分引用类型和原始类型 (转)[@more@]下表列出了原始类型以及它...
    99+
    2023-06-03
  • java泛型如何实现
    在Java中,泛型是通过使用尖括号来实现的。在类或方法的声明中,可以使用泛型来指定一个或多个类型参数。 在类的声明中,可以在类名后面...
    99+
    2023-10-27
    java
  • HTML5中如何实现新表单类型
    小编给大家分享一下HTML5中如何实现新表单类型,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!demo.html:<!DO...
    99+
    2024-04-02
  • Bash中的Java数据类型:如何实现重定向操作?
    Bash是一种常用的Unix shell,它提供了很多基础的命令和工具,可以用于执行各种系统管理和编程任务。Java是一种广泛使用的编程语言,也被用于开发各种各样的应用程序。在Bash中,我们可以通过重定向操作将Java程序输出的数据重定...
    99+
    2023-11-11
    数据类型 重定向 bash
  • java中如何查看数据的类型
    在Java中,可以通过使用getClass()方法或instanceof关键字来查看数据的类型。 使用getClass()方法: ...
    99+
    2024-03-04
    java
  • MySQL如何实现类型转换
    这篇文章主要介绍了MySQL如何实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类型转换命令: CAST(expr AS type...
    99+
    2024-04-02
  • javascript如何实现类型转换
    这篇文章给大家分享的是有关javascript如何实现类型转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法:1、使用“+”运算符自动进行转换。2、使用JS内置的函数进行转换,例toString()和Stri...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作