java中“==”为什么会出现这种现象

问题描述

classTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}结果为:falseclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}结果为:trueclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a.equals(b));}}结果为:true

解决方案

解决方案二:
每隔几天这里就会出现这种问题
解决方案三:
因为你用的是字符对象相比较,相当于比较的是a与b的内存地址是否相同,因为是两个内存单元,所以结果是false字符型对象比较是否相同,应该用equals明白没?
解决方案四:
http://topic.csdn.net/u/20090519/18/7b8cf7ef-bc06-4d26-8a2c-692eb0562231.html
解决方案五:
第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊
解决方案六:
建议去看一个张龙老师的java笔试面试深度剖析视频
解决方案七:
classTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}

classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}

第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同。而第二个,两个对象都没有用new关键字,这时,涉及到了java的字符串池技术,在直接用s="xxx"的形式时,会把=号后面的字符串放入字符串池,而且相同的字符串只放一次,所以a和b的地址是一样的,因为在字符串池里面。
解决方案八:
第三个你也明白,我就不说了
解决方案九:
==比较的是对象的地址(如果是对象的话)。String是个特例,new的时候会重新分配内存。不new的时候用的还是原来的。引用4楼tylovemxhehe的回复:

第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊

解决方案十:
6楼正解,看到你的标题我就大概猜到你想问什么了,==比较的是内存地址,equal才是正真比较的数据。new表示在内存中创建一个区域,第二个那种情况就涉及到字符串池技术了。
解决方案十一:
路过
解决方案十二:
引用9楼yhwpeng的回复:

6楼正解,看到你的标题我就大概猜到你想问什么了,==比较的是内存地址,equal才是正真比较的数据。new表示在内存中创建一个区域,第二个那种情况就涉及到字符串池技术了。

正在培训,老师刚讲过,哈哈
解决方案十三:
这问题问了很多次了..用equals!!!!
解决方案十四:
第一个第二个的区别就是第一个实际上用new创建了两个String对象然后第二个中的两个是同一个String对象
解决方案十五:
==比较内存地址equals比较内容
解决方案:
==比较对象的引用equals比较对象的内容。
解决方案:
一般来说java虚拟机在运行时会有一些对象池,其中String类的对象就是池的一种,如果你有相同*内容*的String的话他回从池中取,所以地址是一样的,楼上的说过用equals是比内容的如果你非要用等好就重载他就可以了
解决方案:
引用问题
解决方案:
赞同2楼楼主!
解决方案:
这个问题很普遍要判断字符串是否相等应该用equals()"=="判断引用地址是否相等
解决方案:
路过要比较字符串要用equals()
解决方案:
内存分析下,就很容易明白了。
解决方案:
“==”地址的比较,equals内容的比较如果Stringa="abc"Stringb="abc"(a==b)内存中的A已经有了ABC所以B只要指向A的地址就可以了,所以是true其实String是一个引用变量,当用new产生一个新的对象时,就重新开辟了一个空间,所以(a==b)是false
解决方案:
对于这些常见的问题是不是要搞个置顶的帖子啊。。。。。
解决方案:
引用23楼fskjb01的回复:

对于这些常见的问题是不是要搞个置顶的帖子啊。。。。。

同感
解决方案:
6楼正解...string要多多注意.
解决方案:
引用4楼tylovemxhehe的回复:

第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊

很明显啊,这个你不是new出来的,所以他的地址是一样的都是对栈里面的同一个的taoyu的引用(内存地址当然一样),当你new的时候,他的栈里面存储字符串的地址就不一样了!!!也就是说,“==”比较的是引用对象的存储的首地址,而equals比较的是对象的内容!!!很容易理解啊~~~~
解决方案:
有意义吗,下一两个developkits就把这问题解决了.就研究这个,始终就是做程序.做一辈子还不够,再做一辈子.
解决方案:
关于这个问题,论坛里早就有人问过,早就有人正解过,这里就不重复了,自己搜一下吧。
解决方案:
分清楚基本类型和引用类型,以及equals和“==”的区别
解决方案:
你去看看这个帖子,里面有我的回答,应该很详细了
解决方案:
new操作是在堆内存中申请一块新内存,无论字符串的内存是否相等,它们的地址都不相同,所以为falseStringa="taoyu";Stringb="taoyu";“taoyu”在堆内存中只有一份,a,b都是对它的引用。地址相同,所以结果为true另,注意:==比较的是地址,equals比较是内容。
解决方案:
路过,学习了引用6楼natalya13的回复:

JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同…

