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

简介: .net中,其字符串特有的驻留机制,保证了在同一进程中,相同字符序列的字符串,只有一个实例,这样能避免相同内容的字符串重复实例化,以减少性能开销。 先来回顾一下c#中的代码: View Code 1 public static void testString() ...

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

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

View Code
 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用于判断二个字符串是否内容相同

View Code
 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     }
目录
相关文章
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
143 83
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
58 26
|
24天前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
50 4
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
58 8
|
2月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
53 7
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
52 6
|
Java C# C语言
【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。
新工作.Net和Java都要做,早期也做过一段Java的项目,但没有系统的深入学习过。一直觉得这两门语言估计是最相近的两门语言了,好多代码可以说直接拷过来都不带报错的,但仔细推敲还是有很多的不同。
217 0
【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。
|
Java C# 编译器