具有相同引用的Java对象池

具有相同引用的Java对象池,java,reference,equals,pool,Java,Reference,Equals,Pool,作为一个简单的个人练习,我想做以下几点: 创建一个表示单个整数值的类 任何时候都不应存在具有相同整数值的此类的两个对象 这就是我处理问题的方式: public class MyClass { // Static pool private static HashSet<MyClass> pool; // Integer value each object holds private int value; static { pool =

作为一个简单的个人练习,我想做以下几点:

  • 创建一个表示单个整数值的类
  • 任何时候都不应存在具有相同整数值的此类的两个对象
这就是我处理问题的方式:

public class MyClass {

   // Static pool
   private static HashSet<MyClass> pool;

   // Integer value each object holds
   private int value;

   static {
     pool = new HashSet<MyClass>();
   }

   // private Constructor
   private MyClass(int value) {
     this.value = value;
   }

   // Static public method to create MyClass objects
   public MyClass create(int value) {
      // Create tmp object with private constructor
      MyClass tmp = new MyClass(value);

      // At this point I want to check, whether an object with the
      // same integer value exists in the HashSet.
      // If this is the case I would like to return a reference to
      // the object in the HashSet (the GC will remove tmp).
      // Otherwise I would like to add tmp to the HashSet and return
      // a reference to tmp.
   }

}
公共类MyClass{
//静态池
私有静态哈希集池;
//每个对象持有的整数值
私有int值;
静止的{
pool=newhashset();
}
//私有构造函数
私有MyClass(int值){
这个值=值;
}
//创建MyClass对象的静态公共方法
公共MyClass创建(int值){
//使用私有构造函数创建tmp对象
MyClass tmp=新的MyClass(值);
//此时我想检查,是否有
//哈希集中存在相同的整数值。
//如果是这种情况,我想返回一个参考
//哈希集中的对象(GC将删除tmp)。
//否则,我想将tmp添加到HashSet并返回
//对tmp的引用。
}
}
问题的一部分写在上面发布的代码中作为注释的一部分。我对以下事情很好奇。如果我不覆盖
equals(Object obj)
pool.contains(tmp)
将始终返回false(因为默认的
equals(Object obj)
继承自
Object
测试以供参考。我可以覆盖
equals(Object obj)
比较对象的
-字段,但如何从哈希集中获取引用以返回它


我需要用
hashcode()
做什么吗?

只需使用
Map
只需使用
Map
假设您使用的是Java8,请使用
Map


假设您使用的是Java 8,请使用
Map


不使用
映射的任何原因
?不使用
映射的任何原因
?或
ComputeFabSent(值,MyClass::new)
。你能不能稍微说一点,这条神奇的线是做什么的?
synchronized
computeIfAbsent
+LambdaMagic…在方法的Javadoc中有描述。
synchronized
是必要的,因为它是一个HashMap,而且。如果密钥当前不在映射中,lambda只是一个创建新实例的东西。好的,还有我可以将
值作为第一个参数传递,即使它不是对象类型
Integer
?它被调用。或者
computeFabSent(value,MyClass::new)
。你能不能稍微说一点,这条神奇的线是做什么的?
synchronized
computeIfAbsent
+LambdaMagic…在方法的Javadoc中有描述。
synchronized
是必要的,因为它是一个HashMap,而且。如果密钥当前不在映射中,lambda只是一个创建新实例的东西。好的,还有我可以将
值作为第一个参数传递,即使它不是对象类型
Integer
?它被调用了。我可以在6分钟内接受答案。不过,我也为下面的答案感到兴奋。@Matthias-请确保您理解这一点。.我不想让事情复杂化,但因为它在那里…我可以接受ans六分钟后回答。不过我也为下面的答案感到兴奋。@Matthias-一定要让你明白那一点。.我不想把事情复杂化,但因为它就在那里。。。
private static Map<Integer, MyClass> map = new HashMap<>();
public MyClass create(int value) {
  synchronized (map) {
    return map.computeIfAbsent(value, MyClass::new);
  }
}