java中Integer,String判断相等与integer的比较大小
package sfk.bbs.test.springjsbctempletTest; import static org.junit.Assert.*; import org.junit.Test; public class testBase
{ @Test
public void test()
{ Integer tt2 = -129;
Integer tt = new Integer(-129);//等价于Integer tt2 = -129;,因为不在常量池[-128,127]范围内所以Integer tt2 = -129;相当于new了一个新的integer对象
System.out.println(tt == tt2);//这里比较的是两个地址,因为是new的integer对象,所以有新的内存地址.所以他们两个不相等.==在基本类型比较时比较的是值,在包装类比较是比较的是内存地址
System.out.println(tt.equals(tt2));//equals方法被重写了,所以比较的是两个对象自定拆箱以后成为int之后比较的,两者的int值是相等的.所以返回true
System.out.println(tt > tt2);//当比较大小时自动拆箱为int型,
System.out.println(tt < tt2);
//System.out.println(tt + tt2);
/**
* false
* true
* false
* false
*/
} }
增强版
package sfk.bbs.test.springjsbctempletTest; import org.junit.Test; public class testBase
{ @Test
public void test()
{ /*源码
* public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}*/ //自动装箱
//系统把一个[-128,127]之间的整数自动装箱成Integer实例,并放入了一个名为cache的数组中缓存起来,如果以后把一个[-128,127]之间的整数自动装箱成一个integer实例时,
//实际上是直接指向对应的数组元素.因此a出的代码打印为true Integer autoPackage0 = Integer.valueOf(1);
/**
* public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
*/
// 自动装箱,直接将值赋给一个对象时,调用就是Integer.valueOf(int i)这个方法
// 双等比较的是对象存在的地址
Integer autoPacking1 = 1;
Integer autoPacking2 = 1;
Integer newInteger = new Integer(1);
System.out.println("在integer的cache中时");
//equeals 比较
System.out.println("autoPacking1.equals(autoPacking2) : "+autoPacking1.equals(autoPacking2));//true 因为两个对象都是Integer时比较的是自动拆箱的值
System.out.println("autoPacking1.equals(newInteger) : "+autoPacking1.equals(newInteger));//true,,此时无论二者的值是不是在Integercache里面 //双等比较
System.out.println("autoPacking1==autoPacking2 : "+(autoPacking1==autoPacking2));//true,考虑自动拆箱
System.out.println("autoPacking1==newInteger : "+(autoPacking1==newInteger));//fasle,new关键字的意思是不要当前已经有的,必须新建一个 System.out.println("不在integer的cache中时");
// Integer autoPacking3 = Integer.valueOf(128);
Integer autoPacking4 = 128;
Integer autoPacking5 = 128;
Integer newIntger2 = new Integer(128);
System.out.println("autoPacking5==autoPacking4 : "+(autoPacking5==autoPacking4));//a 返回false,已经不在cache中所以自动装箱,调用Integer.valueOf(int i)方法.
System.out.println("autoPacking3==autoPacking4 : "+(autoPacking3==autoPacking4));// 返回false,因为都是新的对象,所以地址都不一样,都返回false
System.out.println("autoPacking4==newIntger2 : "+(autoPacking4==newIntger2));//返回false
System.out.println("当Integer类型被用来比较大小(>,<,>=,<=)时会先自动拆箱,然后用他们的value比较");
System.out.println(autoPacking4.intValue()==autoPacking4.intValue());//要用双等判断两个对象的值是否相等时,要调用intValue方法
}
@Test
public void testString()
{
/**
* String 的equals方法中先比较两个对象的地址是否相等,如果地址相等,那么直接返回true,
* 如果地址不相等,遍历字符传,然后判断这两个对象的字符串的值是否相等,如果此时值相等,此时返回true
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
} */
System.out.println("提前声明一下,无论什么时候new 一个对象他要表达的意思都是我不要已经有的对象,必须新建一个对象,所以双等时二者时(他们的地址)不会相等的");
String s1 = "qq";
String s11 = "qq"; String s2 = new String("qq");
//双等
System.out.println("s1==s11 : "+(s1==s11));//相等的原因是用到了java缓存机制
//系统会创建一个内容为qq的String实例,并将这个实例缓存起来,当第二次执行
//String s11 = "qq";代码时,系统会先检查缓存中是否有这个一个String实例的内容,与这个"qq"
//直接量的字符序列相同,如果在缓存中知道了这样一个String实例,系统会直接让这个引用指向这个String实例
//即二者的指向的地址是相等的 System.out.println("s1==s2 : "+(s1==s2)); //equals
System.out.println("s1.equals(s11) : "+s1.equals(s11));//true 由equals方法的定义可以知道返回true
System.out.println("s1.equals(s11) : "+s1.equals(s11));//true 由equals方法的定义可以知道返回true
System.out.println("s1.equals(s11) : "+s1.equals(s11));//true 由equals方法的定义可以知道返回true
//String的缓存机制和Integer的常量池是不一样的 } }
相关文档 http://bbs.csdn.net/topics/392029500 http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html
java中Integer,String判断相等与integer的比较大小的更多相关文章
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 分享知识-快乐自己:Java 中 的String,StringBuilder,StringBuffer三者的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1):首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer &g ...
- 我说精通字符串,面试官竟然问我 Java 中的 String 有没有长度限制?
String 是 Java 中很重要的一个数据类型,除了基本数据类型以外,String 是被使用的最广泛的了,但是,关于 String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Ja ...
- Java中的空值判断
Java中的空值判断 /** * 答案选项: * A YouHaidong * B 空 * C 编译错误 * D 以上都不对 */ package com.you.model; /** * @auth ...
- (转)Java 中关于String的空对象(null) ,空值(empty),空格
原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...
- 【翻译】为什么Java中的String不可变
笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int.boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在. 但是 ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...
- Java内存管理-探索Java中字符串String(十二)
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends O ...
随机推荐
- GCD深入学习(1)dispatch_semaphore
dispatch_semaphore信号量是一种基于计数器的一种多线程同步机制 在多个线程访问共有资源的时候,会因为多线程的特性引发数据出错. - (void)addData { dispatch_q ...
- 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装
我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...
- 有氧运动 && 无氧运动
有氧运动也叫做有氧代谢运动,是指人体在氧气充分供应的情况下进行的体育锻炼.有氧运动的好处是:可以提升氧气的摄取量,能更好地消耗体内多余的热量.也就是说,在运动过程中,人体吸入的氧气与需求相等,达到生理 ...
- Invoke--转载
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界 ...
- SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏
如果在客户端计算机上启动Microsoft SQL Server 2012的 ClickOnce 版本的 Microsoft SQL Server 报表生成器时出现"无法检索应用程序文件.部 ...
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
- SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 邮件作为一种非常便利的预警实现方式,在及时性和易用性 ...
- android setDestinationInExternalPublicDir 下载到SD卡根目录
一:setDestinationInExternalPublicDir(“Trinea”, “MeiLiShuo.apk”);表示设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo. ...
- mysql sum 和 count 函数 合并使用
SELECT sum(start) as total, count(start) as rows FROM table where....
- 使用WinRar软件制作程序安装包
之前我写过使用好压软件打包程序,见随笔: 使用好压(HaoZip)软件打包EverEdit制作安装程序 - Fetty - 博客园http://www.cnblogs.com/fetty/p/4907 ...