Java 字符串怎么比较
在日常写代码时,你是不是常碰到两个内容看起来一模一样的字符串,程序却偏偏判断不相等的情况?比如想比较两个用户输入的手机号、两个商品的名称,结果明明都是“13800138000”,程序却返回了“不相等”。这不是代码写错了,而是你没搞懂Java里字符串比较的核心逻辑。
先搞懂两个基础:“值”和“存的位置”
要弄明白Java字符串怎么比,得先分清两个关键的东西:字符串本身的内容,和内容存在哪儿。你可以把字符串比作写在纸条上的名字,“张三”是纸条上的实际内容;而每一张纸条,都会被放在书架的不同格子里,每个格子都有一个专属编号——这个编号,就是Java里说的“内存地址”。

平时写代码时,常用两种方式创建字符串:一种是直接写String name = "张三";,另一种是用new String("张三");。前者会先去“公共书架”找有没有“张三”这张纸条,有就直接拿格子号,没有就放一张新的;后者会不管有没有,直接在“私人书架”开个新格子放纸条,不管内容是不是重复。
最常用的两种比较方式,别搞混
搞懂了“内容”和“地址”,就能分清两种常用的比较方法了。
第一种是==,它只认“格子编号”——也就是两个字符串的内存地址是否一样。举个生活化的例子:你在公共书架拿了一张“张三”的纸条(String a = "张三";),同事也从公共书架拿了同一张(String b = "张三";),这时候a == b,因为他俩拿的是同一张纸条,格子号一样。但如果是你自己在私人书架做了一张“张三”的纸条(String c = new String("张三");),那a == c就会返回false,因为a在公共书架的格子,c在私人书架的格子,编号不一样,虽然纸条内容都是“张三”,但==不管内容。
第二种是equals(),它才认纸条上的实际内容。还是刚才的例子,不管是公共书架的“张三”a,还是私人书架的“张三”c,只要内容一样,a.equals(c)就会返回true,这才是我们平时要的“两个字符串内容是否一样”的判断。
小心“坑”:字符串常量池的小陷阱
刚才提到的“公共书架”,其实叫Java的字符串常量池,是专门用来存重复字符串内容的地方,目的是省内存——避免反复创建相同内容的纸条。但有时候你会碰到看起来内容一样,==却返回false的情况,比如两个字符串都是从外部获取的,比如用户输入、或者从数据库读出来的。举个例子:从输入框拿到的两个“张三”,String input1 = scanner.nextLine(); String input2 = scanner.nextLine();,这时候input1 == input2可能是false,因为输入的内容是后来才放进常量池的,两个input的格子号不一样,哪怕内容相同。但input1.equals(input2)永远是对的,因为它只比内容。
实际开发里的正确姿势
日常写代码,比如判断用户输入的密码是否和预设的一致、判断商品名称是否匹配,永远用equals()来比内容,别用==。如果怕碰到null的情况(比如用户没输入内容,变量是null),可以用Objects.equals(),它会先检查有没有null,不会报错,更稳妥。
总结一下:Java字符串比较,核心是区分“内容”和“内存地址”,要比内容就用equals(),别乱用==,避开字符串常量池的小陷阱,就能少写很多踩坑的代码。