具有相同引用的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);
}
}