2015-05-11
java的String
本文转载自https://blog.csdn.net/barryhappy/article/details/6082823
这是一个老生常谈的问题了,不过我最近才仔细看。
一点体会,笔而记之。
先看这几句代码
[java] view plain copy
- String s1 = “String”;
- String s2 = “String”;
- System.out.println(s1 == s2 );
- 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
- String s3 = new String(“String”);
- String s4 = new String(“String”);
- System.out.println(s3 == s4);
- 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
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n– != 0) {
- if (v1[i++] != v2[j++])
- return false;
- }
- return true;
- }
- }
- return false;
- }
java的String是用字符数组模拟的。
从上面的代码可以看出String的equals()的工作原理——
1、首先比较引用,如果引用相同,返回true;
2、比较类型,如果不是比较的不是String对象,返回false;
3、比较长度,字符串长度不等时,返回false;
4、逐个字符比较两个字符串,遇到不一样的字符,返回false;
5、到最后都一致,返回ture;
dzzxjl