Java 怎么把字符串转成大写或小写?附 2 种方法讲清楚

编程狮(w3cschool.cn) 2026-08-18 14:10:10 浏览数 (39)
反馈

Java 字符串大小写封面

你从输入框、文件或接口拿到的字符串,大小写往往不统一——用户姓名的拼音、搜索关键词、验证码,常常混着大小写,直接比对你就会得到 false。最常用也最省事的做法是:Java 字符串的大小写转换用 toUpperCase 把字母全变大写、用 toLowerCase 全变小写,两者都会返回一个新字符串,原字符串不会被改动。掌握这两个方法,你就能在做校验、去重、排序前先把文本统一。今天这篇文章,编程狮就把 Java 字符串转大小写的写法一次讲透,帮你避开"改了却没生效"的典型坑,不再被大小写不一致的脏数据绊住。在登录账号、搜索匹配、数据清洗这些场景里,统一大小写几乎天天见;而 Java 字符串不可变,调用方法后必须接住返回值,不然转换就白做了。

一、先搞清楚:转大小写改的是"副本"

Java 字符串有一个根本特性:它是不可变的。也就是说,任何对字符串的"修改"都不会改变原来的对象,而是生成一个全新的字符串返回给你。转大小写正是如此——toUpperCase 和 toLowerCase 都不动原串,只把新串作为返回值交出来。

理解这点至关重要:Java 字符串不可变意味着你写 name.toUpperCase() 时,name 本身不会变。如果你不把结果接住,这次转换就像没发生过。这是新手写转换时最容易踩的坑,后面会专门讲。

💡 小提示:统一大小写通常是"比对前"的预处理步骤。先转成同一种大小写,再去 equals,才能避免 "Abc" 和 "abc" 被判成不相等。

1.1 一个常见误解

有人以为 toUpperCase 会"原地改掉"原字符串,这是把 Java 和其他可变语言搞混了。在 Java 里,凡是返回 String 的方法,几乎都是在给你一个新对象。

二、方法一:toUpperCase 转大写

toUpperCase 把字符串里所有小写字母变成大写,非字母字符原样保留。它不需要参数,直接调用即可。

String name = "hello World";
String upper = name.toUpperCase();
System.out.println(upper);   // HELLO WORLD
System.out.println(name);    // hello World(原串没变)

上面这段里,name.toUpperCase() 生成了全大写的 "HELLO WORLD" 并赋给 upper,而原来的 name 依旧是 "hello World"。这正是 Java 字符串不可变的体现:原串纹丝不动,新串单独存在。

在实际项目里,toUpperCase 最常见的落点有两个:一是把用户输入统一成大写再做比对或落库,比如订单号、证件号这类"不区分大小写"的字段先规整掉;二是把展示用的文本转成全大写,像日志级别 INFO、WARN 这种约定俗成的写法。无论哪种,本质都是"先拿到新串、再使用新串",原串始终不动。这也解释了为什么你经常看到 String upper = name.toUpperCase(); 这种接住返回值的写法——它不是多余的仪式,而是 Java 字符串不可变逼出来的必要动作。把这点想通,你就不会再疑惑"为什么我转了大小写却没生效"。

如果你处理过别的字符串操作,之前那篇 Java 字符串转数字 也强调了"方法返回新值、要接住",和这里的思路完全一致。

三、方法二:toLowerCase 转小写

toLowerCase 与 toUpperCase 正好相反,把全部大写字母变成小写,同样返回新字符串、不改原串。

String code = "ABC-123";
String lower = code.toLowerCase();
System.out.println(lower);   // abc-123
System.out.println(code);    // ABC-123(原串没变)

上面这段里,code.toLowerCase() 得到 "abc-123" 赋给 lower,原 code 仍然是 "ABC-123"。在做验证码比对、邮箱归一化时,toLowerCase 非常常用——先把用户输入和正确答案都转成小写,再比较,就能忽略大小写差异。

💡 小提示:验证码、邮箱这类"大小写不敏感"的字段,标准做法就是双方都 toLowerCase 或都 toUpperCase 后再比对,而不是逐字符判断。

四、实战:先统一大小写再比对,以及 locale 坑

最常见用法是在 equals 之前先归一等大小写,避免 "Admin" 和 "admin" 被当成两个不同值。

String input = "Admin";
String target = "admin";
boolean ok = input.toLowerCase().equals(target.toLowerCase());
System.out.println(ok);   // true

上面这段里,input 和 target 各自先 toLowerCase,再比较,结果是 true。这正是登录、搜索去重时的标准写法。

关于"是否包含某段文字"的判断,Java 子串判断 讲过 contains 和 indexOf,配合大小写统一,你就能做"不区分大小写的包含判断"。

还有一个容易被忽略的点:toUpperCase/toLowerCase 默认按运行环境的语言区域处理。像土耳其语里的小写 i 转大写会得到不同于英文的字符。涉及多语言时,建议显式传 Locale.ROOTLocale.ENGLISH,保证结果可预期。

五、两个高频坑

坑一:调用了却没接返回值。name.toUpperCase(); 然后继续用 name,发现没变——因为结果被丢了。正确是 name = name.toUpperCase(); 或接给新变量。这是 Java 字符串不可变带来的"最经典遗忘"。

坑二:拿大小写转换做敏感信息加密。 它只是格式处理,不是加密,任何人都看得出来原文,绝不能用于密码保护。

⚠️ 注意:在循环或批量清洗里反复 toLowerCase/toUpperCase 会产生大量临时字符串,虽不影响正确,但高频场景可考虑缓存结果,减少无谓的对象创建。

Java 字符串大小写转换不可变示意

总结

Java 字符串的大小写转换,核心是记住"返回新串、原串不变":toUpperCase 全变大写、toLowerCase 全变小写,二者都不改原对象,必须接住返回值。日常做登录校验、搜索匹配、数据清洗时,先统一大小写再比对,是最稳的写法。请记住最关键的一点——Java 字符串不可变,转换后务必接住结果,否则改动等于没发生。把这条刻进习惯,你处理文本时就不会再被"改了却没生效"困住。

常见问题

Q:为什么我调用 toUpperCase 后原字符串没变?
A:因为 Java 字符串不可变,toUpperCase 返回的是新字符串,原串不会被改动。你必须把结果接住,比如写成 s = s.toUpperCase(); 或赋给新变量,否则这次转换就丢了。

Q:怎么忽略大小写比较两个字符串?
A:把两边都转成同一种大小写再 equals,例如 a.toLowerCase().equals(b.toLowerCase())。验证码、邮箱这类大小写不敏感的字段都应这么处理。

Q:toUpperCase 和 toLowerCase 有什么要注意的坑?
A:一是必须接返回值,否则改动无效;二是它们默认按系统语言区域处理,涉及多语言(如土耳其语)可能出现意外字符,建议显式传 Locale.ENGLISH 或 Locale.ROOT。

延伸学习

想把 Java 基础打牢,可以按这个顺序来:

  1. 先过一遍 Java 教程,把字符串、数组这些基础类型铺平;
  2. 具体方法和类记不住时,Java 速查手册 能随时翻查;
  3. 想跟着视频边看边练,Java 入门课 是循序渐进的形式,适合巩固上手。

0 人点赞