关于java中JDK5的打包,拆包以及"=="和equals的问题_lgh1117的博客-程序员宅基地

技术标签: jdk  虚拟机  java  编译器  equals  integer  

我们知道,JDK1.5中,增加了一个新的特性之一,就是自动装包和拆包,是的,正是这个新的特性,使得我们很多程序员在进行原型数据和对象数据类型比较的时候,能够很方便的进行.但是,正是应为这样,我们的问题往往出现在我们难以预料的地方.

   很多时候,我们对于数字,比如123和343的比较,都使用数学符号进行比较,比如使用"=="这个比较,这这是没有任何错误的,可是,这样的比较是没有意思,因为我们都知道谁大谁小,我们的比较往往是一些未知的东西,也就是通过变量来进行比较的,如下:

      Integer a=100;

   Integer b=100;

这样,我们比较两个变量a==b,这肯定是成立,我们的很多程序员会很自然的说出,这个结果是正确的,是的,这是没有任何的疑问.但是,如果我们把结果换成下面的形式

      Integer a=1232;

   Integer b=1232;

如果我们再用"=="进行比较,会得到什么样的结果呢?

  哈哈,我想,现在可能会有三个答案,正确,错误和不知道,

  让我们来分析分析,到底谁的结果是正确的呢?因为上面的是所有结果,我们也就只能从上面选出我们的答案了.

  首先,我们要明白,Integer是什么类型的,毫无疑问,是对象类型,但是,对象是需要使用new操作符来完成的啊,也就是 Integer a = new Integer(1232),这样才是我们的对象声明方式.

   如果是这样,那么我们应该明白,这个Integer a = new Integer(1232)的含义了,它的工作机制是什么,我们也应该明白吧,如果不明白,那么我们的错误就很难找出来了.

   这个实例是有两层意思,一 a只是被声明的应用,没有任何数据,new Integer(1232)就告诉虚拟机,在某个内存地址中,存在了这样一个对象,对象的内容是1232,并且把这个对象放在内存中的某个堆中,a就是得到了这个堆的内存地址应用,而不是对象本身,当我们要使用对象的值的时候,就会通过a这个内存地址找到相应的数据区,然后把拿到这些数据.

    而在java中,"=="比较符和equals比较函数,它们比较的内容是不同的;"=="比较符,如果是对原型,int,long,short,char,boolean,byte,double,float这些的数值比较,是不会出现任何疑问的,但是,对于对象就不一样了,"=="比较符,比较对象的时候,比较的是它的两个内存地址,而不是内存地址里面的值.

     说到这里,我们有些人会问,上面的比较

        Integer a=100;

        Integer b=100;

    a==b 为什么会成立?比较不是内存地址吗?它们是值相同的两个不同对象啊!

   哈哈,这个问题我们就得看看JDK1.5中自动装包和拆包的缘故了.自动装包就是编译器自动的把原型数据转换成对象类型,而java虚拟机根本就不知道这一个过程的变换,java虚拟机只会执行编译器生成的字节码,而编译器把原型编译成的对象到底放在那个位置呢?它们会把数值相同的数据编译成同一个对象存放起来吗?这就是我们解决问题的关键所在.

   java编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中,这下,我们就明白了,为什么使用等号比较两个大于127或者小于-128的Integer类型结果是false了吧?

   所以,从上面的分析中,我们应该明白,在java的比较中,当我们遇到比较两个对象的值是否相等时,我们应该使用equals这个函数,而不是"=="比较符,equals比较的是两个对象里面的值,也就是就是根据内存地址来找到堆中的数据.

 

   下面,我们再把这几个概念说一下

   自动装包:JDK1.5中,java编译器会自动的把原型包装称为对象类型,每一个原型都有自己对应的包装类型.把原型包装成对象类型的过程叫做自动装包.

  自动拆包:就是把对象类型的数据转换成原型的过程.

    "==":这个比较符比较的是两个原型数据

    equals:比较的是两个对象的值,是在对象中使用的,当遇到对象的时候,不需要作为任何考虑,就使用它.

 

 

   很多会问,我们什么时候使用原型,什么时候使用对象类型,这个问题,需要在实际的开发中来阐述,我在一些开发中就遇到这样的问题,在这里,我就不总结了,如果需要知道的,请告诉我或者在以后的日子中,我会陆续贴出来.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lgh1117/article/details/3181954

智能推荐

类名.class与对象.getClass的区别_极客若海的博客-程序员宅基地

