`
Quanta1990
  • 浏览: 3302 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java中String的相等判断,==和.equals()总结

    博客分类:
  • Java
阅读更多

 今天偶然看到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了!

 

分享到:
评论

相关推荐

    String a="hello" String b="hello" a==b 返回true的问题分析

    //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...

    ==和equals方法究竟有什么区别

    ==和equals方法究竟有什么区别?  == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。  ...

    Java面试经典题,对JAVA面试很有帮助

    10.String、String StringBuffer 和 StringBuilder 的区别是什 么? 11.ArrayList和linkedList的区别 12.HashMap和HashTable的区别 13.Collection包结构,与Collections的区别 14.Java的四种引用,强弱软虚 15.泛型...

    ==和equals() 的比较

    ==和 equals ()都是用于相等型判断的操作符 == 操作符用来判断两个引用是否指的同一个对象,或两个简单类型的值是否相等 即: [ == 比较值类型数据,比较的是值, 而引用类型对象比较的是地址] equals() 方法用来判断...

    Java中==与equals的区别小结

    主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,...

    JAVA核心知识点整理.rar

    3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...

    java核心知识点整理

    3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六...

    通讯录实验报告.docx

    实验报告 课程名称 JAVA程序设计与实例 实验名称 班 级 专 业 任课教师 学 号: 姓 名: 实验日期: 通讯录实验报告全文共5页,当前为第1页。 一、实验目的与实验任务 通讯录实验报告全文共5页,当前为第1页。 1、...

    java String 类的一些理解 关于==、equals、null

    在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同。大多数时候==跟equal()的结果都是相同的。

    Java 2023最新面试知识点总结.pdf

    《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。 "=="判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用...

    最新JAVA编程题全集_50题及答案

    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...

    达内 coreJava 习题答案

    1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner; class ...

    java 面对对象编程.pdf.zip

    面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 ...String#equals() 和 Object#equals() 有何区别? 字符串常量池的作用了解吗? String s1 = new String("abc");这句话创建了几个

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

    sesvc.exe 阿萨德

    如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值。 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置。 void addEntry(int...

    C#使用Equals()方法比较两个对象是否相等的方法

    本文实例讲述了C#使用Equals()方法比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: int price = 100; int amount = 1000 if (price.Equals(amount)) { Console.WriteLine(Price is equal to amount...

    Java语言程序设计(第3版)第06章-字符串.pptx

    6.1.1 字符串比较 Java语言程序设计(第3版) 不能使用"=="号来比较字符串内容是否相等 比较内容是否相等: boolean equals(String str) boolean equalsIgnoreCase(String str) s1 s2 Hello Hello 字符串常量池 s1 s2...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    java六大必须理解的问题-来自网络少许有误(非常适合初学者).doc

    a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指...

Global site tag (gtag.js) - Google Analytics