Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String和BigInteger的内存效率_Java - Fatal编程技术网

Java String和BigInteger的内存效率

Java String和BigInteger的内存效率,java,Java,我有一个哈希表,它将元组映射到如下初始化的字符串: HashMap<Tuple,String> marks = new HashMap<Tuple,String>(); 我的问题是,如果我必须将许多大字符串SUP映射到30个字符,这会占用大量内存,因为我看到一个字符串需要36+4*个字符字节的内存。尽管这些字符串只能包含2个字符:h和t。因此我想我可以使用0和1来代替h和t,而不是存储字符串,而是某种类型的整数。我发现对于19位以上的数字,我无法处理基元类型,我唯一的解

我有一个哈希表,它将元组映射到如下初始化的字符串:

HashMap<Tuple,String> marks = new HashMap<Tuple,String>();
我的问题是,如果我必须将许多大字符串SUP映射到30个字符,这会占用大量内存,因为我看到一个字符串需要36+4*个字符字节的内存。尽管这些字符串只能包含2个字符:h和t。因此我想我可以使用0和1来代替h和t,而不是存储字符串,而是某种类型的整数。我发现对于19位以上的数字,我无法处理基元类型,我唯一的解决方案是BigInteger对象类型。 我想问的是:BigInteger会比String更节省内存吗? 如果不是,我可以用不同的方式表示字符串以减少内存使用量吗


另外,字符串只包含h和t,因此一个字符串可能是hhhttthhh。我可以将其表示为h3t5h4,其中3,5,4是我看到某个字符的连续时间,但许多字符串可能是hhhtht。。如果内存使用是您唯一关心的问题,那么java.util.BitSet是存储0和1序列的非常有效的方法。请注意这是一个CPU消耗开销。

大多数人不会认为30个字符是非常大的。多少是多少?如果您真的希望尽可能高效地打包数据,那么自然的方式将是二进制数字0和1,而不是十进制数字“0”和“1”。每个int或Integer中有32个可用,每个long或long中有64个可用。如果用true表示“h”,用false表示“t”,并使用布尔值[],则内存效率会更高。这样更好吗?因为我了解到空位集需要48个字节。这是有争议的。new BitSet.size返回64,但它们是位而不是字节。如果您检查新的位集实例,您将看到一个单元素长数组,它是64位大小的来源。然而,除了非常小的数组外,事实证明,位集比布尔值数组的内存效率更高。在您提到的问题中,您需要映射许多大型字符串,因此这就是我推荐位集的原因。