Android运行时数组大小效率

Android运行时数组大小效率,android,arrays,performance,initialization,runtime,Android,Arrays,Performance,Initialization,Runtime,我的潮汐预测应用程序使用8个双数组进行潮汐高度计算。实际上,美国的每个潮汐站都需要37个元素,除了阿拉斯加州的安克雷奇需要124个元素 下面是一个声明示例 final int NUM_C = 37; //all stations except anchorage use 37 //final int NUM_C = 124; //anchorage uses 124 double a[] = new double[NUM_C + 1]; 我能否在应用程序启动时有效地指定阵列大小?我可以决

我的潮汐预测应用程序使用8个双数组进行潮汐高度计算。实际上,美国的每个潮汐站都需要37个元素,除了阿拉斯加州的安克雷奇需要124个元素

下面是一个声明示例

final int NUM_C = 37;   //all stations except anchorage use 37
//final int NUM_C = 124;  //anchorage uses 124
double a[] = new double[NUM_C + 1];

我能否在应用程序启动时有效地指定阵列大小?我可以决定需要哪一个。我不想让99%以上的用户在处理这一案例时效率低下,从而加重应用程序的负担。差异仅为3K字节。

为什么不在构造函数中实例化变量?它使您可以更自由地进行编程操作

public class Station {

    double a[];

    public Station(String location) {
        if(location.equals("Anchorage")) {
            a = new double[124];
        } else {
            a = new double[37];
        }
    }
}
据我所知,构造函数中对象字段的实例化是正常情况,而带有声明的实例化只是Java的一个附加功能

至于速度,如果通过文字值、常量或变量指定大小,则不会产生任何差异。更有趣的问题是,是否应该使用
ArrayList
而不是数组

公共类电台{
ArrayList a;
公共电台(字符串位置){
if(位置等于(“锚地”)){
a=新阵列列表(124);
}否则{
a=新阵列列表(37);
}
}
}

我的选择是
ArrayList
,因为它更灵活。8乘以124无论如何也不是一个很大的数字。没有理由为此担心性能。

是的。您只需提供应用程序的用户来选择状态,然后选择初始化双数组所需的常量。我想我还没有理解你的问题。因为我确实理解这个问题,它很容易解决。因为我不想通过使用变量而不是常量来调整数组的大小,从而使数组的访问速度变慢。我不知道它是否会。我没有很好地解释我的问题。我的应用程序按照用户的指示加载状态信息。但这8个数组仍保持在主类顶部声明的状态。很少需要124个条目。如果我在新语句中使用了true变量,那么在第一次运行后,如果我将新语句中的数组大小从37更改为124,会发生什么情况。或者125回37。谢谢。Blcknx,如果我在新语句中使用一个变量,而不是在我的主体中使用常量NUM_C,并且如果我根据新的电台选择更改它,那么内存使用是如何管理的。如果每次访问都必须按限制进行测试,那将是一场灾难。似乎ArrayList天生就比较慢。我需要多次访问这些阵列。我认为应该只接受124数组中额外的2784字节,并保持简单。在新语句中,您设置了数组使用的内存大小。如果这个尺寸来自于一个常数或任何东西,对尺寸或速度没有影响。创建阵列后,将不再使用该值。这取决于是否为所有工作站重复使用一个阵列,或者是否为每个工作站创建新阵列。在第一种情况下,应将大小设置为最大值。在第二种情况下,您应该将大小设置为适当的值。我有一些生物信息学的背景。我告诉你2784字节算不了什么。今天,内存以GB为单位。2784字节小于0.000003 GB。如果您同时创建数百万个站点,您会遇到麻烦。如果您多次访问阵列,我也更喜欢
array
而不是
ArrayList
。根据我的经验,避免每次访问的方法调用链可能更重要。循环通常比方法递归更快。虽然我喜欢将代码分成小方法,但对于重复数千次的方法,我避免了这种情况,因为每个方法调用都有代价。毫无疑问,我会运行一个测试设置来测量是否存在真正的差异。编译器进行了大量的优化。
public class Station {

    ArrayList<Double> a;

    public Station(String location) {
        if(location.equals("Anchorage")) {
            a = new ArrayList<>(124);
        } else {
            a = new ArrayList<>(37);
        }
    }
}