java中数组不支持子串查找,因“子串”属string概念;字符串数组中查找含指定子串的元素需遍历并用contains()或indexof(),或用stream filter;单个字符串中找所有子串位置需手动滑动窗口。

Java 中数组本身不直接支持“子串”查找,因为子串(substring)是字符串(String)的概念;数组(如 int[]、String[])存储的是元素,不是字符序列。所以准确来说:你要找的不是“数组中的子串”,而是以下两种常见情况之一:
如果你处理的是字符串数组(String[]),想找出所有包含某子串的元素
这是最常被误称为“数组中找子串”的场景:遍历字符串数组,对每个字符串调用 contains() 或 indexOf() 判断是否含指定子串。
- 用
stream()+filter()收集匹配项(推荐,简洁):
String target = "world";
List
.filter(s -> s != null && s.contains(target))
.collect(Collectors.toList());
// 结果:["hello world", "world cup"]
- 传统 for 循环(兼容老版本,逻辑清晰):
for (String s : arr) {
if (s != null && s.indexOf(target) != -1) {
result.add(s);
}
}
如果你实际想在单个字符串中查找所有匹配的子串(含重叠、起始位置等)
这才是真正的“子串查找”。例如在 "abababa" 中找所有 "aba" 的出现位置(包括重叠的)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 手动滑动窗口(控制重叠与边界):
String pattern = "aba";
List
for (int i = 0; i if (text.substring(i, i + pattern.length()).equals(pattern)) {
indices.add(i); // 记录起始索引
}
}
// indices = [0, 2, 4]
- 使用正则表达式(适合复杂模式,但默认不重叠;需手动控制):
Pattern p = Pattern.compile("(?=" + Pattern.quote(pattern) + ")");
Matcher m = p.matcher(text);
while (m.find()) {
indices.add(m.start());
}
如果你指的是字节数组或字符数组中查找字节/字符序列(类似子串语义)
比如在 byte[] 或 char[] 中找连续匹配的片段,可自己实现 KMP 或朴素匹配。
- 朴素匹配(短序列够用,易懂):
List
if (pattern.length == 0 || data.length for (int i = 0; i boolean match = true;
for (int j = 0; j if (data[i + j] != pattern[j]) {
match = false;
break;
}
}
if (match) res.add(i);
}
return res;
}
关键提醒:别混淆概念
数组没有子串 —— 子串只属于字符串;数组有子数组(subarray),即连续元素组成的片段。如果你本意是“查找所有等于某目标数组的子数组”,那属于二维匹配问题,需按元素逐个比对,逻辑类似上面的 byte[] 匹配,只是泛型换成 Object[] 或具体类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










