当我尝试比较两个int数组时,尽管它们完全相同,但if(one == two)中的代码仍然没有被执行。为什么是这样?
Object[] one = {1,2,3,4,5,6,7,8,9};
Object[] two = {1,2,3,4,5,6,7,8,9};
if (one == two){
System.out.println("equal");
} else {
System.out.println("not equal ");
}
答案 0 :(得分:3)
这里需要注意的一些事项:
==
比较引用,而不是值。 。 。也就是说,您要问的是这两个数组是否是完全相同的实例,而不是它们是否包含相同的值。 ==
这一事实意味着您可能不了解equals()
上的Object
方法。这是不您解决当前问题所需的方法,但请注意,通常,当您比较两个对象的值时,您应该使用obj1.equals(obj2)
,而不是obj1 == obj2
。现在==
确实使用int
之类的原语(例如普通的x == 3
等),所以也许这就是你使用它的原因,但我只想确保您了解equals()
与==
。Arrays.equals()
类上使用静态java.util.Arrays
方法。对于所有基本类型(对于每个元素对使用==
)和Object
(对于每对对,它最明确地使用equals()
来说,此方法会被重载。)答案 1 :(得分:2)
/**
* Removes all functions matching given function name mask
*
* @param p_name_mask Mask in SQL 'like' syntax
* @param p_opts Combination of comma|space separated options:
* trace - output SQL to be executed as 'NOTICE'
* dryrun - do not execute generated SQL
* @returns Generated SQL 'drop functions' string
*/
CREATE OR REPLACE FUNCTION mypg_drop_functions(IN p_name_mask text,
IN p_opts text = '')
RETURNS text LANGUAGE plpgsql AS $$
DECLARE
v_trace boolean;
v_dryrun boolean;
v_opts text[];
v_sql text;
BEGIN
if p_opts is null then
v_trace = false;
v_dryrun = false;
else
v_opts = regexp_split_to_array(p_opts, E'(\\s*,\\s*)|(\\s+)');
v_trace = ('trace' = any(v_opts));
v_dryrun = ('dry' = any(v_opts)) or ('dryrun' = any(v_opts));
end if;
select string_agg(format('DROP FUNCTION %s(%s);',
oid::regproc, pg_get_function_identity_arguments(oid)), E'\n')
from pg_proc
where proname like p_name_mask
into v_sql;
if v_sql is not null then
if v_trace then
raise notice E'\n%', v_sql;
end if;
if not v_dryrun then
execute v_sql;
end if;
end if;
return v_sql;
END $$;
select mypg_drop_functions('fn_dosomething_%', 'trace dryrun');
运算符对对象(哪个数组是)进行引用相等性检查。如果数组元素是原始的(如==
),则可以使用java.util.Arrays.equals
。如果它们本身就是对象,java.util.Arrays.deepEquals
将进行深度相等测试(假设数组中的对象提供了int
的合适覆盖。
答案 2 :(得分:2)
你可以这样做:
public boolean compareArrays(int[] a, int[] b) {
boolean check = true;
if (a!= null && b!= null){
if (a.length != b.length){
check= false;
}else
for (int i = 0; i < b.length; i++) {
if (b[i] != a[i]) {
check= false;
}
}
}else{
check= false;
}
return check;
}
或者你可以这样做:
boolean areEqual = Arrays.equals(Arrays.sort(arr1), Arrays.sort(arr2));
答案 3 :(得分:1)
您正在比较参考文献。将内容与:Arrays.equals(one, two)
答案 4 :(得分:1)
如果你这样做:
if (one == two){
然后哟正在比较2个数组的引用而不是它们的内容,这是错误的。
改为
Arrays.equals(one, two)
答案 5 :(得分:1)
==
运算符比较引用,而不是在java中扩展Object的所有内容的实际值。这种方法仅适用于基元。