今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的:
一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写的:
String s = "zhong hua ren min gong he guo"; String[] s1 = s.split(""); String s2 = ""; for(int i=0;i<=s.length();i++) { if(s1[i]==" ";) { s1[i] = ""; } s2 += s1[i]; } System.out.println("原来的字符串为: "+s); System.out.println("去掉空格之后的字符串为: "+s2);
但是发现运行之后还是原来的字符串, 没有任何改变, 顿时场面相当的尴尬啊, 检查了好几遍没发现有错的地方啊, 而且这个逻辑也可以啊, 没啥错误啊, 后来请教了一个本班同学, 给出了这样的代码
String s = "zhong hua ren min gong he guo"; String[] s1 = s.split(""); String s2 = ""; for(int i=0;i<=s.length();i++) { if(s1[i].equals(" ")) { } else { s2 += s1[i]; } } System.out.println("原来的字符串为: "+s); System.out.println("去掉空格之后的字符串为: "+s2);
才给我解了个围, 回家再一想, 再三的肯定我写的代码是没有错误的, 当看到那个if语句的时候我就想给自己来一套天马流星拳了
分割后的字符串数组中的元素属于重新定义了一个String, 与String s在存储中的内存地址已经不相同了, 用==来比较这两个值, 那就是真的自找难看了, 还是自己学的知识不够扎实, 以后多多注意吧! ! !
网上的解释:
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
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;
}
String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
所以一定要记住:
"=="比较的是地址
"equals"比较的是值