2010-08-16 124 views
1

对于需要24位无符号数据类型的应用程序。 不幸的是,这种数据类型在Java中不可用。我打算将它作为一个新类来实现。但我不确定这样的实现的性能。Java中的自定义数据类型

建议写我自己的班级吗?

如果这是可取的,是否有可能取得良好的表现?

+4

这些会在你的应用程序在任何一个时间有多少活跃?除非你正在谈论数百万的数量,否则最好使用一个整数并且每个数据“浪费”8位,而不是试图优化你不需要的地方。 – 2010-08-16 05:17:49

+0

@Anon,+1。如果这是一个答案,我肯定会赞成。 – aioobe 2010-08-16 05:19:59

+0

非常感谢。我正在为简单的桌面搜索引擎编写索引器。所以使用24位无符号整数而不是32位整数我希望我能够节省一些空间。 – 2010-08-16 05:32:11

回答

3

如果你想节省空间,你可以使用int的caluclation和映射中的最小显著3个到字节[],或只是三个字节:

public static byte[] convert(int i) { 
    return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) }; 
    } 

    public static int convert(byte[] b) { 
    if (b == null && b.length != 3) 
     throw new IllegalArgumentException(); 

     return (b[2] << 16) | (b[1] << 8) | b; 
    } 

(无法验证它是否是错误免费但至少它应该给一个想法)

+0

+1谢谢,这似乎是我的问题的一个很好的解决方案。还让我问一个小问题。为了表示数字的实际值,我们不能使用byte [] value = new byte [3]等字节数组而不是int数据类型。 – 2010-08-16 06:48:05

+0

根据'int'计算索引值比在'byte []'上执行要容易得多。我会离开基于计算的'int',并将索引转换为一个数组(或三个字节)来保存它们。你可以将byte []'包装到Integer24Bit类中,但不会节省空间。 – 2010-08-16 07:08:10

+0

请注意,通过为每个值存储一个字节[3],您不会节省任何空间,因为每个数组都有自己的开销。你想把所有的整数存储在一个大字节[]中,并且有一些计算每个字节开始位置的方法(如果每个字节只有3个字节,它可以是数组[index%3])。 – Avi 2010-08-16 08:17:44

4

据推测,你的意思是实现它作为使用较大的数据类型和边界检查,像这样一类:

public class Unsigned24 { 
    private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1; 
    private static final MIN_UNSIGNED24 = 0; 

    private final int value; 

    public Unsigned24(int value) { 
     if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24) 
      throw new IllegalArgumentException("value out of bounds: " + value); 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 

// ... other methods, such as equals(), comparison, addition, subtraction, etc. 
} 

这会工作,但可能不值得麻烦。而且,它并不仅仅需要24位内存,而是32加上对象的开销。

这真的取决于你的目标。为什么你想要一个24位整数。

仅仅是因为你对值有限制吗?如果是这样,你可能想要做类似上面的事情。

是因为你有很多它们,并且想要节省内存吗?如果是这样,您可能需要构建一些抽象24位整数数组的类,并在内部将它们连续保存在一个字节数组中。

是因为您正在接口的硬件或网络接口,正好有24位?在这种情况下,您可能需要查看java.nio类。

+0

艾维的权利。除非你绝对需要边界检查,否则只需使用int即可。 – LandonSchropp 2010-08-16 05:21:40

+0

Math.pow(2,24) - 1 == 0xffffff – aioobe 2010-08-16 05:22:25

+0

谢谢Avi。我正在为简单的桌面搜索引擎编写索引器。所以使用24位无符号整数而不是32位整数我希望我能够节省一些空间。因此,我认为你的第二个选项(字节数组)可能更适合我的场景。 – 2010-08-16 05:35:35