9

如果我有一个类需要返回一个可变维度的字符串数组(并且该维度只能在运行该类的某些方法时确定),我如何在我的类的构造函数中声明动态数组?

如果问题不够清楚,

在 php 中,我们可以简单地声明一个字符串数组,$my_string_array = array(); 并通过$my_string_array[] = "New value";

那么上面的代码在java中是什么等价的呢?

4

4 回答 4

13

您将要查看java.util package,特别是ArrayList类。它有方法,例如.add() .remove() .indexof() .contains() .toArray(),等等。

于 2010-09-07T08:07:18.577 回答
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 关联数组的行为,所以这不足为奇。

于 2010-09-07T08:44:36.127 回答
6

List而是创建一个。

List<String> l = new LinkedList<String>();
l.add("foo");
l.add("bar");
于 2010-09-07T08:05:23.117 回答
1

java中没有动态数组,数组的长度是固定的。类似的结构是ArrayList,在其底层实现了一个真正的数组。见名称Array List :)

于 2010-09-07T08:21:09.080 回答