java学习:字符串比较“==”与“equals”的差异及与c#的区别

.net中,其字符串特有的驻留机制,保证了在同一进程中,相同字符序列的字符串,只有一个实例,这样能避免相同内容的字符串重复实例化,以减少性能开销。

先来回顾一下c#中的代码:

 1         public static void testString()
 2         {
 3             String s = "Abc";
 4             String s1 = "abc";
 5             String s2 = "abc";
 6 
 7 
 8             Console.WriteLine("s1==s2 ? " + (s1 == s2)); //true
 9             Console.WriteLine("s1.Equals(s2) ? " + s1.Equals(s2)); //true
10             Console.WriteLine("String.Compare(s1,s,true) ? " + String.Compare(s1, s, true)); //0
11             Console.WriteLine("------------------------");
12 
13 
14             char[] chr = { 'a', 'b', 'c' };
15             String s3 = new String(chr);
16             Console.WriteLine("s1==s3 ? " + (s1 == s3)); //true
17             Console.WriteLine("s1.equals(s3) ? " + s1.Equals(s3)); //true
18             Console.WriteLine("String.Compare(s3, s, true) ? " + String.Compare(s3, s, true)); //0
19             Console.WriteLine("------------------------");
20 
21             String t = "bc";
22             String s4 = "a" + t;
23             Console.WriteLine("s1==s4 ? " + (s1 == s4)); //true
24             Console.WriteLine("s1.equals(s4) ? " + s1.Equals(s4)); //true
25             Console.WriteLine("String.Compare(s4, s, true) ? " + String.Compare(s4, s, true)); //0
26             Console.WriteLine("------------------------");
27 
28             String s5 = "a" + "bc";
29             Console.WriteLine("s1==s5 ? " + (s1 == s5)); //true
30             Console.WriteLine("s1.equals(s5) ? " + s1.Equals(s5)); //true
31             Console.WriteLine("String.Compare(s5, s, true) ? " + String.Compare(s5, s, true)); //0
32 
33 
34             Console.Read();
35 
36 
37         }

从运行结果可以看出,无论你怎么折腾,只要二个字符串的内容完全相同,引用始终只有一个。

java中其实也有类似的机制,称为“字符串常量池”,但是java中却允许 用new String(String str)的方式创建多个相同内容的实例。为了能区别这二种情况,java中的==与equals用来判断字符串是否相等时,赋予了不同的含义。

==用于判定二个字符串是否引用相同,而equals用于判断二个字符串是否内容相同

 1 public static void testString(){
 2         String s = "Abc";
 3         String s1 = "abc";
 4         String s2 = "abc";
 5         
 6         System.out.println("s1==s2 ? " + (s1==s2)); //true
 7         System.out.println("s1.equals(s2) ? " + s1.equals(s2)); //true
 8         System.out.println("s1.equalsIgnoreCase(s) ? " + s1.equalsIgnoreCase(s)); //true
 9         System.out.println("------------------------");
10         
11         String s3 = new String("abc"); 
12         System.out.println("s1==s3 ? " + (s1==s3)); //false
13         System.out.println("s1.equals(s3) ? " + s1.equals(s3)); //true    
14         System.out.println("s3.equalsIgnoreCase(s) ? " + s3.equalsIgnoreCase(s)); //true
15         System.out.println("------------------------");
16         
17         char[] chr ={'a','b','c'};
18         String s4 = new String(chr);
19         System.out.println("s1==s4 ? " + (s1==s4)); //false
20         System.out.println("s1.equals(s4) ? " + s1.equals(s4)); //true
21         System.out.println("s4.equalsIgnoreCase(s) ? " + s4.equalsIgnoreCase(s)); //true
22         System.out.println("------------------------");
23         
24         String t ="bc";
25         String s5 = "a" + t;
26         System.out.println("s1==s5 ? " + (s1==s5)); //false
27         System.out.println("s1.equals(s5) ? " + s1.equals(s5)); //true
28         System.out.println("s5.equalsIgnoreCase(s) ? " + s5.equalsIgnoreCase(s)); //true
29         System.out.println("------------------------");
30         
31         String s6 = "a" + "bc";
32         System.out.println("s1==s6 ? " + (s1==s6)); //true
33         System.out.println("s1.equals(s6) ? " + s1.equals(s6)); //true
34         System.out.println("s6.equalsIgnoreCase(s) ? " + s6.equalsIgnoreCase(s)); //true
35         
36         
37     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知识分享

C#抽象类与抽象方法--就是类里面定义了函数而函数里面什么都没有做的类

看一下代码应该就可以了 using System; using System.Collections.Generic; using System.Linq; u...

28030
来自专栏菩提树下的杨过

装箱与值类型虽然很容易理解,但是在实际使用中,并不总是能100%用对

public struct Point { private int m_x, m_y; public Poi...

21460
来自专栏菩提树下的杨过

[原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)

以下内容为菩提树下的杨过根据微软MSDN整理,转贴请注明出处 MSDN对于Func<T, TResult>)的官方解释: 封装一个具有一个参数并返回 ...

21970
来自专栏跟着阿笨一起玩NET

DataGridView绑定BindingList<T>带数据排序的类

本文章转载:http://yuyingying1986.blog.hexun.com/30905610_d.html

8110
来自专栏林德熙的博客

C# 16 进制字符串转 int

最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理。 本文告诉大家如何从 16 进制转整形。

21010
来自专栏angularejs学习篇

ref和out的区别在c#中 总结

6600
来自专栏一个会写诗的程序员的博客

使用 Kotlin 实现 Y 组合子(Y-Combinator)使用 Kotlin 实现 Y 组合子(Y-Combinator)《Kotlin极简教程》正式上架:

我们可以使用 Kotlin FP (Lambda, function) 写一个 Y-combinator 函数吗?

5920
来自专栏yl 成长笔记

c# 委托(Func、Action)

以前自己写委托都用 delegate, 最近看组里的大佬们都用 Func , 以及 Action 来实现, 代码简洁了不少, 但是看得我晕晕乎乎。 花点时间研究...

2K30
来自专栏GreenLeaves

C#核编之内建数据类型

这个随笔中的重点之一是说明:C#中所提供的关键字都是相应系统类型的简化符号(如int是System.Int32类型的简化符号) 一、内建数据类型与层级结构 所有...

25360
来自专栏菩提树下的杨过

linq学习笔记(一)

本例演示了如何从一个int数组中找出偶数,并将结果从大小到排序 using System; using System.Collections.Generic;...

205100

扫码关注云+社区

领取腾讯云代金券