jdk1.7与jdk1.8中String.split()方法的坑

本文探讨了在不同版本的Java中使用split方法处理空字符串模式时的差异,揭示了在JDK1.7和JDK1.8中,相同代码执行结果的不同,指出这一差异可能导致的索引越界风险。

在书写代码的过程中,遇到了split切割字符串的坑,会有索引越界的风险。

在jdk1.8中

public static void main(String[] args) {
    String card = "abcdefgh";
    System.out.println(card.split("").length);
}

结果:8

在jdk1.7中,同样的代码

public static void main(String[] args) {
    String card = "abcdefgh";
    System.out.println(card.split("").length);
}

结果:9

 

<think>我们要解决用户的问题:在安装JDK 1.7后,使用`java -version`查询到的版本却是Java 11。原因通常系统环境变量设置有关,导致系统优先使用了已安装的其他版本(特别是Java 11)的Java。 根据引用[1]中提到的现象:环境变量`PATH`中有一条`C:\Program Files (x86)\Common Files\Oracle\Java\javapath`的路径,它会自动跑到最上面,从而覆盖其他设置。尽管这个引用是针对Windows的,但我们可以推测在Linux系统下也可能有类似的环境变量优先级问题。 另外,引用[2]和[3]提供了Linux下安装和管理JDK版本的方法,包括使用yum安装指定版本和卸载旧版本。 因此,我们可以分析可能的原因: 1. 系统中已经安装了多个JDK(包括JDK 11),并且环境变量`PATH`的设置导致了系统优先使用了JDK 11的路径。 2. 在安装JDK 1.7之前或之后,可能安装过JDK 11,并且其路径被设置在环境变量中,且位置在JDK 1.7的路径之前。 3. 可能使用了替代系统(如Linux中的`alternatives`)设置了默认的Java版本。 解决方案: 1. 检查环境变量`PATH`,确保JDK 1.7的路径在JDK 11的路径之前。 2. 在Linux中,使用`update-alternatives`来管理多个Java版本,并设置默认版本为JDK 1.7。 3. 如果不需要JDK 11,可以将其卸载,然后重新配置环境变量。 具体步骤(以Linux为例): 步骤1:检查当前系统中安装的Java版本及其路径 执行以下命令查看系统中所有Java安装路径: $ sudo update-alternatives --config java 如果这个命令没有列出所有安装的Java,可以尝试: $ which java $ ls -l /usr/bin/java $ ls -l /etc/alternatives/java 步骤2:使用`update-alternatives`设置默认Java版本 如果已经安装了多个JDK,可以使用以下命令切换: $ sudo update-alternatives --config java 然后根据提示选择JDK 1.7对应的序号。 步骤3:手动调整环境变量 如果系统中没有使用`alternatives`,或者想通过环境变量控制,可以编辑用户环境变量配置文件(如`~/.bashrc`或`~/.profile`)或系统环境变量配置文件(如`/etc/profile`): $ sudo vim /etc/profile 在文件末尾,确保JDK 1.7的路径设置在JDK 11的路径之前,例如: export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80 # 替换为实际的JDK 1.7安装路径 export PATH=$JAVA_HOME/bin:$PATH 然后使配置生效: $ source /etc/profile 步骤4:检查是否生效 $ java -version 步骤5:如果步骤3中调整环境变量后仍然不行,可能是因为在`/etc/profile.d/`目录下有其他脚本设置了Java环境变量。检查`/etc/profile.d/`目录下是否有关于Java的脚本,并调整其顺序或内容。 步骤6:卸载不需要的JDK(可选,如JDK 11) 根据引用[3]的方法卸载JDK 11,但注意卸载前确保不会影响其他应用程序。 对于Windows系统,可以参考引用[1]的思路: 1. 检查环境变量`PATH`,将JDK 1.7的路径(如`C:\jdk1.7.0\bin`)移动到`C:\Program Files (x86)\Common Files\Oracle\Java\javapath`这一条之前(或删除该条目,因为它指向了JDK 8,但用户现在是JDK 11的问题,所以可能是类似的公共路径指向了JDK11)。 2. 或者,删除公共路径条目,然后确保JDK 1.7的路径在环境变量`PATH`中靠前。 注意:在Windows中,环境变量`PATH`中的条目顺序决定了优先级。 总结原因:系统中有多个JDK版本,环境变量设置导致系统优先使用了JDK 11而不是JDK 1.7。 根据上述分析和步骤,我们可以为用户提供详细的解答。 </think>### 安装 JDK 1.7 后显示 Java 11 的原因及解决方案 #### **问题原因** 1. **环境变量优先级错位** 系统`PATH`变量中存在更高优先级路径指向 Java 11,如: - Windows:`C:\Program Files (x86)\Common Files\Oracle\Java\javapath`(自动置顶) - Linux:`/usr/bin/java`被链接到 Java 11 的路径 即使正确设置 `JAVA_HOME` 为 JDK 1.7,系统仍优先执行路径靠前的 Java 11[^1]。 2. **多版本共存干扰** - 系统中已存在 Java 11 且注册到系统级路径(如 Linux 的 `alternatives` 系统) - JDK 1.7 安装后未正确更新系统默认 Java 链接[^2][^3]。 3. **安装过程未清除旧版本** JDK 11 残留文件未被卸载,导致环境变量冲突[^3]。 --- #### **解决方案** ##### **Windows 系统** 1. **调整 `PATH` 变量优先级** - 打开 `控制面板 > 系统 > 高级系统设置 > 环境变量` - 在 `系统变量` 中找到 `PATH`,将 `%JAVA_HOME%\bin` **上移**至 `C:\Program Files (x86)\Common Files\Oracle\javapath` 之上 - 或直接删除 `javapath` 条目(需卸载公共 JRE)[^1]。 ```powershell # 验证路径优先级 $env:Path -split ';' | Select-String 'java' ``` 2. **清理残留 JDK** - 卸载所有非必要的 Java 版本(控制面板 → 程序功能) - 删除残留目录:`C:\Program Files\Java\jdk-11.x.x` ##### **Linux 系统** 1. **重置默认 Java 版本** ```bash # 查看所有已安装JDK路径 sudo update-alternatives --config java # 选择JDK 1.7对应的序号 ``` 2. **手动覆盖系统链接** ```bash sudo rm /usr/bin/java # 移除旧链接 sudo ln -s /path/to/jdk1.7/bin/java /usr/bin/java # 新建正确链接 ``` 3. **清除 Java 11 残留** ```bash # 卸载JDK 11(以OpenJDK为例) sudo yum remove java-11-openjdk.x86_64 # CentOS/RHEL sudo apt purge openjdk-11-jdk # Ubuntu/Debian ``` 4. **验证环境变量** 编辑 `~/.bashrc` 或 `/etc/profile`,确保: ```bash export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80 # 替换为实际路径 export PATH=$JAVA_HOME/bin:$PATH ``` 执行 `source ~/.bashrc` 生效后运行 `java -version` 检查。 --- #### **关键操作验证** ```bash # 检查当前生效的Java路径(所有系统通用) which java # 显示实际调用路径 ls -l $(which java) # 查看链接指向的真正二进制文件 ``` 若输出非 JDK 1.7 路径(如 `/usr/lib/jvm/java-11-openjdk`),说明配置未生效。 --- ### 相关问题 1. **如何在 Linux 中同时保留多个 JDK 版本并快速切换?** 2. **Windows 系统彻底卸载 Java 的正确步骤是什么?** 3. **为什么修改 `JAVA_HOME` 后 `java -version` 仍显示旧版本?** 4. **如何避免新安装的 JDK 覆盖系统默认 Java 路径?** [^1]: 环境变量路径优先级错误导致版本冲突 [^2]: 多版本共存时未正确配置系统链接 [^3]: 旧版本残留文件未彻底清除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值