当前位置:文档之家› String数据类型比较

String数据类型比较


首先定义一个名为 str1 的 String 类的对象引用变量。接着,在栈内存中搜索是否存在 这样一个存储单元, 用来存放 “abc” 的值。 若没有, 则开辟一个新的存储单元存放 “abc” 的值。然后,创建一个新的 String 类的对象 x。并将对象 x 指向新开辟的存储单元, 同 时在栈内存中标记这个引用的对象 x。如果已经存在值为“abc” ,则搜索对象 x,并返 回该对象 x 的地址。最后,将 str1 指向对象 x 的地址。Str1 指向存在栈中数据的引用。
于.class 文件中的常量池 ,在运行期被 JVM 装载,并且可以扩充。此前提到的 intern() 方法针对 String 实例的这个意图提供服务。当针对一个 String 实例调用了 intern() 方 法,intern() 方法遵守前面概括的第 3 步以外的常量池解析规则:因为实例已经存在,而不 需要另外创建一个新的。所以已存在的实例的引用被加入到该常量池。
此外,还有三个类:包装类(Boolean、Character、Integer 、Long、Float 和 Double),
File 和 Date。他们都重写了 Object 累中的 equals()方法,这三种类型的对象比较时, 类型相同并且内容一致时返回值为 true。 另外,若声明的是字符串数组类型变量,如: String []str4={"a","b","c"}; String []str5={"a","b","c"}; 使用 “==” 和 equals()比较 str4 和 str5 的关系得到的返回值均为 false。 即不能使用 “==” 和 equals()来比较两个字符串数字的关系。可以用 java.util 包中的 Arrays 类的静态成 员 equals()方法。即 System.out.println(Arrays.equals(str4,str5)):打印结果为 true。
对象的比较 String 是 Java 中一个最常用的不可变对象。其对象的创建有两种方式: 其一:String str="abc"; 其二:String str=new String("abc"); � 两者都为第一种方式创建对象的比较 String str1="abc"; String str2="abc"; System.out.println(str1==str2);
String str2="abc";在栈内存中创建了一个对象引用变量 str2,之前栈内存中已经有一个 对象 x 值为 “abc” , 所以 str2 直接指向对象 x, 因此 JVM 创建了两个对象引用变量 str1 和 str2, 但仅创建了一个对象 x, 并且两个引用都指向了对象 x, 所以比较的结果为 true。 � 两者都为第二中方式创建对象的比较 String str1=new String("abc"); String str2=new String("abc"); System.out.println(str1=str2); 系统会在栈内存中分别创建两个对象引用变量 str1 和 str2,接着用 new 关键字在栈内 存中创建两个对象,因为 new 运算符在每一次运算是,都会产生一个新的对象,每一 个新的对象都有自己的内存和地址。所以两个引用变量分别表示了两个不同的对象。 因 此比较的结果为 false。 � 两者各自创建的对象比较 String str1="abc"; String str2=new String("abc"); System.out.println(str1==str2); 据前面的的分析,我们可以看出这个比较的结果为 false。系统在栈内存中创建了两个 对象引用变量 str1、str2.其中 str1 指向栈中的一个对象,str2 指向堆中的一个对象。 即 两个引用分别指向不同的两个对象,所以比较结果为 false。 � 第一种声明方式的分割比较 String str1="abc"; String str2="a"+"bc"; System.out.println(str1==str2); Java 确保一个字符串常量只有一份拷贝 ,所以当“abc”和“a”+“bc”被确定为值 相等时,Java 会设置两个变量的引用为同一个常量的引用。 在常量池 constant pool 中,Java 会跟踪所有的字符串常量。常量池指的是在编译期被 确定,并被保存在已编译的.class 文件中的一些数据。它包含了关于方法 ,类,接口等等, 当然还有字符串常量的信息。 当 JVM 装载了这个.class 文件。 变量 str1 和 str2 被确定,JVM 执行了一项名为常量池 解析 constant pool resolution 的操作。 该项操作针对字符串的处理过程包括下列 3 个步骤:
字符串值的比较 要 比 较 两 个 字 符 串 的 值 是 否 相 等 , 可 以 调 用 equals() 方 法 。 Equals() 方 法 是 ng.Object 类中的方法,在 String 类中他重写了这一方法,比较时,只要字符串 中的每一个字符对应相等。不管对象的地址是否相同、对象是否是同一个对象,字符串 对象都相等。如:str1.equals(str2)只要 str1 和 str2 的字符串信息相同结果就为 true。 在重写 equals 方法时,要注意满足离散数学上的自反性;对称性;传递性;一致性; 非 空 性 等 特 性 。 在 String 类 中 , 还 有 一 个 函 数 也 可 以 用 于 字 符 串 的 比 较 : equalsIgnoreCase()他的比较规则是只要字符串对象对应字符是相等的, 那么对象就是 相等的,并且忽略字母的大小写。
总结: 操作符“==”用来判断两个对象的地址是否相同,即是否指向同一个对象,比较的是 真正意义上的指针操作。并且操作符“==”两边的操作数必须是同一类型(可以是父子类 之间) ,才能编译通过。而 String 的成员方法 equals()比较的是两个对象的内容是否相同, 其参数是一个 String 对象时才有可能返回一个 true,其他对象都返回 false。一般来说,在 比较两个对象是否相等时用 equals()方法,而对于原始数据类型则用操作符“==” 。
如果另一个常量池入口 constant pool entry 被标记为 CONSTANT_String2 ,并且 指出同样的 Unicode 字符序列已经被确定 ,那么这项操作的结果就是为之前的常量池 入口创建的 String 实例的引用。 否则,如果 intern()方法已经被这个常量池描述的一个包含同样 Unicode 字符序列 的 String 实例调用过了,那么这项操作的结果就是那个相同 String 实例的引用。 否则 , 一个新的 String 实例会被创建它包含了 CONSTANT_String 入口描述的 Unicode 字符;序列这个 String 实例就是该项操作的结果。 也就是说,当常量池第一次确定一个字符串,在 Java 内存栈中就创建一个 String 实 例。 在常量池中,后来的所有针对同样字符串内容的引用,都会得到之前创建的 String 实 例。 当 JVM 处理到第 6 行时,它创建了字符串常量 abc 的一份拷贝到另一个 String 实 例中。所以对 str1 和 str2 的引用的比较结果是 false ,因为它们不是同一个对象。这就 是为何 str1==str2 的操作在某些情况下与 str1.equals(str2)不同。str1==str2 比较的是 对象引用的值 ; 而 str1.equals(str2) 实际上执行的是字符串内容的比较。 存在
Java 数据类型比较
Java 数据类型分为两种。一种为基本数据类型(或为简单数据类型、主要数据类型) ,另 外一种为引用数据类型(或为扩展类型) 。基本数据类型存储的是具体的值,而引用数据类 型存储的是对象的引用。
(1)使用操作符 (2)使用 equals() 在 Java 中通过两种方式可以比较两个数据是否相等: “==” ; 方法。 � 基本数据类型比较 在 Java 中,基本数据类型比较一般使用操作符“==”进行比较。因为原始类型(int、 char 等)不是对象,因此只能用操作符“==”进行比较。 � 引用数据类型比较 Java 中没有内置字符串类型,在标准 Java 库中有一个名为 String 的预定义类,将字 符串作为预定义的对象处理, 并且提供了丰富的功能来处理字符串。 而比较两个象的 值, 则使用 equals()方法, 因为操作符 “==” 比较的是两个对象的本身而非对象的内容。
相关主题