Integer比较大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Integer比较大小相关的知识,希望对你有一定的参考价值。

参考技术A         基本数据类类型存的是数值本身

      引用类型变量在内存放的是数据的引用

基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的内存地址

    在一些特殊的类中,如Integer在使用==比较的时候往往非常容易出错,下面通过几个例子来探索一下具体的原理:

我们知道Integer是int的包装类型,在jdk1.5以上可以实现自动转换,不需要手动强转,但Integer它是对象类型,如果用==比较的是内存地址。就像以上奇怪的事情,a=123,b=123,可以返回true,但是a = 12345,b=12345,返回的却是false,这就是jdk的东西,当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。Integer a = 123,就相当于Integer a = Integer.valueOf(123)。

思考:那么Integer.valueOf()返回的Integer是不是是重新new Integer(num);来创建的呢?如果是这样的话,那么== 比较返回都是false,因为他们引用的堆地址不一样。

 我们看下Integer的源码:

在IntegerCache中cache数组初始化如下,存入了-128 - 127的值

从上面我们可以知道给Integer 赋予的int数值在-128 - 127的时候,直接从cache中获取,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,不可能一样的。所以,当Integer 不在-128-127范围内的时候,Integer a = new Integer(12345)。

一道来自网上的习题:

分析:

        总的一句话,Integer比较大小,看赋予的值是否在-128到127之间,如果不在这个区间则会new Integer(num),变成一个新的对象,==比较的时候内存地址就不一样了,返回false,反之为true。

delphi字符串分割和比大小

str:='01,02,23,55,33,66,88,99,22';
大于33的数找出来...

使用Tstringlist的分隔符来切割字符串
var
str:string;
i:integer;
Slist:Tstringlist;
begin
str:='01,02,23,55,33,66,88,99,22';
Slist:=Tstringlist.Create;
slist.Delimiter:=','; //设置分隔符
slist.DelimitedText:=str; //设置待分割的字符串
for i:=0 to slist.Count-1 do //列举所有值
begin
if Strtoint(Slist[i])>33 then
showmessage('这个数字'+slist[i]+'满足要求');
end;
end;
参考技术A 1. 如果数据位固定(都是2位,且总长度一定),那就用Midstr函数找出来,然后和33比较。
2. 如果数据位长度不固定,只要有逗号分隔符,需要用正则表达式来识别,逐一匹配然后和33比较。
表达式: (\d+)

以上是关于Integer比较大小的主要内容,如果未能解决你的问题,请参考以下文章

Integer对象大小比较问题

java中double与Integer直接比较大小是不是可以?

关于java Integer大小比较的问题

Java中Integer和int比较大小出现的错误

delphi日期时间比较大小

java中两个字符串如何比较大小?