Java:ArrayList中的元素相等判断,javaarraylist
分享于 点击 11007 次 点评:7
Java:ArrayList中的元素相等判断,javaarraylist
Java:ArrayList中的元素相等判断初学JAVA,对ArrayList印象非常好,兴致勃勃的就开始使用了。在使用过程中遇到了如下问题:
在下面代码中newFactors1、newFactors2都是ArrayList<String>类型,根据下图执行到if语句的变量监视,我们可以看到两个表达式newFactors1.get(i)和newFactors2.get(i)的值是“相等”的,然而if语句返回的结果是true!也就是说这两个表达式并不相等。
for (int i = 0; i < newFactors2.size(); i++) {
if(newFactors1.get(i) != newFactors2.get(i)){
return false;
}
}
....
下面是变量监视
上网查询无果(还是搜商太低。。),经人指点,Java作为面向对象的语言,有可能表达式的值是一个对象,对象是不能简单用“==”或者“!=”来判断的。于是我勇敢的在newFactor.get(i)后面加了一个“.”,感谢eclipse的代码提示功能,提示列表出现了equals方法。代码改成这样就合乎预期了。
for (int i = 0; i < newFactors2.size(); i++) {
if(!newFactors1.get(i).equals(newFactors2.get(i))){
return false;
}
}
....
WHY?
进一步查资料发现,原因在于Java的String类型相等判断使用equals方法,而不能使用“==”或者“!=”来判断。那么问题来了,用“==”或者“!=”判断的是什么呢?
Java的String类型相等判断使用equals方法,关于“==”或者“!=”,查阅资料得知是判断对象的内存地址。但有时候,这种“==”比较貌似是可行的。比如下面代码输出是5个“Equal!”;
public class javatest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "111";
String s2 = "111";
ArrayList newS1 = new ArrayList();
ArrayList newS2 = new ArrayList();
newS1.add(s1);
newS2.add(s2);
if(testEqual(s1)){
System.out.println("Equal!");
}
else{
System.out.println("Not equal");
}
if(s1 == s2){
System.out.println("Equal!");
}
else{
System.out.println("Not equal");
}
if(s1.equals(s2)){
System.out.println("Equal!");
}
else{
System.out.println("Not equal");
}
if(newS1.get(0) == newS2.get(0)){
System.out.println("Equal!");
}
else{
System.out.println("Not equal");
}
if(newS1.get(0).equals(newS2.get(0))){
System.out.println("Equal!");
}
else{
System.out.println("Not equal");
}
}
public static boolean testEqual(String s){
String s1="111";
if(s1 == s){
return true;
}
return false;
}
在调试时打开变量监视,value后面括号内的id相当于在内存中的地址(或者说偏移地址,反正只是看看是否相等)
虽然他们是分开创建的对象,但是却存在同一个地址下。这也是java的特点,我的理解是“111”才是一个实际的对象,而是s1和s2只是指向他的一个引用罢了。我在文章开头提到的那个错误,显然是因为两个变量并不是引用同一个对象。因此,为了达到预期目的,只要是为了比较两个字符串的内容,都务必要用equals方法。
相关文章
- 暂无相关文章
用户点评