"1"=="1"? true还是false 在JavaScript中,"1"==1会返回true还是fa...

作者&投稿:溥净 (若有异议请与网页底部的电邮联系)
楼上说了那么多还是没切住楼主要点啊。
其实这个要讨论到2个蛮底层的东西。
1.==判断的的确是在内存中的同意引用地址,也就是楼主说的同一对象。

2.两个“1”都是同一个对象了? 回答是不是。

3.楼主最想明白的一点,为什么"1"=="1"是true吧。这里是第一个蛮高深的地方。因为"1"一出现,JVM给它一个内存地址,而第二个"1"出现的时候呢,并不是给他一个新地址,而是在字符串缓冲池中找是否有相同值的引用,如果可以,直接给他。很奇怪吧,但就是这样,但前提是,这里的两个“1”都当做了基础类型,并不是对象。
举个例子吧。String s1="1";String s2="1";然后s1==s2;是true,就是因为这里的s1和s2都是基础类型,类似于int,float这些基础类型(只要不是new出来的,String有点特殊,并不像int对应Integer,它的基础类型和对象类都是String)。再举个例子吧,String s1="1";String s2=new String("1");这个时候s1是基础类型,s2是对象,他们对应的地址引用不同,所以s1==s2;是false的,不信可以试试,嘿嘿。

4.==和.equals区别何在,这是第二个蛮底层的东西了。
在Java中,所有类的超类是Object,Object中有equals方法,但是它里面的equals是这样的。public boolean equals(Object obj) {
return (this == obj);
} 也就是说Object中equals就是==操作,也就是比较引用地址。那么为什么两个String对象,比如String s1=new String("1");String s2=new String("1");用s1.equals(s2);还是true呢,不是应该比较地址的么?那是因为大多数基础类型对应的类比如Integer,String,Float等都重写了equals函数了,他们比较的是对应的值的大小,而不是引用了,所以上面两个String的对象用equals比较的是他们的值,而他们的值都是"1",这再用到第3点中的方法,也就是他们的值相等,那么s1.equals(s2);就是true 了。

5.所以在很多时候,我们会重写equals方法,用我们自己的方法来判断两个对象是否equals。

补充回答:1.什么时候用常量池中的“1”,当然是在程序编译过程中如果有String s1="1";以后再有同样的String s2="1";之类的就用它了,关键是,不用new,不是新对象的话,只要之前在池子中的常量就会复用。
2.什么时候自己创建“1”对象?回答是,任何时候都没必要。知道为什么会有Integer,Float么,就是为了完全OOP,OOP好处是什么?可以有更多操作手段,有了Integer后,int基本类型的东西通过自动装箱可以很方便的用到Integer类中的函数方法。同样的String s1="1";中的s1可以自动装箱成为String s1=new String("1");中的s1,那么也就可以自动的像后面作为对象的s1一样用到String类中的函数了。
也就是说,除非特殊癖好(喜欢完全OOP格式什么的),new String完全没必要,因为JVM的自动装箱和拆箱功能完全可以满足了。

这个好多人回答呀。
我只想补充几句。

由于JVM的共用常量池而导致的 == 返回true的情况,这个不是永远正确的情况。
由于 == 仅是返回了两个字符串对象引用是否指向同一个地方,而各种JVM出于性能优化、节省内存等需求,都可能尽量重用字符串常量,或者根本不重用字符串常量。
因此,即使"1" == "1"也可能在某些特殊的JVM下返回false。

在这里讨论使用常量池的"1"的情况没有意义,除非指定了某个特定厂家的特定版本的JVM,才能给出准确答案。不过如此限定就失去了Java的特性。

因此,实际编程时,请仅使用equals来判断字符串,任何时候都不要用==。

用引号直接创建的字符串对象。。是先直接在常量池建一个。。以后如果还有一样的。。就都用那个了。。所以是一样的。。
比如String s1 = “a”;和String s2 = “a”;都是一样的。。因为第一次在产量池建了一个a。。第二次就不会建了。。

但是如果用String类的构造方法建就不一样了。。因为都是new出来的。每次new都会有一个新的对象。。

恩。。是那样的。。只要是双引号直接创建的都在常量池。。而常量池的东西是不会重复创建的。。为了节约资源。。其他方式得到的都相当于是new出来的。。比如你说的substring。。他的源代码就是返回的一个新的字符串对象。。

如果常量池中已经有“1”了。。比如你定义了String s1 = "1";
那么以后只要你再出现"1"都是用原来那个(new时除外比如new String(“1”))..比如String s2 = "1";并且s1.toLowerCase和s1.toUpperCase以及s1.substring(0)或者s1.substring(0, 1)以及String.valueOf(s1)或者String.valueOf("1")等--都是使用常量池中的那个1..这样节约资源..但是一旦你使用new关键字创建String对象的话..就不再是那个了..而是一个新的对象了..或许new关键字并不是你用的..可能是你调用的方法里面返回的是一个新的字符串对象.. 比如new String("1");new关键字在java里就是创建一个新对象的意思..

