十一城

跬步千里,小流江海。

Home Linux ML Python Java Thoughts KmKg BookCan Links About

2015-05-11
java的String


本文转载自https://blog.csdn.net/barryhappy/article/details/6082823

这是一个老生常谈的问题了,不过我最近才仔细看。

一点体会,笔而记之。

先看这几句代码

[java] view plain copy

  1. String s1 = “String”;
  2. String s2 = “String”;
  3. System.out.println(s1 == s2 );
  4. System.out.println(s1.equals(s2));

结果为:

true

true

这个结果说明什么呢?

==在java中是比较引用的,即在内存中的地址。而String的equals()是比较字符串的内容。

第二个true无可争议,因为s1和s2的内容显然 相同。

第一个true呢?

这说明s1和s2的地址相同,s1和s2的地址为什么会相同?

查阅资料,发现 :

String s1 = “String”;

这种方式,java首先会在缓冲区查找是否有”String”这个常量对象,有就直接将其地址赋给s1,没有就创建一个”String”,然后将其赋给s1;然后

String s2 = “String”;

java同样会在缓冲区中查找”String”,这次能查找到了,因为s1创建了一个”String”,所以会将其地址赋给s2,如此,s1和s2便有了相同的地址。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

OK。

再看这一段代码

[java] view plain copy

  1. String s3 = new String(“String”);
  2. String s4 = new String(“String”);
  3. System.out.println(s3 == s4);
  4. System.out.println(s3.equals(s4));

结果为:

false

true

第二个true同样无争议。

第一个false说明s3和s4不是指向同一地址。

查阅资料发现,

String s3 = new String(“String”);会直接在内存中开辟一个空间存储一个”String”,并讲引用赋给s3;

同样 String s4 = new String(“String”);也会开辟一个空间,降低至给s4;

所以s3和s4的地址不一样。

System.out.println(s3 == s4); 会打印出false。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

关于String的equals方法:

这是直接从jdk源码复制的equals方法代码:

[java] view plain copy

  1. public boolean equals(Object anObject) {
  2. if (this == anObject) {
  3. ​ return true;
  4. }
  5. if (anObject instanceof String) {
  6. ​ String anotherString = (String)anObject;
  7. ​ int n = count;
  8. ​ if (n == anotherString.count) {
  9. ​ char v1[] = value;
  10. ​ char v2[] = anotherString.value;
  11. ​ int i = offset;
  12. ​ int j = anotherString.offset;
  13. ​ while (n– != 0) {
  14. ​ if (v1[i++] != v2[j++])
  15. ​ return false;
  16. ​ }
  17. ​ return true;
  18. ​ }
  19. }
  20. return false;
  21. }

java的String是用字符数组模拟的。

从上面的代码可以看出String的equals()的工作原理——

1、首先比较引用,如果引用相同,返回true;

2、比较类型,如果不是比较的不是String对象,返回false;

3、比较长度,字符串长度不等时,返回false;

4、逐个字符比较两个字符串,遇到不一样的字符,返回false;

5、到最后都一致,返回ture;


dzzxjl

Home Linux ML Python Java Thoughts KmKg BookCan Links About