Недавно я узнал, как создавать несколько ссылок на один и тот же изменяемый объект в Java, который я использую в составном списке моего создания. Мой вопрос: удваиваю ли я использование памяти или просто использую дополнительный int в качестве адреса памяти? Вот код, к которому я специально обращаюсь:
//This is my object containing a 64bit long
public class LongWrapper
{
long data;
LongWrapper(int data_in)
{
data = data_in;
}
public long getData()
{
return data;
}
public void setData(long data_in)
{
data = data_in;
}
}
//This is my driver program containing references a & b
public class PointerTest
{
public static void main(String[] args)
{
LongWrapper a = new LongWrapper(6);
LongWrapper b = a;
System.out.println("a = " + a.getData() + " b = " + b.getData());
a.setData(7);
System.out.println("a = " + a.getData() + " b = " + b.getData());
}
}
This is my output:
a = 6 b = 6
a = 7 b = 7
Таким образом, в этом случае то, что я думаю, происходит в памяти, состоит в том, что у меня есть 2 ссылки, которые являются 32-битными адресами памяти, и один объект, содержащий мои 64-битные длины; это точно?
Я прошу, потому что я хочу использовать гораздо большие объекты, и это позволит мне иметь их в нескольких списках, в то же время минимизируя использование моей памяти.
Таким образом, в этом случае то, что я думаю, происходит в памяти, состоит в том, что у меня есть 2 ссылки, которые являются 32-битными адресами памяти, и один объект, содержащий мои 64-битные длины; это точно?
У вас есть один объект и две ссылки a
и b
для ссылки на этот объект. Этот объект имеет длинные data
.
Вы можете изменить/запросить состояние этого объекта, используя как ссылки a
и b
.
Ты прав. Однако, если ваш код работает в 64-битной архитектуре, ссылки составляют 64 бита вместо 32 бит.
Вы определенно не удваиваете использование вашей памяти. вы можете создать столько ссылок, сколько хотите, указывая на один и тот же объект. Ссылки помещаются в стек и один объект в куче. Объект занимает больше места, чем 64 бит, потому что это только память, выделенная для его поля
long data
, так как у вас есть один объект.