在这段代码中,我能够找到并计算任何小于10的元素。但是当要找到大于10的元素时,计数器总是显示0,即使搜索的元素存在于数组中。我使用了通用接口和静态方法。。。字数计数工作正常,但问题是大于10的数字总是显示0。以下是代码:
interface FuncCounter<T>{
int function(T[] t, T tt);
}
class Implementation{
static<T> int equalValues(T[] t , T tt) {
int counter = 0;
for(int i = 0 ; i< t.length; i++) {
if(t[i]==tt)
counter++;
}
return counter;
}
}
public class GenericMethodRef{
static<T> int countOperation(funcCounter<T> fc , T[] t , T v) {
return (int) fc.function(t, v);
}
public static void main(String []args) {
Integer[] nums = {1,1,2,3,4,4,5,6122,23,4,12,44,12,12,12,44,5,6,32, 318,318,318};
String[] words = {"one","two","three","four","four","twelve","eleven", "eleven"};
int countNum = countOperation(Implementation::<Integer>equalValues,nums,6122);
int countWords = countOperation(Implementation::<String>equalValues,words,"eleven");
System.out.println("318 presence: " + countNum);
System.out.println("'eleven' counted: " + countWords);
}```
3条答案
按热度按时间uurity8g1#
这是因为您对整数使用自动装箱,这会导致
int
进入Integer
,作为参考,它将无法与==
操作人员相反,使用
.equals()
方法,或者更好的方法是Objects.equals(t[i], tt)
呼叫要添加,通常(在大多数JVM中)存储/散列-10到10之间的整数、长整数、甚至字符串等,以指向相同的对象(
==
工作)。因此,这就是为什么它错误地适用于低数字,但在高数字上失败的原因。pexxcrt22#
记住这三条规则
==
on基元数据类型将比较实际值==
on reference data type将比较两个对象是否共享相同的内存equals()
预定义类的方法将比较引用数据类型的实际值。它可以为我们自己的类重写。mkh04yzy3#
即使您的方法被称为equalvalues,您也没有使用equals()方法,这就是问题所在:您传递一个整数数组,它的 Package 类。值小于实现定义的限制的对象被缓存,因此它适用于较小的数字。较大的值不会保存在缓存中,因此identity运算符==返回false。
您可以使用objects.equals(t[i],tt)来修复代码。
请阅读java文档中==和equals之间的差异以了解更多详细信息。