关于JAVA中的字符串的比较
### 关于JAVA中的字符串的比较 在Java编程语言中,字符串是极其常用的数据类型之一,其内部实现与操作方式对于程序的性能与正确性有着重要影响。本文将深入探讨Java中字符串的比较方法,帮助读者更好地理解不同情况下应选择哪种方式进行字符串比较。 ### 字符串的比较方式 #### 使用`==`进行比较 `==`操作符通常用于比较两个对象的引用是否相等。当应用于字符串时,它检查两个字符串变量是否指向内存中同一块地址空间。例如: ```java String str1 = "java"; String str2 = "java"; System.out.print(str1 == str2); // 输出 true ``` 在这个例子中,由于`str1`和`str2`都直接赋值为"java",JVM会确保它们指向同一个字符串常量池中的对象,因此使用`==`进行比较返回`true`。 #### 使用`new`关键字创建字符串 当使用`new`关键字创建字符串对象时,即使字符串内容相同,它们也被视为不同的对象,并存储在堆中不同的位置。这意味着即使两个字符串具有相同的字符序列,使用`==`进行比较也会返回`false`。 ```java String str1 = new String("java"); String str2 = new String("java"); System.out.print(str1 == str2); // 输出 false ``` 这里,尽管`str1`和`str2`包含相同的字符序列,但由于它们是由`new`创建的不同对象,因此`==`比较返回`false`。 #### 字符串拼接与比较 字符串拼接操作会创建一个新的字符串对象,这可能会影响使用`==`进行比较的结果。 ```java String str1 = "java"; String str2 = "blog"; String s = str1 + str2; System.out.print(s == "javablog"); // 输出 false ``` 在这种情况下,尽管`s`的值与"javablog"相同,但由于`s`是在运行时通过字符串拼接动态创建的新对象,因此`==`比较返回`false`。 #### 使用`intern()`方法 `intern()`方法可以将一个字符串添加到字符串常量池中,如果该字符串已经存在于池中,则返回池中已存在的字符串的引用。这使得通过`==`比较两个字符串成为可能,只要它们之前被`intern()`过。 ```java String s1 = "java"; String s2 = new String("java"); System.out.print(s1.intern() == s2.intern()); // 输出 true ``` 这里,`s1`直接从字符串常量池获取,而`s2`虽然是通过`new`创建的,但通过调用`intern()`将其放入了字符串常量池,从而使得`==`比较返回`true`。 #### 使用`equals()`方法 `equals()`方法用于比较两个字符串的内容是否相同,无论它们的引用是否相等。 ```java String str1 = "java"; String str2 = new String("java"); System.out.print(str1.equals(str2)); // 输出 true ``` 在这个例子中,虽然`str1`和`str2`指向不同的对象,但由于它们的字符序列完全相同,因此`equals()`比较返回`true`。 ### 总结 - 当需要比较两个字符串变量是否指向同一个对象时,应使用`==`。 - 若要比较两个字符串的内容是否相同,应使用`equals()`方法。 - 对于通过`new`创建的字符串,若希望使用`==`进行比较,可以先调用`intern()`方法确保它们位于字符串常量池中。 - 字符串拼接会创建新对象,应避免使用`==`进行比较,而应采用`equals()`方法。 通过理解这些概念,开发者可以更准确地处理Java中的字符串比较问题,从而编写出更加高效、可靠的代码。















字符串是引用个数据类型。使用==比较的是引用地址,使用equals比较的是内容。
例子A:
String str1 = "java";
String str2 = "java";
System.out.print(str1==str2);
地球上有点Java基础的人都知道会输出false,因为==比较的是引用,equals比较的是内容。不是我忽悠大家,你们可以在自己的机子上运行一 下,结果是true!原因很简单,String对象被放进常量池里了,再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了 “java”对象,它认为自己节省了内存开销。不难理解吧 呵呵
例子B:
String str1 = new String("java");
String str2 = new String("java");
System.out.print(str1==str2);
看过上例的都学聪明了,这次肯定会输出true!很不幸,JVM并没有这么做,结果是false。原因很简单,例子A中那种声明的方式确实是在 String常量池创建“java”对象,但是一旦看到new关键字,JVM会在堆中为String分配空间。两者声明方式貌合神离,这也是我把“如何创 建字符串对象”放到后面来讲的原因。大家要沉住气,还有一个例子。
例子C:
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
再看这个例子,很多同志不敢妄言是true还是false了吧。爱玩脑筋急转弯的人会说是false吧……恭喜你,你会抢答了!把那个“吧”字去掉你就完全正确。原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道(我们当然一眼就看穿了,可是Java必须在运行时才知道的,人脑和电脑的结构不同),也就是说str1+str2是在堆里创建的, s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。
例子D:
String s1 = "java";
String s2 = new String("java");
System.out.print(s1.intern()==s2.intern());
intern()是什么东东?反正结果是true。如果没用过这个方法,而且训练有素的程序员会去看JDK文档了。简单点说就是用intern()方法就 可以用“==”比较字符串的内容了。在我看到intern()方法到底有什么用之前,我认为它太多余了。其实我写的这一条也很多余,intern()方法 还存在诸多的问题,如效率、实现上的不统一……
例子E:
String str1 = "java";
String str2 = new String("java");
System.out.print(str1.equals(str2));
无论在常量池还是堆中的对象,用equals()方法比较的就是内容,就这么简单!


- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- PLC舞台灯光设计方案.doc
- 学生信息管理系统-C语言课程方案设计书.doc
- 实验六教学板自检程序设计方案.doc
- 基于单片机大屏幕显示研究设计.doc
- web协同商务系统研究与原型开发.doc
- 钢结构CAD软件STS的功能及应用.docx
- 嵌入式单片机PPP协议的应用研究.doc
- 公路造价师考试辅导:流动资金扩大指标估算法试题.docx
- 用于预测性维护与健康管理的大型语言模型(故障诊断大模型;剩余使用寿命预测大模型)
- 2017年软件实施工程师笔试面试题及答案.docx
- 住宅小区海康网络监控系统方案.doc
- 结合电气工程及其自动化剖析机器人设计.docx
- 《信息系统分析与设计》第3章:通信与计算机网络.ppt
- Python编程作图物理仿真项目进阶设计.docx
- 基于区块链技术的电子轮机日志系统.docx
- 基于51单片机用LCD1602显示的DS18B20课程设计-键控上下限报警功能.doc