解决方案:
楼主还是去看看基础吧,这种问题书上应该说过
解决方案:
常见问题,多看帖子
解决方案:
该回复于2009-05-31 10:44:06被版主删除
解决方案:
好些人认为equals比较的是内容,==比较的是“地址”,其实这是一个很大的误解。如果你不重写equals,你会发现,它也是在比较“地址”,它的效果和==是一样的。不信,请运行以下程序:publicclassTest{privateinta=1;publicstaticvoidmain(String[]args){Testa1=newTest();Testa2=newTest();Testa3=a1;System.out.println("a1==a2的结果:"+a1==a2);//falseSystem.out.println("a1.equals(a2)的结果:"+a1.equals(a2));//也是falseSystem.out.println("a1==a3的结果:"+a1==a3);//trueSystem.out.println("a1.equals(a3)的结果:"+a1.equals(a3));//也是true}}我想说的是:如果你不重写equals方法,告诉equals方法如何比较内容(String类就是这样做的),那么equals方法和==的效果是一样的(其实==就是调用的Object的equals方法完成比较的,相关内容参见《thinkinginjava》)。
解决方案:
池里面的东东是可以重复使用的堆中的则只有NEW你没有new那是放在池中NEW了是放在堆中
解决方案:
原来你写错了,吓死我了,我以为JVM有问题呢..已经有人回答你了
解决方案:
大家就以6楼的为准吧,标准解答。
解决方案:
6楼的答案很好了..equals()比内容,"=="比地址.Stringa="abc";Stringb="abc";和Stringa=newString("abc");Stringb=newString("abc");是有区别的..前者执行的时候会在常量池里面创建"abc",后面如果非new的形式定义字符串的话,那么会直接在常量池里面去找,如果有就直接指向那个字符串,如果没有会在常量池里面新建.new就不一样了,每new一次,会为它分配自己的内从空间.所以地址是不一样的
解决方案:
有专业讲这个的帖子你可以去看看!
解决方案:
引用36楼mouyong的回复:

好些人认为equals比较的是内容,==比较的是“地址”,其实这是一个很大的误解。如果你不重写equals,你会发现,它也是在比较“地址”,它的效果和==是一样的。不信,请运行以下程序:publicclassTest{privateinta=1;publicstaticvoidmain(String[]args){Testa1=newTest();Testa2=newTest();Testa3=a1;System.out.println("a1=…

兄弟,你的理解有误System.out.println(a1);你可以试一下,看a1是什么?它其实就是一个地址,是通过继承Object类的toString()方法得到的字符串值。所以==比较的是地址。而通过equals我们比较的是同一个对象的属性值
解决方案:
初学者String还是比较复杂的
解决方案:
6楼对了。
解决方案:
mark,回去好好研究下
解决方案:
六楼正解
解决方案:
这个就是实例化和没有实例化的区别哦···········
解决方案:
引用6楼natalya13的回复:

JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同…

就是这样的这样类似的帖子很多很多啊
解决方案:
Aa=newA()a这个引用值是放在栈中的,而newA()则是放在堆中的。“==”只能比较栈中值的大小,equals可以比较堆中的值
解决方案:
用==是比较的内存的地址所以永远不可能是“true”所以前两个不是很理解equle比较的是内容所以是true

时间: 2024-10-02 06:41:44

java中“==”为什么会出现这种现象的相关文章

Java中的读/写锁

原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁.在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源.但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存).这就需要一个读/写锁来解决这个问题

在Java中应用设计模式--Factory Method

设计 在设计模式中,Factory Method也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是Factory Method,为什么要用这个模式,如何用Java语言来实现该模式,这就是本文想要带给大家的内容. 基本概念 Factory Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要

Java中的类反射机制

一.反射的概念 :反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩.其中LEAD/LEAD++ .OpenC++ .MetaXa和OpenJava等就是基于反射机制的语言.最近,反射机制也被应用到了视窗系统.操作系统和文件系统中. 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学

JAVA中如何执行DOS命令

  下面是一种比较典型的程序模式: ... Process process = Runtime.getRuntime().exec(".p.exe"); process.waitfor( ); ... 在上面的程序中,第一行的".p.exe"是要执行的程序 名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指 定的可执行程序,并返回与该子进程对应的Process对象实例.通过

Java中的MessageFormat.format用法实例

  这篇文章主要介绍了Java中的MessageFormat.format用法实例,本文先是讲解了MessageFormat的语法,然后给出了多个操作实例,需要的朋友可以参考下 MessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息. MessageFormat模式(主要部分): 代码如下: FormatElement: { ArgumentIndex }:是从0开始的入参位置索引. { Arg

Java中的几个HashMap/ConcurrentHashMap实现分析

一.HashMap,即java.util.HashMap 标准链地址法实现.这个不用多解析,下图十分明了.(图片来自网络) 二.Collections.synchronizedMap() 函数返回的线程安全的HashMap 这个的实现比较简单. 代码中有: private final Map<K,V> m; // Backing Map final Object mutex;// Object on which to synchronize 基本所有的方法都加上了synchronized(mu

java中凡是相同的两个单词(保留关键词除外)以大写开头的就是类,以小写字母开头的就是对象。

问题描述 java中凡是相同的两个单词(保留关键词除外)以大写开头的就是类,以小写字母开头的就是对象. java中凡是相同的两个单词(保留关键词除外)以大写开头的就是类,以小写字母开头的就是对象. 比如 Abc.set( );就是类调用方法set abc.set( );就是对象调用方法set 这种说法对吗 解决方案 类实例一般开头字母会小写,但也没有限制 解决方案二: 没有这个规定,类的命名不分大小写,开头字母大写,只是个好的习惯 解决方案三: 没有你说的这个现象.这个大小写编码规范. 解决方案

深入分析 Java 中的中文编码问题(转)

  简介: 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别:Java 中经常需要编码的场景:出现中文问题的原因分析:在开发 Java web 程序时可能会存在编码的几个地方,一个 HTTP 请求怎么控制编码格式?如何避免出现中文问题? 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不

深入分析 Java 中的中文编码问题

简介: 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别:Java 中经常需要编码的场景:出现中文问题的原因分析:在开发 Java web 程序时可能会存在编码的几个地方,一个 HTTP 请求怎么控制编码格式?如何避免出现中文问题? 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我