2013-09-26 2 views
1

У меня есть arraylist, и я хочу добавить некоторые объекты с небольшими изменениями в этот arraylist.Как добавить клон объекта java в список

Это мой код;

Student student = createSampleStudent(); 
List<Student> studentList= new ArrayList<Student>(); 

for(int i = 0; i < 5; i++) { 
    student.setId(getRandomId()); 
    studentList.add(student); 
} 

Я хочу, чтобы добавить студентов к studentList с различными ids.I не может создать студента в течение цикла, поскольку она занимает слишком много времени, чтобы создать студента. Я обнаружил, что существует метод clone, но объект Student имеет много полей (большинство из них относится к другому объекту). Есть идея?

+0

Клонировать является опасным методом, используйте с осторожностью. В любом случае, я не верю, что это будет быстрее, чем создание новых студентов в цикле (это правильная вещь) –

+0

p.s. почему в имени богов это занимает много времени, чтобы создать студента ?! Что происходит внутри студента? –

+0

@RichardTingle запущены некоторые методы webservice. Речь идет не о моем коде, а занимает около 30 секунд. Поэтому я не хочу каждый раз создавать Студент. – hellzone

ответ

0

Я просто скажу вам жуткий метод копирования объекта, вы не должны использовать его в производственном коде, но я думаю, что это будет работа. Вы можете использовать Unsafe, backdoor. Все, что вам нужно сделать, это получить небезопасный экземпляр:

Field f = Unsafe.class.getDeclaredField("theUnsafe"); 
f.setAccessible(true); 
Unsafe unsafe = (Unsafe) f.get(null); 

Ignore вашего 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); 
} 

В конце концов, вы можете просто позвонить в ваш цикл этой конструкции:

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.

Смежные вопросы