如何在Java中初始化动态数组?

9
如果我有一个类需要返回可变维度的字符串数组(该维度只能在运行类的某个方法时确定),那么我如何在类的构造函数中声明动态数组?
如果问题不够清晰,
在php中,我们可以简单地声明一个字符串数组为$my_string_array = array();并通过$my_string_array[] = "New value";添加元素。
那么上面的代码在Java中等效于什么?
4个回答

13
你会想要查看 java.util 包,特别是 ArrayList 类。它有诸如 .add() .remove() .indexof() .contains() .toArray() 等方法,还有更多。

1
准确来说,它在 java.util 中(与所有其他集合类一起)。java.util.Collections(大写 C)是一个实用程序类,而不是一个包。 - Péter Török
作为后续问题,是否也可以创建字符串索引 [例如:$my_string_array ["property"]]? - lock
1
@lock 你应该研究一下Java中的Map接口和HashMap类,以创建关联数组的等价物(带有字符串索引的数组)。HashMap可以拥有任何类型的对象作为键(索引)。如果你需要保持插入顺序,或者能够使用整数位置索引,请查看LinkedHashMap类。 - Tom Neyland

7
普通的Java数组(即String[] strings)无法动态调整大小;当你的空间不够但仍想向数组中添加元素时,你需要创建一个更大的数组,并将现有数组复制到其前n个位置。
幸运的是,有一些java.util.List实现可以为您完成此工作。 java.util.ArrayListjava.util.Vector都使用数组实现。
但是,如果字符串恰好存储在数组中,您真的在意吗?还是只需要一个集合,让您可以随意添加项目而不必担心空间不足?如果是后者,则可以选择其中任何几个通用的List实现。大多数情况下可以选择以下选项:
  • ArrayList - 基本的基于数组的实现,未同步
  • Vector - 同步的,基于数组的实现
  • LinkedList - 双向链表实现,在列表中插入项目更快
您是否预计列表将具有重复项?如果对于您的用例,重复项永远不应存在,则应首选java.util.Set。集合保证不包含重复项。一个很好的通用集合实现是java.util.HashSet回答后续问题 要使用类似于$my_string_array["property"]的索引访问字符串,您需要将它们放入一个Map<String,String>中,也在java.util包中。一个很好的通用映射实现是HashMap
一旦创建了您的映射,
  • 使用map.put("key", "string")添加字符串
  • 使用map.get("key")按其键访问字符串。
请注意,java.util.Map不能包含重复的键。如果您连续使用相同的键调用put,则仅保留最新调用中设置的值,之前的值将丢失。但我猜这也是PHP关联数组的行为,所以这不应该是一个惊喜。

6
创建一个 List
List<String> l = new LinkedList<String>();
l.add("foo");
l.add("bar");

3
对于大多数用例,数组列表(array list)是更好的选择,但这就是为什么声明变量时使用接口而不是类总是很好的选择(这样很容易更改底层实现)。 - Tom Neyland

1
Java中没有动态数组,数组的长度是固定的。 类似结构是ArrayList,它在其下面实现了真正的数组。 看一下它的名字ArrayList :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接