JAVA Integer类型自加实例详解
JAVA语言中有一些基本数据类型,比如int,long,double...
这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符
Integer类型是一个对象类型,居然也可以支持++运算,那么问题来了
一个Integer对象执行++操作之后还是原来那个对象吗?
测试代码
public class IntegerTest { @Test public void test() { Integer a = 1; System.out.println(System.identityHashCode(a)); a++; System.out.println(System.identityHashCode(a)); } }
输出
105704967
392292416
对象的内存地址不一致,说明Integer对象执行++操作之后是返回一个新的Integer对象
可以通过查看汇编代码分析一下原因
简化代码
public class IntegerTest { public void test() { Integer a = 1; a++; } }
上述代码的字节码
Compiled from "IntegerTest.java" public class com.migoo.common.IntegerTest { public com.migoo.common.IntegerTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public void test(); Code: 0: iconst_1 1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: astore_1 5: aload_1 6: astore_2 7: aload_1 8: invokevirtual #3 // Method java/lang/Integer.intValue:()I 11: iconst_1 12: iadd 13: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 16: dup 17: astore_1 18: astore_3 19: aload_2 20: pop 21: return }
关于Java字节码的介绍可以看一下这篇博客
我们主要关注8、13两行,底层使用了java/lang/Integer.intValue拆箱,然后自加,再通过java/lang/Integer.valueOf装箱,拆箱装箱操作之后变量a 所指向的对象就不是原来的对象了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
详解Java中int和Integer的区别
基本数据类型和引用类型 Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下: 原始类型:boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte
-
Java大数字运算之BigInteger 原创
在 Java 中,有许多数字处理的类,比如 Integer 类.但是Integer 类有一定的局限性,下面我们就来看看比 Integer 类更厉害的一个,BigInteger类. BigInteger类型的数字范围较 Integer 类型的数字范围要大得多.我们都知道 Integer 是 Int 的包装类,int 的最大值为 231-1,如果要计算更大的数字,使用Integer 数据类型就无法实现了,所以 Java 中提供了BigInteger 类来处理更大的数字. BigInteger 支持任
-
Java AtomicInteger类的使用方法详解
首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private static AtomicInteger count = new AtomicIn
-
关于Java中你所不知道的Integer详解
前言 本文主要给大家介绍了关于Java中Integer的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实参形参 前些天看到朋友圈分享了一片文章<Java函数的传参机制--你真的了解吗?> 有些触发,之前也研究过Java的Integer,所以写下本文,希望对你有所帮助. 交换 首先来看一个示例. 请用Java完成swap函数,交换两个整数类型的值. public static void test() throws Exception { Integer a = 1,
-
Mybatis单个参数的if判断报异常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解决方案
我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可以了,如下: 1.常规代码 <update id="update" parameterType="com.cq2022.zago.order.entity.Test" > update t_test_l <set > <if test="trnsctWayId != null"
-
Java中BigDecimal类与int、Integer使用总结
前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 输出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.23299999999999
-
Java中对AtomicInteger和int值在多线程下递增操作的测试
Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下: java.util.concurrent.atomic.AtomicBoolean; java.util.concurrent.atomic.AtomicInteger; java.util.concurrent.atomic.AtomicLong; java.util.concurrent.atomic.AtomicReference; 下面是一个对比 AtomicInteger 与 普通 int 值在多线
-
JAVA Integer类型自加实例详解
JAVA语言中有一些基本数据类型,比如int,long,double... 这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符 Integer类型是一个对象类型,居然也可以支持++运算,那么问题来了 一个Integer对象执行++操作之后还是原来那个对象吗? 测试代码 public class IntegerTest { @Test public void test() { Integer a = 1; System.out.println(System.identityH
-
Java异常类型以及处理实例详解
目录 一.异常的描述 二.异常的体系 三.异常的分类: 四.异常处理的捕捉形式 五.异常处理的原则 六.finally 七.异常的应用 八.异常的注意事项: 总结 一.异常的描述 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止.在Java中即,Java在编译或运行或者运行过程中出现的错误. Java提供了更加优秀的解决办法:异常处理机制. 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处
-
Java中IO流 字节流实例详解
Java中IO流 字节流实例详解 IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络-),即是将数据源读入到程序的通信通道. 输出流:程序向输出流写入数据.将程序中的数据输出到外界(显示器.打印机.文件.网络-)的通信通道. 字节流 1.InputStream.OutputStream InputStream抽象了应用程序读取数据的方式 OutputStream抽象了应用程序写出数据
-
Java 文件上传的实例详解
Java 文件上传的实例详解 java 文件上传 Java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的 1.jspsmartupload 这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不
-
Java CAS底层实现原理实例详解
这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.CAS(compareAndSwap)的概念 CAS,全称Compare And Swap(比较与交换),解决多线程并行情况下使用锁造成性能损耗的一种机制. CAS(V, A, B),V为内存地址.A为预期原值,B为新值.如果内存地址的值与预期原值相匹配,那么将该位置值更新为新值.否则,说明已经被其他线程更新,处理器不做任何操作:无论哪种情
-
Java函数式接口Supplier接口实例详解
这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在 java.util.function 包中被提供. 下面是最简单的Supplier接口及使用示例. Supplier接口概述 // Supplier接口源码 @FunctionalInterface public interface Supplier<T>
-
java操作mongoDB查询的实例详解
java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且
-
java 中自定义OutputFormat的实例详解
java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa
-
Java中的动态和静态编译实例详解
Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上编译成class文件,而javascript则直接在浏览器上加载运行. 2.由第一点可看出,java代码需要编译,而javascript不需要编译. 3.从语言性质来说,java是一种高级编程语言,对变量检查要求严格,javascript只是一个简单的解释性的脚本语言,对变量检查及要求很弱.
-
java 中createStatement()方法的实例详解
java 中createStatement()方法的实例详解 用缺省设置创建时,ResultSet 是一种只能访问一次(one-time-through).只能向前访问(forward-only)和只读的对象.您只能访问数据一次,如果再次需要该 数据,必须重新查询数据库. 然而,并不只有这一种方式.通过设置 Statement 对象上的参数,您可以控制它产生的 ResultSet.例如: ... Class.forName(driverName); db = DriverManager.getC
随机推荐
- 原生js封装添加class,删除class的实例
- php的list()的一步操作给一组变量进行赋值的使用
- Linux 中的通配符详解及实例
- 浅析SQL Server中包含事务的存储过程
- 浅析Spring和MyBatis整合及逆向工程
- VMware虚拟机实用经验总结大全
- jQuery自适应轮播图插件Swiper用法示例
- javascript实现类似java中getClass()得到对象类名的方法
- 利用location.hash实现跨域iframe自适应
- C#图片处理3种高级应用
- c#编写webservice服务引用实例分享
- Android实现屏幕旋转方法总结
- 简单谈谈javascript中this的隐式绑定
- 给easyui的datebox控件添加清空按钮的实现方法
- 详解JavaScript对象序列化
- 基于Java实现的Base64加密、解密原理代码
- 自动关闭的层
- Android把svg图片转为jpg保存到相册图库
- Android编程实现改变控件背景及形态的方法
- C#处理datagridview虚拟模式的方法