is using Any as collection type consume less memory than using concrete type?
suppose
val list1 = listOf<Any>("ABC", "DEF", "GHI", "JKL", "MNO")
val list2 = listOf<String>("ABC", "DEF", "GHI", "JKL", "MNO")
i wonder if list1
consume less memory than list2
since String
type allocates memory to store its properties (e.g size
)
So, is it better to use list1
if i dont use any String
type function?
EDIT
what if i want to use other type in the collection?
list = listOf<Any>("ABC", 123, 12.34)
is it more efficient than
list = listOf<String>("ABC", "123", "12.34")
EDIT 2
thanks to @João Dias and @gidds
as @gidds says :
the list does not directly contain String objects, or Any objects — it contains references.
And a String reference is exactly the same size as an Any reference or a reference of any other type.
So, The List<String>
and List<Any>
are the exactly the same because of the Type Erasure --which pointed out by @João Dias-- with a difference of compile-time & runtime type
but, does it mean that
val list1 = listOf<Any>("ABC", "DEF", "GHI")
and
val list2 = listOf<String>("ABC", "DEF", "GHI")
is consuming the same memory as
val list3 = listOf<List<List<List<String>>>>(
listOf(listOf(ListOf("ABC"))),
listOf(listOf(ListOf("DEF"))),
listOf(listOf(ListOf("GHI")))
)
AFAIK, String
is basically collections of Char
. A String
contains a reference to the Char
. And since everything is an object in Kotlin, then every Char
inside the String
should contain a reference to the value in the heap, am i correct up to here?
if thats the case, doesnt it make sense that List<String>
consume more memory than List<Any>
because List<String>
is having more than 1 reference.