我有一个arraylist,我想添加一些对这个arraylist几乎没有变化的对象。
这是我的代码;
Student student = createSampleStudent();
List<Student> studentList= new ArrayList<Student>();
for(int i = 0; i < 5; i++) {
student.setId(getRandomId());
studentList.add(student);
}
我想用不同的ID将学生添加到studentList。我无法创建for循环学生,因为创建学生需要很长时间。我发现有一个克隆方法但是Student对象有很多字段(大多数字段引用另一个对象)。有什么想法吗?
答案 0 :(得分:0)
我只是告诉你一个令人毛骨悚然的方法来复制对象,你不能在生产代码中使用它,但我认为它会起作用。你可以使用Sun的后门Unsafe。您需要做的就是获取不安全的实例:
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
忽略您的IDE,它会警告您访问限制,但如果您运行此代码,一切都会正常工作。如果错误很烦人,请忽略首选项中的错误。在此之后,您可以在低级别内存复制上复制对象。
private static long normalize(int value) {
if(value >= 0) return value;
return (~0L >>> 32) & value;
}
public static long sizeOf(Object object){
return getUnsafe().getAddress(
normalize(getUnsafe().getInt(object, 4L)) + 12L);
}
private static long toAddress(Object obj) {
Object[] array = new Object[] {obj};
long baseOffset = getUnsafe().arrayBaseOffset(Object[].class);
return normalize(getUnsafe().getInt(array, baseOffset));
}
private static Object fromAddress(long address) {
Object[] array = new Object[] {null};
long baseOffset = getUnsafe().arrayBaseOffset(Object[].class);
getUnsafe().putLong(array, baseOffset, address);
return array[0];
}
static Object shallowCopy(Object obj) {
long size = sizeOf(obj);
long start = toAddress(obj);
long address = getUnsafe().allocateMemory(size);
getUnsafe().copyMemory(start, address, size);
return fromAddress(address);
}
毕竟你可以在你的for循环中调用这个结构:
Student student = createSampleStudent();
List<Student> studentList= new ArrayList<Student>();
for(int i = 0; i < 5; i++) {
student = MyUnsafeUtil.shallowCopy(student);
student.setId(getRandomId());
studentList.add(student);
}
请记住,这在java中是一个非常糟糕和黑暗的魔法。