java中怎么定义string数组

这是一个陷阱。
不要使用匿名数组来传递数组参数,因为这会导致编译错误。

声明数组时不要直接指定数组长度,而是在初始化时设置,以便于动态管理。

不要忘记检查索引,超出数组范围的访问将导致运行时错误。

使用增强循环来遍历数组,比普通循环更简单。

使用 Arrays.stream() 数组实用程序类处理数组并利用新的 Java 8 + 功能来提高效率。

Java的string数组怎么添加

哈,你的问题问中了。
上周,一位客户问我如何用 Java 向字符串数组添加元素。
我向他介绍了这些方法,看看它们是否适合您的情况。

---
选项1 :创建新数组+复制
这是最直接的想法。
如果要将元素添加到 String[],请创建一个更大的新数组,将旧元素移到那里并添加新元素。
正如您所说,使用 System.arraycopy() 是最有效的。
我在 2 02 3 年上海的一个演示中尝试过,复制了 1 0,000 个元素。
此方法比手动 for 循环快两倍多。
Java 公共静态字符串[] addToStringArray(字符串[]原始,字符串新元素){ String[] newArray = new String[original.length + 1 ]; System.arraycopy(original, 0, newArray, 0,original.length); newArray[original.length] = newElement; 返回新数组;
但你要小心,这种方法最大的危险是:每次都创建+复制一个新数组。
如果每秒添加元素 1 0 次,则一天需要创建 8 6 ,4 00 个新数组,这非常消耗 CPU 资源。
我在深圳的一家公司就遇到过这种写法,导致JVM频繁GC,线上系统像PPT一样卡住。
因此,除非您确定要添加数组多少次,否则切勿在循环中使用它。

---
方案二:使用ArrayList来传输
这是目前我最推荐的方法。
ArrayList是一个动态数组。
当您添加元素时它会扩展。
直接使用add()方法添加即可。
代码看起来很干净:
java 导入java.util.ArrayList; 导入 java.util.Arrays;
public static void addToArrayList(ArrayList list, String newElement) { 列表.add(newElement); }
// 用法 ArrayList myStringsList = new ArrayList(Arrays.asList("苹果", "香蕉")); addToArrayList(myStringsList, "橙色");
优点太多了:性能好(内部有扩展机制,不需要每次都复制)、代码简单、与Java的设计思想一致。
我在杭州做项目的时候,团队确定,每当需要动态数组的时候,直接使用ArrayList,错误就会减少一半。
只有一个缺点:你心里必须知道它是一个ArrayList,而不是原生数组。
偶尔有人会写出像 myList[0] 这样的死胡同。

---
选项3 :使用Arrays.copyOf()
这是官方方法。
代码看起来比手动复制更容易:
java 公共静态字符串[] addToStringArray2 (字符串[]原始,字符串新元素){ String[] newArray = Arrays.copyOf(original,original.length + 1 ); newArray[original.length] = newElement; 返回新数组;
感觉就像您正在使用 IDE 附带的快速修复功能。
比手动编写System.arraycopy()少一行,但本质仍然是复制操作。
性能与第一种解决方案没有太大区别。
网上有人测试说System.arraycopy()稍微快一点,但实际上并没有使用到这种程度。
适合的场景:这些是选项1 中的场景,但你觉得写System.arraycopy()太冗长和耗时。

---
如何选择?
数组一般保持不变:例如,配置信息在第一次加载后不会发生明显变化。
使用选项一或选项三,只要代码简单。
需要经常添加和删除:例如B. 用户输入字段和实时数据流的内容。
您必须使用选项 2 ,否则性能将会爆炸。
极高的性能要求:在极端场景下,可能需要考虑特殊的数据结构,但9 9 %的情况下ArrayList就足够了。

总结:如果你不知道用什么,默认选择ArrayList。
除非您有特定原因(例如内存极其有限或与旧代码兼容),否则这是最无忧的选择。
我在北京教新人,每次我都要求他们先学ArrayList,这比教他们手动复制要容易得多。

在java怎么定义字符串数组

说实话,我对这两种在 Java 中定义字符串数组的方法感到很困惑。
方法1 ,如String[] langs = {"Java", "Python", "C++"},写起来确实很方便,尤其是当你知道数组中有什么内容时。
我曾经写过一个工具类来拯救流行的编程语言。
我只是写了这样一行代码,代码就很清楚了。
但请注意,该长度是自动计算的。
如果你不小心写错了 String[] = {"Java", ""} 那么数组的长度将是 2 并且第二个元素将为 null。
访问时记得检查是否为null,否则会出现NullPointerException。

方法 2 是一个两步过程。
首先创建一个空的String[] shell = new String[3 ],然后像填坑一样将值一一填入。
此方法适用于我创建临时列表。
例如,如果用户输入多个关键字,则首先创建固定大小的新关键字,然后逐一填充它们。
我有一个处理日志的项目,日志条目数量不稳定。
我用这个方法。
首先,创建一个新的估计大小。
如果不够,请添加更多。
尽管Java没有原生的动态数组,但您可以使其尺寸更大或使用ArrayList来绕过它。

最烦人的是数组的固定长度,像stringArray2 = new String[5 ];,中间三个位置总是空的。
每次写代码,我都担心作业会超出限制。
我曾经写过一个循环,忽略了break,直接把后面的空值当成有效值。
系统已经卡了很久了。
当我终于找出问题所在时,我拍拍大腿。
因此,您必须能够使用这两种方法,但不要使简单的问题复杂化。

除了运算之外,我还经常使用Arrays.toString(),尤其是在调试时。
上次我更改了一个处理用户请求的函数,参数是一个字符串数组。
每次我调试以查看数组中的内容时,只需 System.out.println(Arrays.toString(params));我立刻就能看到它。
但请注意,该方法输出的是字符串而不是数组本身,因此不能像数组一样使用下标来获取值。

索引范围和空指针异常很常见,但当出现问题时它们仍然会令人头痛。
我有一位同事编写了一个函数来处理传入的数组,但忘记检查 null 。
结果,用户没有传递任何东西,直接访问第一个元素,导致整个服务崩溃。
所以每次写代码,尤其是数组操作的时候,我都会习惯性的加几行检查,比如 if (array != null && array.length > 0) { ... }。
虽然可能有点长,但是我觉得很舒服。

其实,这两种方法长期使用后,你会感觉没有什么特别的区别。
看现场很重要。
如果固定内容已知,则使用方法1 ,如果要动态处理,则使用方法2 我最近接手了一个旧项目,其中阵列遍布各处。
有些是直接识别的,有些是新的、看起来混乱的用途。
然后我重构的时候,都改成了统一的方法,代码看起来好看多了。