While he worded it poorly, he is correct. Kinda. In a skip list with millions of items, you're going to have something like n log(n) SkipListObjects. The references are virtually free. The objects are not.
On a typical JVM implementation, each object takes ~100 bytes. IIRC even an empty ArrayList will cost you something like 60-80 bytes.
If the extra log(n) of space complexity is going to make a difference, then a skip list might not make sense.
But honestly, if you've got millions of objects, you might want to consider a different language/environment. Java is pretty fast these days, but it will still chew up considerably more memory than most native solutions.
The factor isn't log(n), it is a constant. Depending on the implementation, that constant is generally 2. (That's because each level is half the size of the previous. So n + n/2 + n/4 + ... = 2n.)
That said, I could well believe that the constant associated with a SkipList is worse than the constants with other data structures. What works well in C++ does not always translate directly to other languages.
The alternative would be some sort of tree. The obvious choice, some sort of balanced binary search tree, also has two pointers per item, though half of them don't point to anything.
On a typical JVM implementation, each object takes ~100 bytes. IIRC even an empty ArrayList will cost you something like 60-80 bytes.
If the extra log(n) of space complexity is going to make a difference, then a skip list might not make sense.
But honestly, if you've got millions of objects, you might want to consider a different language/environment. Java is pretty fast these days, but it will still chew up considerably more memory than most native solutions.