String的两种字符串比较方式
== 和 equals方法
==:
==比较的是字符串在内存中的地址
代码示例:
1 public class EqualsDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 String s1 = "String"; 8 String s2 = "String"; 9 String s3 = new String("String"); 10 String s4 = new String("String"); 11 System.out.println(s1 == s2); 12 System.out.println(s1 == s3); 13 System.out.println(s3 == s4); 14 } 15 }
==字符串比较代码示例
运行结果:
true
false
false
结果分析:
当创建s1的时候,程序会在字符串缓冲池中找"String"这个字符串,没有找到,便会在字符串缓冲池中创建"String"字符串,当创建s2的时候,程序会在字符串缓冲池中找"String"字符串,找到相同的值,就直接引用s1中"String"的值,在进行比较的时候,其实比较的是两个字符串在字符串缓冲池中的地址.当创建s3的时候,不在是将"String"放入到字符串缓冲池中,因为这时候创建的是一个对象,而不是一个常量字符串.创建s4的时候也会创建一个新的对象.所以,其实s1和s2所指向的地址是字符串常量池中的一个"String"常量,而s3和s4都是不同的对象,所以s1==s2为真,s1==s3为假,s3==s4为假
equals()方法:
equals方法比较的是字符串中的值
代码示例:
1 public class EqualsDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 String s1 = "String"; 8 String s2 = "String"; 9 String s3 = new String("String"); 10 String s4 = new String("String"); 11 System.out.println(s1.equals(s2)); 12 System.out.println(s1.equals(s3)); 13 System.out.println(s3.equals(s1)); 14 System.out.println(s3.equals(s4)); 15 } 16 }
equals方法代码示例
运行结果:
true
true
true
true
结果分析:
java中String类中equals方法被重写
1 /** 2 * Compares this string to the specified object. The result is {@code 3 * true} if and only if the argument is not {@code null} and is a {@code 4 * String} object that represents the same sequence of characters as this 5 * object. 6 * 7 * @param anObject 8 * The object to compare this {@code String} against 9 * 10 * @return {@code true} if the given object represents a {@code String} 11 * equivalent to this string, {@code false} otherwise 12 * 13 * @see #compareTo(String) 14 * @see #equalsIgnoreCase(String) 15 */ 16 public boolean equals(Object anObject) { 17 if (this == anObject) { 18 return true; 19 } 20 if (anObject instanceof String) { 21 String anotherString = (String)anObject; 22 int n = value.length; 23 if (n == anotherString.value.length) { 24 char v1[] = value; 25 char v2[] = anotherString.value; 26 int i = 0; 27 while (n-- != 0) { 28 if (v1[i] != v2[i]) 29 return false; 30 i++; 31 } 32 return true; 33 } 34 } 35 return false; 36 }
String类中equals方法
从源码我们可以分析出:equals方法首先比较的是对象的引用,如果两个对象的地址是相同的,那么直接返回true,如果比较的对象时String类型,或者是String类型的子类,则进行String类的值比较(其中比较的方法包括通过两个字符的长度,如果长度不相同直接返回false;如果相同,然后挨个字符进行比较,如果所有字符都相同则返回true,简单说就是值得比较)