今天偶然看到stackoverflow上关于==和.equals()的分析,记录一下
== 测试引用相等。
.equals() 测试值相等。
所以呢,
如果你真的想看这两个string是不是有相同的值,那就用.equals()(除了一些特殊的情况,你得保证这两个有着相同value的string是用同一种对象表现的,例如String interning)
==呢,是用来测试两个字符串是否是同一个对象
看看一下代码吧!(格式略微有些乱)
public static void main(String[] args) throws IOException, MemfisException{ String t1 = new String("T"); String t2 = t1; // These two have the same object System.out.println("1. t1 == t2 --> "+(t1 == t2)); // These two have the same value System.out.println("2. new String(\"test\").equals(\"test\") --> "+new String("test").equals("test")); // ... but they are not the same object System.out.println("3. new String(\"test\") == \"test\" --> "+(new String("test") == "test")); // ... neither are these System.out.println("4. new String(\"test\") == new String(\"test\") --> "+(new String("test") == new String("test"))); // ... but these are because literals are interned by // the compiler and thus refer to the same object System.out.println("5. \"test\" == \"test\" --> "+("test" == "test")); // concatenation of string literals happens at compile time, // also resulting in the same object System.out.println("6. \"test\" == \"te\" + \"st\" --> "+("test" == "te" + "st")); // but .substring() is invoked at runtime, generating distinct objects System.out.println("7. \"test\" == \"!test\".substring(1) --> "+("test" == "!test".substring(1))); // interned strings can also be recalled by calling .intern() System.out.println("8. \"test\" == \"!test\".substring(1).intern() --> "+("test" == "!test".substring(1).intern())); }
执行结果:
1.t1 == t2 --> true
2.new String("test").equals("test") --> true
3.new String("test") == "test" --> false
4.new String("test") == new String("test") --> false
5."test" == "test" --> true
6."test" == "te" + "st" --> true
7."test" == "!test".substring(1) --> false
8."test" == "!test".substring(1).intern() --> true
在把String中的.equals()方法拿出来看一下,瞬间释然了
public boolean equals (Object object) { if (object == this) return true; if (object instanceof String) { String s = (String)object; if (count != s.count || (hashCode != s.hashCode && hashCode != 0 && s.hashCode != 0)) return false; return regionMatches(0, s, 0, count); } return false; }
原来.equals()方法这么高达上,已经兼容到了 == 的功能了哦~~
找了一下intern()这个方法,代码如下
public native String intern();
我擦,这是个神马啊!!赶紧找找这个native是个毛! 找到相关内容,点击跳转
以下是我理解的native,这个native,它是一个用其它语言来实现的一个方法?!和Java Native Interface一起执行。
这个native的用途就是把一个string,先从table中搜索,看看有没有和这个相同的对象,如果有,就换成是那个对象,如果没有,就是一个新的对象,这样就可以解释为什么最后那句代码"test" == "!test".substring(1).intern()是true了!
相关推荐
//在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...
==和equals方法究竟有什么区别? == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。 ...
10.String、String StringBuffer 和 StringBuilder 的区别是什 么? 11.ArrayList和linkedList的区别 12.HashMap和HashTable的区别 13.Collection包结构,与Collections的区别 14.Java的四种引用,强弱软虚 15.泛型...
==和 equals ()都是用于相等型判断的操作符 == 操作符用来判断两个引用是否指的同一个对象,或两个简单类型的值是否相等 即: [ == 比较值类型数据,比较的是值, 而引用类型对象比较的是地址] equals() 方法用来判断...
主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,...
3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...
3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...
实验报告 课程名称 JAVA程序设计与实例 实验名称 班 级 专 业 任课教师 学 号: 姓 名: 实验日期: 通讯录实验报告全文共5页,当前为第1页。 一、实验目的与实验任务 通讯录实验报告全文共5页,当前为第1页。 1、...
在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同。大多数时候==跟equal()的结果都是相同的。
《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。 "=="判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用...
if(sr.equals(str.substring(j,j+1))){ k++; } } System.out.println(s + "有" + k + "个"); } 6. 对字母进行排序,如:s,a,g,d,b; String s = "sagdb"; List t = new ArrayList(); for(int i...
1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner; class ...
面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 ...String#equals() 和 Object#equals() 有何区别? 字符串常量池的作用了解吗? String s1 = new String("abc");这句话创建了几个
注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...
如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值。 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置。 void addEntry(int...
本文实例讲述了C#使用Equals()方法比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: int price = 100; int amount = 1000 if (price.Equals(amount)) { Console.WriteLine(Price is equal to amount...
6.1.1 字符串比较 Java语言程序设计(第3版) 不能使用"=="号来比较字符串内容是否相等 比较内容是否相等: boolean equals(String str) boolean equalsIgnoreCase(String str) s1 s2 Hello Hello 字符串常量池 s1 s2...
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...
a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指...