It depends on your data and usage. If you want only to store data than the most efficient way is to use array for integers or floats(or any other plain old data) and string pools for strings.
If you need to index data, search by key for example, than one of the most efficient data-structures in terms of size is tries. It's doesn't matter what key type do you use - integer, float or string, trie can be used to create index. Integer or any other keys can be represented as binary strings and inserted into trie. There is plenty of different trie data-structures, that use some kind of compaction to store data more efficiently, for example - Array Mapped Trie. You can also add some compression at lowest level, for example using base 128 coding with integers, or Golomb coding.