Java 有没有办法在创建对象时删除它?

Java 有没有办法在创建对象时删除它?,java,oop,Java,Oop,我正在练习期末考试,我面临着这个问题- 给定以下代码,是否有任何方式可以实现类A,从而最终在程序的一次运行中打印5,然后在程序的另一次运行中打印4,然后再打印另一次运行3…直到0 可以假设它是确定性的,因此函数将始终生成相同的结果 不能删除类A中的任何代码,也不能删除main中的任何代码,并且只能编辑类 public class A { int i, j; public A(int i, int j) { this.i = i; this.j

我正在练习期末考试,我面临着这个问题-

给定以下代码,是否有任何方式可以实现类A,从而最终在程序的一次运行中打印5,然后在程序的另一次运行中打印4,然后再打印另一次运行3…直到0

可以假设它是确定性的,因此函数将始终生成相同的结果

不能删除类A中的任何代码,也不能删除main中的任何代码,并且只能编辑类

public class A {

    int i, j;

    public A(int i, int j) {
        this.i = i;
        this.j = j;

    }


    public static void main(String[] args) {

        Set<A> s = new LinkedHashSet<>();
        s.add(new A(3,1));
        s.add(new A(1,3));
        s.add(new A(3,1));
        s.add(new A(3,1));
        s.add(new A(2,1));

        System.out.println(s.size());

    }

}
公共A类{
int i,j;
公共A(int i,int j){
这个。i=i;
这个。j=j;
}
公共静态void main(字符串[]args){
Set s=新的LinkedHashSet();
s、 增加(新的A(3,1));
s、 增加(新的A(1,3));
s、 增加(新的A(3,1));
s、 增加(新的A(3,1));
s、 增加(新的A(2,1));
System.out.println(s.size());
}
}

我想添加一种静态HASHMAP,每次我创建一个对象时,我都会将它添加到其中,我会检查是否已经存在一个键,如果已经存在一个具有相同值的对象,我想“不创建”该对象。。。但是无法实现它。

您将要实现到类A中。您应该以这样的方式实现它们,即在将项添加到集合
s
时会导致冲突

默认情况下,它应该打印出数字5

但是,如果我们进行以下编辑:

公共A类{
int i,j;
公共A(int i,int j){
这个。i=i;
这个。j=j;
}
@凌驾
公共布尔等于(对象obj){
//首先,我们检查对象是否为空
//然后我们检查它是否与这个类相同
如果(obj==null | | obj.getClass()!=this.getClass()){
返回false;
}
A objectA=(A)obj;
if(this.i==objectA.i){
返回true;
}否则{
返回false;
}
}
@凌驾
公共int hashCode()
{ 
把这个还给我;
} 
此特定实现将导致打印出“3”。这是因为我们将其设置为hashcode等于
i
。因此,当我们将类
A
的两个实例添加到集合中时,它们将发生冲突

在我们的例子中,当添加类
A
的实例时,i的值是
3,1,3,3,2
,有3个
i
(3,1,2)的唯一值,因此它将打印
3


从这里,您可以提出不同的实现来获得不同的值。

我认为您希望在
A
类中实现
hashCode
equals
方法。您所说的“print 5/4/3/2/1/0”是什么意思?它只打印一个数字,已经打印了5个。我将进行编辑以更清楚地说明,是否有一个实现它将打印5个,另一个实现它将打印4个…等等,@luigimendoza关于生成哈希冲突是正确的,这将允许结果从5降到1,但如何阻止甚至插入1个条目,所以获取答案0?如果<代码>新的a(3,1),是否有一种实现4的好方法发生三次?谢谢!所以基本上每个集合\Hash都使用一个相等的方法和Hash,所以如果我重写Hash并始终返回相同的值,比如说1。它总是会发生冲突,然后使用相等的方法进行比较,对吗?听起来你的想法是对的。你必须操作Hash和相等重写n操作以导致一定数量的冲突。例如,如果您将
equals
函数设置为返回0,则set
s
的最终大小将为1,因为所有添加的项都将被视为相等。@omrib40如果您需要我澄清我的答案中的任何内容,请告诉我。如果您觉得合适,请点击“接受”按钮回答按钮!