皮皮网
皮皮网
源码鉴赏

【aspnet 仓库管理源码】【源码模板管理系统】【大盘下降楔形源码】自动装箱源码_自动装箱源码怎么设置

时间:2024-11-30 11:39:03 分类:知识 编辑:紫金指标源码公式
1.【优雅的自动装箱自动装箱避坑】不要轻易使用==比较两个Integer的值
2.public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

自动装箱源码_自动装箱源码怎么设置

【优雅的避坑】不要轻易使用==比较两个Integer的值

       直接进入主题,来看一段代码,源码源码让我们探索Integer比较的设置奥秘:

       许多人可能会理所当然地认为这段代码会打印出 j = ,但背后的自动装箱自动装箱aspnet 仓库管理源码原理却值得深入探讨。i作为Integer对象,源码源码而j为基本类型int,设置源码模板管理系统它们如何协同工作呢?这涉及到Java 5引入的自动装箱自动装箱自动装箱和拆箱机制。借助IDEA的源码源码jclasslib Bytecode viewer插件,我们可以看到程序运行的设置底层指令:

       这段程序的字节码指令揭示了自动装箱和拆箱的过程。第3行调用Integer的自动装箱自动装箱valueOf方法进行自动装箱,第8行则调用intValue方法进行自动拆箱,源码源码将Integer对象转换为int。设置

       进一步研究valueOf和intValue的自动装箱自动装箱大盘下降楔形源码源码,我们发现Integer类中有一个IntegerCache机制,源码源码它在虚拟机初始化时预加载了(-,设置]范围内的整数。这解释了为什么i1 == i2为true,线上种树软件 源码而i3 == i4为false:在缓存范围内,而超出了。

       为了避免这类陷阱,小鸭出水指标源码正确的比较两个Integer值的方法是使用equals()函数,而不是简单的==。equals会比较两个对象的整数值,不受类型影响。

       阿里Java开发手册推荐的策略是,当比较整型包装类对象的值时,始终使用equals()方法,以确保准确无误的比较。

public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

       é—®é¢˜1,2其实可以一起讲,就是:你没完全理解==,equals和自动装箱(auto boxing)。仔细看你的comparator的实现return i<j?-1:(i==j?0:1);这句话,注意,你的参数是Integer类型,不是基本类型int,你对类的对象做==操作,是比较它们是否是同一个引用,而不是他们的值是否相等。所以,你用这个比较器做二叉搜索,结果肯定是不可预知的。当<判断失败的时候,后面的==基本不可能是true,这也是为什么if(integers.get(1)==new Integer(1)){ System.out.println("<3>");}这句话不能打印出<3>来。你后面那个实现是正确的,因为类的对象没有<操作和>操作,所以编译器会把Integer对象自动转成int再执行比较。

       é—®é¢˜3:api写的很清楚,当找不到的时候,会返回【-(插入值)-1】,在这个程序里,因为你的比较器写的不对,所以搜索失败,并且它认为插入值是1,这没有问题啊。其实,因为上面说的问题,他返回任何奇奇怪怪的数都有可能。

       å¦‚果你想对两个Integer类的对象比较值,你可以调用i.eqauls(j);或者i.intValue()==j.intValue();intValue方法返回的是Integer对象包装的基本类型的int值

       å¦å¤–,补充一点,不知道是你描述的不好,还是我理解的不对。你说的“根据API文档解释, Comparator只是在search之前对list进行排序。”不对,binarysearch不会排序,而是api要求你在调用binarySearch之前,必须保证传进去的list是已排序了的,你可以调用Collections.sort来实现,也可以自己写排序算法

       =========================================================

       comparator的作用就是比较器啊,告诉排序方法怎样比较两个值谁大谁小或相等,对于Integer,当然比较规则很直观,但是对别的类呢,比如你有一个一个Student类,你希望根据学号来排序,查找,你就需要定义自己的Comparator,当然你也可以让你的类实现Comparable接口,这样你就可以直接调用binarySearch的另外一个不需要比较器的版本

       =========================================================

       æœ‰ç‚¹ä¸æ˜Žç™½ï¼Œä½ æ–°è¡¥å……的问题是针对我哪句话讲的?你贴的API是没错啦,但理解不对。binarySearch不会排序,排序的是sort,binarySearch实现中不会调用sort,这点你自己看源代码就知道了,事实上api表达的也是这个意思(注意,原话是“在进行此调用之前”,意思是用户自己调用sort再调用binarysearch)。你知道pre-condition说法吗?列表已排序状态就是binarySearch方法成功的pre-condition(前置条件),你可以传一个乱序的list进去,没问题,编译器不会报错,但是你得不到自己想要的结果,这个你自己试就知道了。

       =========================================================

       æ±—。。你的意思难道不还是search会调用sort么?否则,如果你承认search不调用sort,那为什么还怀疑comparator会否参与搜索过程?如果search既不排序,又不使用comparator,那这个参数不就没有用了吗?

       æ‰€ä»¥ï¼Œsearch需要comparator,只用来搜索,和排序毫无关系。(你应该知道二叉搜索是怎么执行的吧,那就很清楚为什么需要一个comparator了)

本文地址:http://0553.net.cn/news/52b614993798.html

copyright © 2016 powered by 皮皮网   sitemap