String s1 = "Hello";
String s2 = "hello";
String s3 = s1.toLowerCase();
String s4 = s2.toLowerCase(); System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s2 == s4);
false
false
true
我想问,3次引用地址的比较,为什么是false,false,true?
为什么s2和s4的地址就是相同的,而2和3,3和4就不同?
String s2 = "hello";
String s3 = s1.toLowerCase();
String s4 = s2.toLowerCase(); System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s2 == s4);
false
false
true
我想问,3次引用地址的比较,为什么是false,false,true?
为什么s2和s4的地址就是相同的,而2和3,3和4就不同?
解决方案 »
- 真搞不懂s:iterator是怎么获取action数据的,求解答。
- spring 属性注入问题,为什么生成的对象总是为空?
- struts+spring+ibatis整合出错,求高手解答
- org.apache.catalina.loader.WebappClassLoader findResourceInternal
- 关于Spring中的Advisor配置,如何为pointcut配置多个pattern呢?
- 请问 这样的系统该怎样修改才更合理?
- jTable点击一个单元格的时候,如何使得background的颜色只覆盖所有的文字,而不是覆盖整个单元格?
- 最近用JSP做了一个聊天室项目,但速度非常慢,请问可以实现网页不刷新是实时的现实最新聊天信息吗?
- 菜鸟发问:如何再j2ee下面运行个serlet?绝对给分
- sts 工程报错
- apache-cxf蛋疼的问题
- jxl操作excel的一些问题
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;这么跟你解释吧:
equals它是java.lang.Object类中的一个方法。
当你写成这样,不是去定义成变量,而是定义成对象后,在去比较试就可以明白了:String s1 = new String("str");
String s2 = new String("str");
String s2 = "hello";
之后再写
String s4 = "hello";
的时候,其实java并没有新开一块内存,而是将s4的指向了s2那么再来看
String s3 = s1.toLowerCase();
这句运行完之后s3变成了hello,但为什么java没有将之前已存在的s2的地址指向给s3呢?
都跟你说了“==”和equal的区别,怎么就是不懂呢?
String s2 = "hello";
String s3 = s1.toLowerCase();
String s4 = s2.toLowerCase(); System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s2 == s4);
false
false
true
我想问,3次引用地址的比较,为什么是false,false,true?
为什么s2和s4的地址就是相同的,而2和3,3和4就不同?
s2和s4地址相同,String s2 = "hello";String s4 = s2.toLowerCase();
查看jdk toLowerCase()方法,返回的是 return this; 所以是相同的
然而2和3 为什么不同,String s2 = "hello";
String s3 = s1.toLowerCase();
原因是s3是在运行期生成的新对象 return new String(0, count+resultOffset, result);
所以不同
而3和4同上
地址比较用“==”,值比较才用equal
好像你弄反了?
参考源码 public String toLowerCase(Locale locale) {
if (locale == null) {
throw new NullPointerException();
} int firstUpper; /* Now check if there are any characters that need to be changed. */
scan: {
for (firstUpper = 0 ; firstUpper < count; ) {
char c = value[offset+firstUpper];
if ((c >= Character.MIN_HIGH_SURROGATE) &&
(c <= Character.MAX_HIGH_SURROGATE)) {
int supplChar = codePointAt(firstUpper);
if (supplChar != Character.toLowerCase(supplChar)) {
break scan;
}
firstUpper += Character.charCount(supplChar);
} else {
if (c != Character.toLowerCase(c)) {
break scan;
}
firstUpper++;
}
}
return this;//把本身返回
} char[] result = new char[count];
int resultOffset = 0; /* result may grow, so i+resultOffset
* is the write location in result */ /* Just copy the first few lowerCase characters. */
System.arraycopy(value, offset, result, 0, firstUpper); String lang = locale.getLanguage();
boolean localeDependent =
(lang == "tr" || lang == "az" || lang == "lt");
char[] lowerCharArray;
int lowerChar;
int srcChar;
int srcCount;
for (int i = firstUpper; i < count; i += srcCount) {
srcChar = (int)value[offset+i];
if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
(char)srcChar <= Character.MAX_HIGH_SURROGATE) {
srcChar = codePointAt(i);
srcCount = Character.charCount(srcChar);
} else {
srcCount = 1;
}
if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
} else {
lowerChar = Character.toLowerCase(srcChar);
}
if ((lowerChar == Character.ERROR) ||
(lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
if (lowerChar == Character.ERROR) {
lowerCharArray =
ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
} else if (srcCount == 2) {
resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
continue;
} else {
lowerCharArray = Character.toChars(lowerChar);
} /* Grow result if needed */
int mapLen = lowerCharArray.length;
if (mapLen > srcCount) {
char[] result2 = new char[result.length + mapLen - srcCount];
System.arraycopy(result, 0, result2, 0,
i + resultOffset);
result = result2;
}
for (int x=0; x<mapLen; ++x) {
result[i+resultOffset+x] = lowerCharArray[x];
}
resultOffset += (mapLen - srcCount);
} else {
result[i+resultOffset] = (char)lowerChar;
}
}
return new String(0, count+resultOffset, result);//直接返回新String
}