On the very high level, I know that we need to “wrap” the primitive data types, such as int and char, by using their respective wrapper classes to use them within Java collections.I would like to understand how Java collections work at the low level by asking:”why do we need to wrap primitive data types as objects to be able to use them in collections?”I thank you in advance for your help.
Share
At the virtual machine level, it’s because primitive types are represented very differently in memory compared to reference types like java.lang.Object and its derived types. Primitive int in Java for example is just 4 bytes in memory, whereas an Object takes up at minimum 8 bytes by itself, plus another 4 bytes for referencing it. Such design is a simple reflection of the fact that CPUs can treat primitive types much more efficiently.
So one answer to your question “why wrapper types are needed” is because of performance improvement that it enables.
But for programmers, such distinction adds some undesirable cognitive overhead (e.g., can’t use int and float in collections.) In fact, it’s quite possible to do a language design by hiding that distinction — many scripting languages do this, and CLR does that. Starting 1.5, Java does that, too. This is achieved by letting the compiler silently insert necessary conversion between primitive representation and Object representation (which is commonly referred to as boxing/unboxing.)
So another answer to your question is, “no, we don’t need it”, because the compiler does that automatically for you, and to certain extent you can forget what’s going on behind the scene.