微商城网站建设信息,网站开发神书,wordpress博客论坛插件,天河做网站系统如果是int类型#xff0c;判断相等的话直接使用 来判断#xff0c;例如#xff1a;
int i 10; int j 10; System.out.print(i j)#xff1b;
如果是Integer类型#xff0c;则可以使用equals方法进行相等比较。
int与Integer的基本使用对比
#xff08…如果是int类型判断相等的话直接使用 来判断例如
int i 10; int j 10; System.out.print(i j)
如果是Integer类型则可以使用equals方法进行相等比较。
int与Integer的基本使用对比
1Integer是int的包装类int是基本数据类型 2Integer变量必须实例化后才能使用int变量不需要 3Integer实际是对象的引用指向此new的Integer对象int是直接存储数据值 4Integer的默认值是nullint的默认值是0。 5Integer型变量与int型变量之间可以直接比较此时自动进行拆箱操作。 总之要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。
在初学Java时可能会经常碰到下面的代码 1 String str1 new String(“hello”); 2 String str2 new String(“hello”); 3 4 System.out.println(str1str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样和equals方法之间的区别是什么如果在初学Java的时候这个问题不弄清楚就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下和equals方法的区别之处。
一.关系操作符“”到底比较的是什么
下面这个句话是摘自《Java编程思想》一书中的原话
“关系操作符生成的是一个boolean结果它们计算的是操作数的值之间的关系”。
这句话看似简单理解起来还是需要细细体会的。说的简单点就是用来比较值是否相等。下面先看几个例子
public class Main {
/*** param args*/
public static void main(String[] args) {// TODO Auto-generated method stubint n3;int m3;System.out.println(nm);String str new String(hello);String str1 new String(hello);String str2 new String(hello);System.out.println(str1str2);str1 str;str2 str;System.out.println(str1str2);
}}
输出结果为 true false true
nm结果为true这个很容易理解变量n和变量m存储的值都为3肯定是相等的。而为什么str1和str2两次比较的结果不同要理解这个其实只需要理解基本数据类型变量和非基本数据类型变量的区别。
在Java中游8种基本数据类型
浮点型float(4 byte), double(8 byte)
整型byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小仅规定其只能够取字面值true和false)
对于这8种基本数据类型的变量变量直接存储的是“值”因此在用关系操作符来进行比较时比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的而char是无符号类型的char类型取值范围为0~2^16-1).
也就是说比如
int n3;
int m3;
变量n和变量m都是直接存储的3这个数值所以用比较的时候结果是true。
而对于非基本数据类型的变量在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量引用类型的变量存储的并不是 “值”本身而是于其关联的对象在内存中的地址。比如下面这行代码
String str1;
这句话声明了一个引用类型的变量此时它并没有和任何对象关联。
而 通过new String(“hello”)来产生一个对象也称作为类String的一个实例并将这个对象和str1进行绑定
str1 new String(“hello”);
那么str1指向了一个对象很多地方也把str1称作为对象的引用此时变量str1中存储的是它指向的对象在内存中的存储地址并不是“值”本身也就是说并不是直接存储的字符串hello。这里面的引用和C/C中的指针很类似。
因此在用对str1和str2进行第一次比较时得到的结果是false。因此它们分别指向的是不同的对象也就是说它们实际存储的内存地址不同。
而在第二次比较时都让str1和str2指向了str指向的对象那么得到的结果毫无疑问是true。
二.equals比较的又是什么
equals方法是基类Object中的方法因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用直接看Object类中equals方法的实现。
该类的源码路径为C:\Program Files\Java\jdk1.6.0_14的src.zip 的java.lang路径下的Object.java视个人jdk安装路径而定。
下面是Object类中equals方法的实现 很显然在Object类中equals方法是用来比较两个对象的引用是否相等即是否指向同一个对象。
但是有些朋友又会有疑问了为什么下面一段代码的输出结果是true
public class Main {
/*** param args*/
public static void main(String[] args) {// TODO Auto-generated method stubString str1 new String(hello);String str2 new String(hello);System.out.println(str1.equals(str2));
}}
要知道究竟可以看一下String类的equals方法的具体实现同样在该路径下String.java为String类的实现。
下面是String类中equals方法的具体实现
可以看出String类对equals方法进行了重写用来比较指向的字符串对象所存储的字符串是否相等。
其他的一些类诸如DoubleDateInteger等都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。
总结来说
1对于如果作用于基本数据类型的变量则直接比较其存储的 “值”是否相等
如果作用于引用类型的变量则比较的是所指向的对象的地址
2对于equals方法注意equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写则比较的是引用类型的变量所指向的对象的地址
诸如String、Date等类对equals方法进行了重写的话比较的是所指向的对象的内容。