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 ...
随机推荐
- Java导入的项目乱码怎么解决?(Ⅱ)
1.首先 打开 >> Eclipse或Myeclipse.(我用的是Myeclipse) 2.打开 >> Window >> Preferences ...
- SQLite使用(一)&&选择表类型
在SQLite中,主要有两种表类型,带rowid的表和不带rowid的表.我们利用create table 建一张表,默认都会有一个隐含名字为rowid的主键,暂且称带rowid的表为普通表.如果建表 ...
- SQLServer复制(二)--事务代理作业
之前的一篇已经介绍了如何配置复制,介绍了发布者.分发者和订阅者以及事务日志运行的简单关系.其中提到了复制代理,我们这篇将详细介绍复制代理,它是什么?在事务复制的步骤中起到了什么作用? 代理和工作 首先 ...
- 通过重构VO实现校验功能
现有个需求,需要添加供应商的页面校验功能,当填写一二级时,供应商是必填项,并且所填的供应商必须是二级分类下的,否则下一步和保存过不去: 解决方案: 1.在页面AM的XXXImpl.java中, 加入引 ...
- Apache 安装配置详情
本次文章讲解Apache的安装和基本的配置 输入PHP环境搭建的一部分 PHP完整配置信息请参考 http://www.cnblogs.com/azhe-style/p/php_new_env_bui ...
- ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块
分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...
- nginx 301 永久重定向
nginx301跳转设置很简单,配置如下. (配置文件默认为nginx.conf,如果制定了新的配置文件,在新的文件配置即可.) server{ server_name xxx.com www.xxx ...
- 深入理解C++对象模型
C++对象模型是比较重要的一个知识点,学习C++对象的内存模型,就可以明白C++中的多态原理.类的初始化顺序问题.类的大小问题等. 1 C++对象模型基础 1.1 C++对象中都有哪些东东 C++对象 ...
- libsvm简介和函数调用参数说明
1. libSVM简介 libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归.由于libSVM程序小 ...
- CSS/CSS3常用样式小结
1.强制文本单行显示: white-space:nowrap; 多行文本最后省略号: display: -webkit-box; -webkit-line-clamp:2; overflow: hid ...