Java 如何将int和boolean成对存储

Java 如何将int和boolean成对存储,java,memory-management,primitive-types,Java,Memory Management,Primitive Types,我们在几个类中有许多属性,这些属性目前是int和boolean。int是值,如果已设置该int,则布尔值为true 我们需要这种配对,因为我们表示的对象具有多个属性级别,如果没有在一个级别设置,它将使用上面级别的设置。这种方法允许我们在每个级别记录其值是什么,以及它是在该级别设置的还是继承的 它工作得很好。然而,我们最终可以得到100000个这样的物体。这需要大量的内存,大量的垃圾收集,等等。所以,我们有什么办法可以做得更好吗。我们研究了以枚举作为索引的int和boolean数组。但这感觉真的很

我们在几个类中有许多属性,这些属性目前是int和boolean。int是值,如果已设置该int,则布尔值为true

我们需要这种配对,因为我们表示的对象具有多个属性级别,如果没有在一个级别设置,它将使用上面级别的设置。这种方法允许我们在每个级别记录其值是什么,以及它是在该级别设置的还是继承的

它工作得很好。然而,我们最终可以得到100000个这样的物体。这需要大量的内存,大量的垃圾收集,等等。所以,我们有什么办法可以做得更好吗。我们研究了以枚举作为索引的int和boolean数组。但这感觉真的很尴尬,这通常意味着有更多的机会出错(比如引入bug)

有什么建议吗


谢谢-dave

如果您没有使用
int
的完整范围,您可以使用像
Integer.MIN\u值或
-1
这样的魔法值来表示“未设置”


例如String的
indexOf()
方法,如果未找到匹配项,该方法将返回
-1

如果未使用
int
的完整范围,则可以使用像
Integer.MIN\u value
-1
这样的魔法值来表示“未设置”


例如String的
indexOf()
方法,如果没有找到匹配项,它将返回
-1

2个可能性

  • 使用
    Integer
    对象并使用
    null
    引用指定尚未设置该值
  • 如果
    int
    s值范围没有覆盖整个范围,您可以选择一个类似
    Integer.MIN\u int
    的值来指定尚未设置该值

2个可能性浮现在脑海中

  • 使用
    Integer
    对象并使用
    null
    引用指定尚未设置该值
  • 如果
    int
    s值范围没有覆盖整个范围,您可以选择一个类似
    Integer.MIN\u int
    的值来指定尚未设置该值

整数是正数且有序的吗(或者,如果不有序,它们不会上升到巨大的值)?i、 e.1,2,3,4…9999 100000


如果是这样,您可以使用。

整数是否为正且有序(或者,如果不是有序的,它们不会上升到巨大的值)?i、 e.1,2,3,4…9999 100000


如果是这样的话,您可以使用。

这里的大多数答案已经涵盖了我最初的建议,但是如果这只是垃圾收集器压力的问题,并且没有太多内存占用,并且您确实需要32位整数的完整范围,那么您可以使用相同的位掩蔽技巧,而不是长时间

您将拥有一个实用程序类,其函数如下

long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }

这里的大多数答案已经涵盖了我最初的建议,但是如果这只是垃圾收集器压力的问题,而不是太多的内存占用,并且您确实需要32位整数的完整范围,那么您可以使用相同的位掩蔽技巧,改为使用长时间

您将拥有一个实用程序类,其函数如下

long setIntValue(int i) { return 0xFFFF0000 | i; }
int getIntValue(long l) { return (int)(0xFFFF & l); }
boolean isIntValueSet(long l) { return (0xFFFF0000 & l) != 0; }

你可以上一节课

public class Tuple<X,Y>{
    private final X x;
    private final Y y;

    public Tuple(X x,Y y){
        this.x=x;
        this.y=y;
    }

    public X getX(){
        return x;
    }

    public Y getY(){
        return y;
    }

}
公共类元组{
私人决赛X X;
私人决赛;
公共元组(X,Y){
这个.x=x;
这个。y=y;
}
公共X getX(){
返回x;
}
公共场所{
返回y;
}
}

您可以创建一个touple类

public class Tuple<X,Y>{
    private final X x;
    private final Y y;

    public Tuple(X x,Y y){
        this.x=x;
        this.y=y;
    }

    public X getX(){
        return x;
    }

    public Y getY(){
        return y;
    }

}
公共类元组{
私人决赛X X;
私人决赛;
公共元组(X,Y){
这个.x=x;
这个。y=y;
}
公共X getX(){
返回x;
}
公共场所{
返回y;
}
}

一个包含100K元素的int[]和boolean[]将使用大约500K的内存(是两个对象)

您也可以使用
int
值来存储标志。但如果这不是一个选项,您可以使用
long
,它可以存储所有可能的int和boolean值


您可以使用像
int[]
long[]
这样的集合,甚至可以使用
int[]
boolean[]
这样的集合,也就是说,将数据存储在基于列的结构中,而不是基于行的结构中。

具有100K个元素的int[]和boolean[]将使用大约500K内存(并且是两个对象)

您也可以使用
int
值来存储标志。但如果这不是一个选项,您可以使用
long
,它可以存储所有可能的int和boolean值


您可以使用像
int[]
long[]
这样的集合,甚至可以使用
int[]
boolean[]
这样的集合,即将数据存储在基于列而不是基于行的结构中。

只需使用apache.commons.lang。您这样做没有任何事实证明这些对确实导致了性能/内存问题。

只需使用apache.commons.lang。您这样做没有任何事实证明这些对确实造成了性能/内存问题。

您可以使用整数(如果未设置,则可能为空)?您不能仅使用整数而不是int?100000个对象听起来不算太多。总内存占用量是多少?它既包括占用内存的大量对象,也包括垃圾收集过程中的处理过程,因为这些对象往往会存在一段中间的时间。您可以使用整数(如果未设置,则可能为null)?您不能只使用整数而不使用int?100000个对象听起来不算太多。总内存占用量是多少?它既包括占用内存的大量对象,也包括垃圾收集过程中的处理,因为这些对象的生存时间一般为中等长度。我们首先从这种方法开始。但是我们发现我们需要在每个级别上都有值(当它是“set”一级时从父级设置),所以int值是设置好的,我们不能使用幻数