Java杂谈之String----"=="与equals的区别

在程序代码的编写中,经常涉及到两个字符串的比较

这个时候一般困惑我们的是"=="和equals方法的取舍问题,实际上,只要明白了这两者

比较的区别,我们就能够正确的选择出到底采用哪种方式进行字符串的比较了

首先我们定义两个字符串

String s1 = "hello";

String s2 = new String("hello");

这两个都建立了"hello"的字符串,但到底有什么不同呢

注意,Java中没有指针的概念,这边的s1,s2是引用(说白了可以看做是指针,但不具备

指针运算的特性等)

如上图可以看出,两种表示的值都是hello的字符串,但是s1,s2这两个引用指向的地址

则不同。

正好"=="判断的是地址是否相等

而equals()方法判断的是值是否相等

这边大家就应该明白什么时候选用什么来判断字符串是否相等了。

以下是用一个代码示例来说明:

package JavaTestString;

//常量池--内存中放常量的地方
//String s1="hello"----hello字符串会放到常量池中,s1不在常量池中,是引用
//String s2="hello"----不会再新建一个hello常量,所以s2和s1指向同一个常量,都是引用
//s1==s2----两个引用判断相等,是判断的地址是否相同
//String s3=new String("hello")----new出来一个新的内存空间来存放hello,s3依然是引用
//综上所述,'=='判断是地址是否相等,而不是值是否相等
//判断值是否一样的话,用equals()方法

public class JavaStringIsEqual {
	public static void main(String[] args) {
		String s1 = "hello";
		String s2 = "hello";
		String s3 = new String("hello");
		//"=="判断两者指向的地址是否相等,并非代表的值
		if(s1==s2)
		{
			System.out.println("s1与s2指向的地址相等");
		}
		else
		{
			System.out.println("s1与s2指向的地址不相等");
		}
		//equals()方法判断值是否相等,与地址无关
		if(s1.equals(s2))
		{
			System.out.println("s1与s2值相等");
		}
		else
		{
			System.out.println("s1与s2值不相等");
		}
		//"=="比较s1与s3
		if(s1==s3)
		{
			System.out.println("s1与s3指向的地址相等");
		}
		else
		{
			System.out.println("s1与s3指向的地址不相等");
		}
	    //equals()比较s1与s3
		if(s1.equals(s3))
		{
			System.out.println("s1与s3虽然指向的地址不相等,但值是一样的");
		}
		else
		{
			System.out.println("s1与s3指向的地址不相等,值也不相等");
		}
	}

}

Java杂谈之String----"=="与equals的区别

时间: 2024-11-09 02:42:05

Java杂谈之String----"=="与equals的区别的相关文章

【转载】Java基础之String中equals,声明方式,等大总结

转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识点还是比较多的.今天就和大家来一起讨论一下,关于String的一些容易让人疑惑的地方,废话不多说进入正题...如有谬误请批评指正,如果有疑问请留言.我会在第一时间修改或回答 通过

在JAVA中,String,Stringbuffer,StringBuilder 的区别

首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String的时候,需要先进行同步,否则会出现不同线程获得的值不同的情况,即线程不安全 StringBuffer 是线程安全的,在不同线程中共享的时候会自动同步,不需要手动同步. 效率方面: String在每次更改的时候均是重新建立一个变量,再将更改后的值赋予其中,多次更改之后会触发JVM的GC机制,占用资源

java细节篇(==和equals的区别)

1)当==两边是对象时(String,Integer...),两边比的都是地址2)当==两边是基本类型时(int,float),两边比的都是值3)默认equals比的是对象的地址,但是重写的话可以改变成比较值,String和Integer的equals就是重写过的 废话少说,Run!!! package test; public class Test { public static void main(String[] args) { System.out.println("##########

java中的==和equals的区别

关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢. 在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等. 如:System.out.println(1==1);System.out.println(true==true);√ 不能写成System.out.println(1.

java:String使用equals和==比较的区别

"=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的同一块地址. equals所在位置: 在Object类当中,而Object是所有类的父类,包含在jdk里面,但并不适合绝大多数场景,通常需要重写 public boolean equals(Object obj) { return (this == obj); } equals的作用: 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型 equals的基本使用: boolean

Java杂谈之StringBuffer----兼带String,StringBuffer,StringBuilder的区别

在Java中,用到最多的当属String类型的数据了 而这一点就要涉及String , StringBuffer , StringBuilder这三大类 下面主要来比较一下String和StringBuffer的区别,因为StringBuffer和StringBuilder 太相似,所以就不拿来比较了. 提及一下,StringBuffer和StringBuilder的区别 从安全性来说,StringBuffer更安全,StringBuffer主打线程安全 从执行效率来说,StringBuilde

Java中字符串比较时==和equals的区别

==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = "abc"; a == b返回true,a.equals(b)同样返回true,这是为什么呢? 原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个. 上例中创建a时,会在字符串池中首先创建一个"abc&qu

Object类和String类equals方法有什么区别?

相信很多学习过Java的同学都知道,在比较两个String对象的内容是否相同时是使用equals方法的 如:String str1=new String("A"); String str2=new String("B"); String str3=new String("B"); boolean result1= str1.equals(str2); boolean result2= str2.equals(str3); System.out.p

java中,==跟equals的区别

在java中,经常有一些刚入行的新手分不清==跟equals的区别.==操作符是专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或者两个变量是否相等,只能用==操作符.如果一个变量指向的数据是对象类型,这时候就涉及了两块内存,对象本身占用已快内存,变量本身也占用一块内存,例如:Object obj = new Object();中,变量obj是一个内存,new Object();是另一个内存.此时,变量obj所对应的内存中存储的数值