我有一个应用程序,在View的onDraw()方法中我需要在屏幕上绘制几个浮点数。 为了避免垃圾收集,我试图摆脱这种方法中的所有分配。问题是我想在屏幕上绘制具有指定小数位数的浮点数,如果没有String.format()并且根本没有使用字符串,我找不到任何信息。即使没有字符串和内存分配,从float到char []的简单转换似乎也是一个问题。
所以问题是如何管理这个问题?
P.S。在onDraw()方法之前无法提前转换它们,因为在用户触摸事件期间可以更改数字(例如滚动)。
答案 0 :(得分:2)
实现自己的格式化程序。以下是简化格式化程序的示例。
它从末尾填充缓冲区并返回起始索引。如果float对于缓冲区来说太大,它将失败ArrayIndexOutOfBoundsException
,并且它不会处理负值,无穷大和NaN。我会把它留给你。
如果您需要从头开始填充缓冲区,只需使用System.arraycopy()
移动字符。
如您所见,唯一的分配是char
缓冲区。
public static int format(char[] buffer, float value, int decimals) {
float v = value;
for (int i = 0; i < decimals; i++)
v *= 10f;
int num = Math.round(v);
int idx = buffer.length;
for (int i = 0; i < decimals; i++, num /= 10)
buffer[--idx] = (char) ('0' + num % 10);
if (decimals > 0)
buffer[--idx] = '.';
do {
buffer[--idx] = (char) ('0' + num % 10);
} while ((num /= 10) != 0);
return idx;
}
测试
char[] buffer = new char[10];
int startIdx = format(buffer, (float)Math.PI, 4);
for (int i = startIdx; i < buffer.length; i++)
System.out.print(buffer[i]);
System.out.println();
输出
3.1416