Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.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 使用LRU缓存时避免字符串分配_Java_Android_String_Caching_Stringbuffer - Fatal编程技术网

Java 使用LRU缓存时避免字符串分配

Java 使用LRU缓存时避免字符串分配,java,android,string,caching,stringbuffer,Java,Android,String,Caching,Stringbuffer,我使用LRU和磁盘缓存在内存和磁盘上缓存一些图像。 以前我用过 private LruCache<String, Bitmap> mMemoryCache; 私有LruCache-mMemoryCache; 为了保存图像,但当我观看分配堆栈时,我看到了很多字符串分配,这对我来说很清楚,因为每次我使用mMemoryCache.get(cs)它将分配一个新的字符串对象 在我绘制每个位图的过程中,我需要使用缓存,每帧大约50-100次,这将导致大量GC,因为活动字符串很短 我如何防止这

我使用LRU和磁盘缓存在内存和磁盘上缓存一些图像。 以前我用过

private LruCache<String, Bitmap> mMemoryCache;
私有LruCache-mMemoryCache;
为了保存图像,但当我观看分配堆栈时,我看到了很多字符串分配,这对我来说很清楚,因为每次我使用
mMemoryCache.get(cs)它将分配一个新的字符串对象

在我绘制每个位图的过程中,我需要使用缓存,每帧大约50-100次,这将导致大量GC,因为活动字符串很短

我如何防止这种情况发生?

我看了关于如何防止字符串分配的其他问题,比如,我使用David的解决方案来显示调试FPS,但我不能将其用于这个特殊的缓存版本

我将每个图像分割成100x100个瓷砖, 我的缓存键将如下所示
pageNumber with Count heightcount zoomfactor

我尝试使用
StringBuffer
,但这不起作用,因为
toString()
将分配一个新的
String
,我需要比较内容。
我可以尝试使用带有000的int/float来替换“-”,甚至可以在我的缓存类中使用char[]数组,但最好的方法是什么呢?

为什么不使用整数作为缓存键并按如下方式计算它(假设zoomfactor也<100):


这仍将分配对象,但Integer.valueOf已经为其中一些对象提供了缓存,并且对象将更小。自动装箱还将使用Integer.valueOf(它不会为小数字创建新实例),只需避免使用new Integer()。

为什么不使用整数作为缓存键并按如下方式计算它(假设zoomfactor也<100):int-keyInt=((pageNumber*100+withcount)*100)+heightcount 100+zoomfactor;整数key=Integer.valueOf(keyInt);这仍然会分配对象,但Integer.valueOf已经为其中一些对象提供了缓存,并且对象将更小。这是我下一步尝试的方法,根据给定的数字获取数字。这看起来也不错,它将减少GC启动的频率。我认为这是一个很好的方法,但有一个问题:为什么我们还要将int再次转换为带有valueOf的int?你说是因为内部缓存?实际上Java在隐式转换中自动装箱时会自动调用valueOf()。我只是想指出,不应该使用new Integer()将“int”转换为“Integer”。感谢您,到目前为止,这比我想象的要容易。。。我现在使用的公式与稀疏数组略有不同,到目前为止我没有任何问题。如果你不介意的话,你可以回答这个问题,然后我就结束这个问题。谢谢
int keyInt = (((pageNumber * 100 + withcount) * 100) + 
              heightcount) * 100 + zoomfactor;
Integer key = Integer.valueOf(keyInt);