Java学习之数据比较
2018-02-26 15:46
211 查看
这里主要是总结一些常见的比较及其区别:
等号“==”的比较
使用“==”能够进行比较的是常见的基本数据类型,比较的是变量的内存地址。
Object的equals()方法
在Object类中equals()方法的作用和“==”类似,比较的也是变量的内存地址。
String中的比较方法
str.equals(String otherstr)
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。
str.equalsIgnoreCase(String otherstr)
忽略大小写,如果两个字符串具有相同的字符和长度,返回true。
str.compareTo(String otherstr)
该方法为按字典顺序比较两个字符串,该比较是基于字符串中各个字符的Unicode值,如果String对象位于参数字符串之前,比较结果为负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为正整数,如果相等,结果为0。
几种包装类(Integer、Boolean、Byte、Character、Double、Number)的数据比较
结果为:
这里对代码稍作解释:
一般我们定义形如
String str3=”123”;
String str4=”123”;
时,第一次定义的“123”,会被放入字符串池中,当再次定义str4时,这是它会先去寻找字符串池中是否已经存在“123”,如果存在,则返回字符串池中“123”的地址引用,因此str3==str4也就成立。
很明显一般的基础类型定义的变量可以直接通过“==”进行比较,但是针对于String以及数据包装类Integer等,“==”比较的只是对象引用的值,而对象引用的值(即指针的值)是对象的地址,存放在栈内存中,实际对象则是存放在堆内存中的,引用所包含的地址就是对象的堆地址。对象在每new一次的时候,都会申请一个新的地址空间,即使空间内容相同,但申请到的地址不同,所以在用“==”进行比较时,无法正确得出结果。因此String和Integer等类覆盖了父类Object的equals()方法,从而可以比较对象中的内容,但是在Object类中,equals()方法其实是和“==”等效的。
其中String和Integer等类还包含有compareTo方法,能够有效的比较大小,并得出对应的结论,具体关于compareTo的方法的介绍可以查看API
最后再说一下,intern()这个函数,下面是API中关于这个函数的介绍
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
由此可见,当调用intern方法后,str2的值即是“123”的地址值,所以str2==str3也就成立。
关于Java中堆栈的介绍,大家可以参考下面这个链接
Java堆栈详解
等号“==”的比较
使用“==”能够进行比较的是常见的基本数据类型,比较的是变量的内存地址。
Object的equals()方法
在Object类中equals()方法的作用和“==”类似,比较的也是变量的内存地址。
String中的比较方法
str.equals(String otherstr)
如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。
str.equalsIgnoreCase(String otherstr)
忽略大小写,如果两个字符串具有相同的字符和长度,返回true。
str.compareTo(String otherstr)
该方法为按字典顺序比较两个字符串,该比较是基于字符串中各个字符的Unicode值,如果String对象位于参数字符串之前,比较结果为负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为正整数,如果相等,结果为0。
几种包装类(Integer、Boolean、Byte、Character、Double、Number)的数据比较
public class Equal { public static void main(String[] args) { String str1=new String("123"); String str2=new String("123"); String str3="123"; String str4="123"; String str5=new String("12"); double e=1.23; double f=1.23; Integer int1=new Integer(10); Integer int2=new Integer(10); Integer int3=new Integer(9); //String类型下的比较 System.out.println(str3==str4); System.out.println(str1==str2); System.out.println(str2.equals(str3)); System.out.println(str2.compareTo(str1)); System.out.println("-----------"); //基本类型的比较 System.out.println(e==f); System.out.println("-----------"); //包装类的比较 System.out.println(int1==int2); System.out.println(int1.equals(int2)); System.out.println(int1.compareTo(int2)); System.out.println(int3.compareTo(int2)); //改进str2 str2=str2.intern(); System.out.print("改进后的str2和str3的比较:"); System.out.println(str2==str3); } }
结果为:
true false true 0 ----------- true ----------- false true 0 -1 改进后的str2和str3的比较:true
这里对代码稍作解释:
一般我们定义形如
String str3=”123”;
String str4=”123”;
时,第一次定义的“123”,会被放入字符串池中,当再次定义str4时,这是它会先去寻找字符串池中是否已经存在“123”,如果存在,则返回字符串池中“123”的地址引用,因此str3==str4也就成立。
很明显一般的基础类型定义的变量可以直接通过“==”进行比较,但是针对于String以及数据包装类Integer等,“==”比较的只是对象引用的值,而对象引用的值(即指针的值)是对象的地址,存放在栈内存中,实际对象则是存放在堆内存中的,引用所包含的地址就是对象的堆地址。对象在每new一次的时候,都会申请一个新的地址空间,即使空间内容相同,但申请到的地址不同,所以在用“==”进行比较时,无法正确得出结果。因此String和Integer等类覆盖了父类Object的equals()方法,从而可以比较对象中的内容,但是在Object类中,equals()方法其实是和“==”等效的。
其中String和Integer等类还包含有compareTo方法,能够有效的比较大小,并得出对应的结论,具体关于compareTo的方法的介绍可以查看API
最后再说一下,intern()这个函数,下面是API中关于这个函数的介绍
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
由此可见,当调用intern方法后,str2的值即是“123”的地址值,所以str2==str3也就成立。
关于Java中堆栈的介绍,大家可以参考下面这个链接
Java堆栈详解
相关文章推荐
- java学习(2)数组详解(包括数据的初始化、比较、排序、重要方法)
- Java学习之double类型数据比较
- java与.net比较学习系列(3) 基本数据类型和类型转换
- java核心知识点学习----多线程间的数据共享的几种实现方式比较
- Java中对象的比较 == 和 equals() -Java 学习笔记 (15)
- C#,java比较学习
- Java学习笔记及其与C++的比较
- 数据连接部分通过测试源代码-----java学习笔记之4
- JAVA基础学习总结---原码、补码、反码以及基本数据类型
- Java中的数据比较(再谈==与equals的区别)
- 一篇学习JAVA好文,写得比较幽默。
- Java学习总结之第二章 数据类型和变量
- Java基本数据类型的学习记录
- javascript&java数据类型以及数组的初始化比较
- JAVA 数据结构与算法学习笔记一(转载)
- jdbc的连接问题-----java数据学习笔记之2
- 2009-05-09技术学习:java与jaon数据
- java数据类型学习