Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中不断增长的原语数组_Java_Arrays - Fatal编程技术网

java中不断增长的原语数组

java中不断增长的原语数组,java,arrays,Java,Arrays,我正在学习Android,同时提高我的效率。我正在编写一个密码生成器,它根据使用特定规则选择的一组字符生成随机密码。我有一个数组,我计划在其中存储字符。数组以X的大小开始,X是所有情况下可能的字符数。然后,我向数组中添加多达三倍的额外字符集。由于我无法调整数组的大小,因此每次我都必须使用复制循环或ArrayCopy或类似工具复制并重新创建更大的数组 我应该这样做还是切换到例如ArrayList?当然,在现实生活中也不会有问题,因为总共大约有70个字符,但我对它作为一种实践感兴趣 谢谢大家 伪代码

我正在学习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在原语和对象包装器之间不会有太大的区别,这就是为什么会有一个实例池