码迷,mamicode.com
首页 > 编程语言 > 详细

从Java源码看String的两种比较方式

时间:2016-06-13 19:12:37      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

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,简单说就是值得比较)

 

从Java源码看String的两种比较方式

标签:

原文地址:http://www.cnblogs.com/brainit/p/5581358.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!