Java: зачем нужны классы-обертки? - PullRequest
29 голосов
/ 25 января 2010

На очень высоком уровне я знаю, что нам нужно "обернуть" примитивные типы данных, такие как int и char, используя их соответствующие классы-обертки, чтобы использовать их в коллекциях Java. Я хотел бы понять, как коллекции Java работать на низком уровне, спрашивая: «Зачем нам нужно оборачивать примитивные типы данных в объекты, чтобы иметь возможность использовать их в коллекциях?» Заранее благодарю за помощь.

Ответы [ 12 ]

0 голосов
/ 09 июня 2014

Если известно, что переменная либо содержит конкретную битовую комбинацию, представляющую null, либо информацию, которая может использоваться для определения местоположения заголовка объекта виртуальной машины Java, и если метод чтения заголовка объекта, которому дана ссылка, будет по своей сути перехватывать если задан битовый шаблон, связанный с null, то JVM может получить доступ к объекту, идентифицированному переменной, в предположении, что он есть. Если переменная может содержать что-то, что не является допустимой ссылкой, но не является специфическим битовым шаблоном null, любой код, который пытается использовать эту переменную, должен сначала проверить, идентифицировал ли он объект. Это сильно замедлит работу JVM.

Если Object получено из Anything, а объекты класса получены из Object, но примитивы унаследованы от другого класса, полученного из Anything, то в 64-битной реализации было бы целесообразно сказать, что о 3/4 возможных битовых комбинаций будут представлять double значения ниже 2 ^ 512, 1/8 из них будут представлять long значения в диапазоне +/- 1 152 921 504 606 846 975, несколько миллиардов представляют любое возможное значение любого другого примитива и 1/256 для идентификации объектов. Многие виды операций над объектами типа Anything будут выполняться медленнее, чем с типом Object, но такие операции не будут ужасно частыми; большая часть кода заканчивает приведением Anything к более конкретному типу, прежде чем пытаться работать с ним; фактический тип, сохраненный в Anything, должен быть проверен перед приведением, но не после того, как было выполнено приведение. Без различия между переменной, содержащей ссылку на тип кучи, однако, в отличие от переменной, содержащей «что-либо», невозможно было бы избежать увеличения накладных расходов значительно дальше, чем было бы или должно быть в противном случае.

0 голосов
/ 12 сентября 2013

Классы Wrapper предоставляют полезные методы, связанные с соответствующими типами данных, которые вы можете использовать в некоторых случаях.

Один простой пример.Подумайте об этом,

Integer x=new Integer(10); 
//to get the byte value of 10
x.byteValue(); 

//but you can't do this,
int x=10;
x.byteValue(); //Wrong!

Вы можете получить очко?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...