直接上代码:1.抽象类package com.chinacreator.yxg.bean;public abstract class PersonInfo { private String name; public int getAge() { return age; } public void setAge(int age) {

mysql导出数据大概得多久_MySQL 导出数据_CPA研习社的博客-程序员宅基地

MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上。使用 SELECT ... INTO OUTFILE 语句导出数据以下实例中我们将数据表 cnblogs_tbl 数据导出到 /tmp/tutorials.txt 文件中:mysql&gt;SELECT*FROMcnblogs_tbl-&gt;INTOOUTFILE'/tmp/tutor...

kmeans中的k的含义_聚类、K-Means、例子、细节_杨军创业观察室的博客-程序员宅基地

聚类#####今天说聚类,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别。分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时候可能什么都不过滤,在日常使用过程中,我人工对于每一封邮件点选“垃圾”或“不是垃圾”,过一段时间,Gmail就体现出一定的智能,能够自动过滤掉一些垃圾邮件了。这是因为在点选...

深度学习--基础篇_吴教授深度学习_IveryThing的博客-程序员宅基地

前一段时间接了一个利用深度学习识别岩石种类的项目。先总结一下自己基础的学习思路,便于忘查。我用的工具:Pycharm2019+TensorFlow2.11.首先是观看吴教授的课(吴恩达),我看的视频中,吴教授用的还是TensorFlow1.x版本,不建议大家学TensorFlow1.x版本,直接学习最新的版本(Pytorch我还没用过)。但是吴教授的课打基础确实很不错,很多深度学习中的专业名词的含义讲的很透彻。视频链接:https://www.bilibili.com/video/BV1FT4y

随便推点

IDEA的使用技巧_idea取消自动换行_有多勉为其难的博客-程序员宅基地

1 打开Settings找到以下位置Navigation Bar Toolbar:导航栏工具栏,下就是我们的导航栏工具栏的按钮。2 选中添加的位置3 点击上方的 “ + ” 号Add Action...搜索你想要添加的工具栏按钮,比如Settings4 点击OK添加完成5 可以添加Settings、Project Structre、git等常用的工具按钮,方便使用.............................................

解决scanner.nextLine( )不执行的问题_谷哥的小弟的博客-程序员宅基地

问题描述:当执行scanner.nextInt()后发现scanner.nextLine()语句未执行;代码如下:

xray批量扫描url_xray批量检测文件里面url_黑仔丶的博客-程序员宅基地

xray批量扫描url**思路:**从txt文本文档中按序导出url,写好系统命令后用python来依次执行命令,并生成报告到xray根目录。示例:代码:#author: 想学点black技术#用法: 在bat.py的同目录下生成xray_url.txt,根据自己的需求更改scan_command即可#time: 2020年12月16日20:27:40#环境: python3#说明: command中的xray路径需要手动修改,报告生成的位置在同一目录下import osimpo

java计算机毕业设计的问卷调查系统设计与实现源码+数据库+系统+lw文档+mybatis+运行部署_问卷调查系统源码_礼礼科技的博客-程序员宅基地

java计算机毕业设计的问卷调查系统设计与实现源码+数据库+系统+lw文档+mybatis+运行部署。springboot疫情期间中小学生作业线上管理系统设计与实现。JSP+sql图书管理系统(源程序+论文+数据库+录像)ssm基于Java的废品回收管理系统的设计与实现。ssm基于Java的幼儿早教系统软件的设计与实现。ssm基于JAVA的OA办公系统的设计与实现。ssn基于SSM宠物店管理系统的设计与实现。ssm基于B_S景区票务管理系统设计与实现。springboot点餐系统的设计与实现。

vue页面跳转并传递参数 保存参数到网址?a=&b= 解决 刷新页面 无法保存接收到的参数情况_吴冬雪~的博客-程序员宅基地

second.vue&lt;!-- 点击el-row 跳转到/artistDetails 页面 --&gt;&lt;el-row v-for="(item,index) in list" :key="index" @click.native="artClick(item)"&gt; &lt;el-col&gt;&lt;/el-col&gt;&lt;/el-row&gt;ar...

SwiftUI Hooks,教你如何在 SwiftUI 中使用 React Hooks_普通网友的博客-程序员宅基地

????????关注后回复“进群”,拉你进程序员交流群????????作者丨知识小集来源丨知识小集(ID:zsxjtip)最近,Github 基友 ra1028 基于 React Ho...

推荐文章

热门文章

相关标签