关于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

智能推荐

Linux定时任务没有执行的总结_weixin_33806300的博客-程序员宅基地

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Python 3秒自动帮你完成文件整理!_途途途途的博客-程序员宅基地_python自动整理文件

当我们遇到含有多种类型的文件时,会感觉非常的法索复杂,整理需要花费很多时间,也没有一个好的头绪。这也是我在日常办公之中遇到的比较常见的一个问题。所以今天我们就利用Python来实现自动整理文件。首先我们找来6个三种类型的文件。1. 在Python中,内置了os及其os.path模块用于对文件或者目录进行操作。所以我们第一步就要导入os模块。importos2. 我们将需要整理的文件类型放入到一个列表里面。#指定需要整理的文件类型file_types=['tx...

windows控制台调试java程序的命令_hurricane_li的博客-程序员宅基地

oracle提供的java命令行工具的使用:https://docs.oracle.com/javase/8/docs/technotes/tools/#troubleshoot当前运行的Java进程列表:jps;jps:查看当前java程序运行的pid与传入的参数(虚拟机参数与程序参数)等。    jps -lmv    jps -l    jps -m    jps -vjstat:查看当前j...

一款真正可以操作的数据中心可视化管理软件_NWVDI耐威迪的博客-程序员宅基地_nwvdi

数据如今已成为当今全球数字经济的命脉,而数据中心正是这种数据涌入的支柱。随着我们数字世界中数据的扩散以惊人的速度加速,预计到2025年每年将产生超过175ZB的数据。世界已经发生了重大变化,我们开展业务的方式已经发生了变化,这种变化将继续加速。所有行业的工业组织都在生产和使用大量数据,因此需要数据中心来运行其业务,新冠疫情为数字化转型铺平了道路,数字能力将越来越成为经济弹性的晴雨表,能够在新冠疫情危机之后蓬勃发展的行业是那些能够完全数字化的行业。为顺应大数据时代的潮流,必须进行数据中心运维管理的深度优化,

Opencv学习笔记-----求取两条直线的交点坐标_看图算命的博客-程序员宅基地_opencv求交点坐标

求取二直线交点(基于OpenCv)理论补充:两直线是否有交点(或线段齐延长线是否相交)是一个Line-line intersection(Wikipedia)问题在一个2维平面中有两直线(点到点、(点到点,这两条直线的交点用行列式表示如下:行列式可变形写作:该交点是由4个点、两两一组确定的线段所在位置的直线的交点根据贝塞尔参数可以将两直线定义为:其中和均是实...

线程池和Thread_weixin_30478923的博客-程序员宅基地

1、线程池创建线程需要时间。如果有不同的短任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求。这个线程数最好在需要更多线程时增加,在需要释放资源时减少。不需要自己创建这样一个列表。该列表有ThreadPool类托管。这个类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。在四核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指...

随便推点

什么是函数_mashirooo~的博客-程序员宅基地_什么是函数

1、函数是什么维基百科对函数的定义:子程序。在计算机科学中,子程序,是一个大型程序中的某部分代码,由一个或者多个语句块组成。他负责完成某项特定的任务,而且较于其他代码,具备相 对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。2、c语言中函数的分类2-1.库函数为了支持可移植性和提高程序的效率,C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。学习库函数网站:www.cplusplus.comhttp://

Android v4包使用NotificationCompat.Builder 遇到undefined的问题_yong318585的博客-程序员宅基地

NotificationCompat.Builder mBuilder.setProgress                                                        . mBuilder.build()均显示未定义,然后到官网找一下,确实存在这个函数的,最后发现是因为我的项目引用了别的项目的v4包。最后,把别的项目的包跟自己项目下的包都重新导入同一个

如何对map进行排序_顽石九变的博客-程序员宅基地_map排序

Map介绍常用的Map有HashMap,TreeMap,LinkedHashMapHashMap:最常用的Map,根据key的HashCode值来存储数据,根据key可以直接获取它的Value,具有很快的访问速度。HashMap最多只允许一条记录的key值为null(多条会覆盖);允许多条记录的Value为null。非线程安全TreeMap: 根据key排序,默认是按升序排序,也可以指定排序...

Mysql数据库:保留两位小数--convert()函数_good_good_xiu的博客-程序员宅基地_convert保留两位小数

问题场景:在mysql数据库中,存在乘除运算或浮点数数据,取出时需要过滤小数点后的数据,保留两位小数,同时四舍五入。convert(expr,type)函数expr:代表传入的数据,如字符串,数字。type:代表转换后的类型例子:在不指定小数点的位数情况下,decimal类型只保留整数对比:数字转字符:补充:使用cast(expr as type)也可以实现保留小数点后几位或取整操作。...

linux命令行安装qq,在Linux上使用mojoqq来实现命令行QQ_阿卡好方法的博客-程序员宅基地

原标题:在Linux上使用mojoqq来实现命令行QQmojo &amp; ircmojoqq项目主页:https://github.com/sjdy521/Mojo-Webqq具体步骤同样可以参考官方文档第一步:安装perldebian:sudo apt-get install perlcentos:yum install perl 第二步:安装包管理器cpanm以方便安装mojoqq # cp...

常见浏览器兼容性问题与解决方案_孟玉磊的博客-程序员宅基地

所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。在学习浏览器兼容性之前,我想把前端开发人员划分为两类:第一类是精确按照设计图开发的前端开发人员,可以

推荐文章

热门文章

相关标签