java中不断增长的原语数组
我正在学习Android,同时提高我的效率。我正在编写一个密码生成器,它根据使用特定规则选择的一组字符生成随机密码。我有一个数组,我计划在其中存储字符。数组以X的大小开始,X是所有情况下可能的字符数。然后,我向数组中添加多达三倍的额外字符集。由于我无法调整数组的大小,因此每次我都必须使用复制循环或ArrayCopy或类似工具复制并重新创建更大的数组 我应该这样做还是切换到例如ArrayList?当然,在现实生活中也不会有问题,因为总共大约有70个字符,但我对它作为一种实践感兴趣 谢谢大家 伪代码:java中不断增长的原语数组,java,arrays,Java,Arrays,我正在学习Android,同时提高我的效率。我正在编写一个密码生成器,它根据使用特定规则选择的一组字符生成随机密码。我有一个数组,我计划在其中存储字符。数组以X的大小开始,X是所有情况下可能的字符数。然后,我向数组中添加多达三倍的额外字符集。由于我无法调整数组的大小,因此每次我都必须使用复制循环或ArrayCopy或类似工具复制并重新创建更大的数组 我应该这样做还是切换到例如ArrayList?当然,在现实生活中也不会有问题,因为总共大约有70个字符,但我对它作为一种实践感兴趣 谢谢大家 伪代码
initialize array
add first set
if adding second set
add second set
if adding third set
add third set
if adding fourth set
add fourth set
return array
切换到前面提到的集合,因为它将比创建新数组和复制每次插入的值(如果使用数组,则必须执行此操作)效率更高,因为正如您所指出的,数组在创建时是静态大小的 ArrayList Javadoc部分说 列表接口的可调整大小的数组实现。实现所有可选的列表操作,并允许所有元素,包括null。除了实现列表接口外,此类还提供了一些方法来操作内部用于存储列表的数组的大小
使用ArrayList而不是基元数组,然后当ArrayList中的所有值都将增长时,可以将其转换为基元数组,如下所示:
List<Character> l = new ArrayList<Character>();
...
l.toArray();
您可以使用ArrayList,因为在添加或删除项目时它会自动调整大小
import java.util.*;
public class ArrayListDemo {
public static void main(String args[]) {
// create an array list
ArrayList al = new ArrayList();
System.out.println("Initial size of al: " + al.size());
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
al.add(1, "A2");
System.out.println("Size of al after additions: " + al.size());
// display the array list
System.out.println("Contents of al: " + al);
// Remove elements from the array list
al.remove("F");
al.remove(2);
System.out.println("Size of al after deletions: " + al.size());
System.out.println("Contents of al: " + al);
}
}
从中获得的示例我很少使用数组-只有当我知道大小是恒定的并且需要按索引获取项目时。通常,不同类型的列表更适合日常任务。您所做的与ArrayList的内部工作类似,因此我建议只使用ArrayList。您所描述的正是ArrayList的内部工作。ArrayList具有初始大小的String[]属性。在添加元素之前,ArrayList会测试是否还有其他对象的空间,如果没有,它会创建一个较大的字符串[],如size+20,并将内容从原始数组复制到新数组。因此,您可以选择使用可用的代码或重新创建代码。大小如何?ArrayList不接受原语,对吗?如果我理解正确的话,物体总是比原语大。部分数组和类似的ArrayList之间的大小差异是什么?您不需要在Java中管理内存,而且您将获得的大多数原始包装器类型都使用实例缓存池。您不需要在Java中管理内存-我怀疑很多Java开发人员都会采取这种态度。这也是错误的。您的实践会对程序的内存使用产生巨大影响;大多数时候你不必手动删除对象,但肯定会有内存泄漏。@MichaelMyers当然,实现选择会影响内存使用,也许我的评论有点含糊不清。不管怎样,为原语使用对象包装器类型是一个非常小的内存开销。而且,如果它是真正关键的代码,而内存使用是真正关键的,那么OP应该寻找它。但是,我希望现代JVM在原语和对象包装器之间不会有太大的区别,这就是为什么会有一个实例池