首先楼主问的"1"=="1"这个是true,因为"1"存放在常量池的。
这应该算是个关于String对象的创建方面的问题
1。
String a = "1";//创建a的时候,首先查看常量池里面,如果有"1",就把a指向这里;如果没有"1",就开辟一个"1",并切a使用常量池的"1",
String b = "1";//这时常量池必定有了1,也就是创建b时在常量池查找"1"必定成功,然后b就指向已经有的"1"。这里做ab的比较,你会发现a==b是true
2。
String c = new String("1");//这个对象开辟在堆内存里面(强制new出来的),对象的引用c在栈内存里面。这个就没有使用常量池。 也就是说,用==来比较,c就跟a和b不等的

a == b

用 == 比较 是比较 a 和 b 2个对象在内存中的 地址相不相等。

a.equals(b)

是判断a 和 b 里面的内容是不是相等。

因为你这里仅仅是直接将a 和 b 都赋为 "1",并没用给他们声明 名称,所以系统判断这个的 内容是一样的,于是就将他们存入同一个地址,

也就是说 你 == 左右2个东西 在内存中 共用一块地址,所以 比较地址 当然相同,

你要记住 如果你程序先前有用=号赋值, 那么告诉你 JAVA的=号赋值 不是赋内容 而是 赋地址过去的,

就是b = 3,
a = b,

其实只是把b的地址给a ,那么以后用到a的时候 就去这个地址找内容,找出来还是3,其实a 和 b 都指向同一个地址,里面内容为3,而不是指向2个不同的地址。

新手小白求教:在python中-1为True还是False~

如果做布尔运算,那么是True。如果做相等比较,都是False
>>> bool(-1)True>>> True == -1False>>> False == -1False还不明白?
看这里:刘江的Python教程之布尔类型

“1”==1 为true
“1”===1 为false

什么叫"一产""二产""三产"?
答:1、一产:第一产业 是指各类职业农民和各类水生、土生等农业原始产品,以利用生物的自然生长和自我繁殖的特性,人为控制其生长和繁殖过程,生产出人类所需要的不必经过深度加工就可消费的产品或工业原料的一类行业。2、二产:第二产业 括各类专业工人和各类工业或产品。指以对第一产业和本产业提供的产品...

在混凝土中材料配合比一般有个"1"这个"1"一般是代表水还是水泥或是其它...
答:水泥 其他的都是和水泥的比例关系

C++中如何使输出的"1"变成"01"
答:这种输出有两种方式:标准C语言的格式输出和C++的格式化输出 标准C语言的格式输出 include <stdio.h> //引用标准输出头文件int main(){ int a=1; printf("%02d", a ); //%02d中2是指输出字符的最少个数,0是指不足位时前补0,d表示输出一个整数,详情可查阅"c语言printf()函数说明...

如何理解早期希腊哲学的基本问题是"一"与"多","静"与"动"的关系?它们...
答:不尽是早期的希腊哲学,任何一个文明都必须回答的。其中包括"一"与"多"、,"静"与"动"。从【类型】上来说,这两个问题都是“关系relation”类问题,即互相之间的什么关系的 【定义】:所谓的逻辑,用数学语言来说,就是“关系 relation”,按自身循环分类的“一分为二”方法就是 R(·,·)="∈...

代码border="1"cellpadding="0"cellpadding="0"这段代码是什么意思啊...
答:这是html表格标记的属性,border="1" 是让表格边框线的粗细为1像素,cellpadding="0" 是让单元格边框线与单元格中的内容之间的距离为0像素,即单元格中内容紧挨着单元格的边线, cellspacing="0" 是让各单元格之间的缝隙为0象素。如 表示这个表格宽度为200象素,边框粗细为1象素,单元格和格中...

在做一道加法试题时,不小心把一个加数个位上的"3"看成了"8",十位上...
答:736-(8-3)+(70-10)=736-5+60 =731+60=791

在c/c++,"index<<=1”, "index |= 1” ,其中"<<=" 、"|=1"不是什么意...
答:两个都是赋值的符号了,<<=是先把index 左移1位 (例如index=00000001,经过左移一位后得index=00000010)再把它赋给index,|=1是先把index与1进行 位与运算 后再赋给index。希望对你有帮助,至于具体怎么用,自己根据我的说法去查资料吧。都是C语言的基本运算符里面的知识了 ...

cass9.1安装完成后,展高程点出现:未知命令"1".按 F1 查看帮助.请问怎么...
答:未知命令识别不了,正确的操作步骤为:1、当使用“插入块”命令时,命令栏显示“未知命令插入,按F1查看帮助”。2、我们使用的命令是“redefine”命令,首先输入redefine。3、单击“确定”,状态栏将显示redefine命令。4、此时我们可以输入“insert block”命令,但我们不知道“insert block”命令是什么。在...

"一带一路"和“马歇尔计划”的区别是什么?
答:"一带一路"和马歇尔计划的区别:(1)时代背景不同。美国推出“马歇尔计划”是为了使欧洲资本主义国家尽快实现战后复兴,防止希腊、意大利等国共产党借战后百废待兴、政治混乱之机夺取政权,以对抗苏联和共产主义国家,是经济上的“杜鲁门主义”,是为最终实现美国全球霸权服务的。“马歇尔计划”为北约组织...

应该说"生平第一次"还是说"平生第一次"?
答:一、用“生平”或“平生”都可以。二、生平有两种意思:1.人的整个生活过程,一生、2.有生以来。可以组成“生平第一次”。三、平生也有“一生;此生;有生以来”的意思,比如周而复先生《上海的早晨》第一部十二:“这可以说是朱延年平生第一笔生意。”...