Java 为什么新字符串(";a";)==新字符串(";a";)给出false和";a「==&引用;a「;这是真的。为什么在后来的案例中,它们似乎被视为同一个实例?

Java 为什么新字符串(";a";)==新字符串(";a";)给出false和";a「==&引用;a「;这是真的。为什么在后来的案例中,它们似乎被视为同一个实例?,java,string,pointers,equals,Java,String,Pointers,Equals,可能重复: 这是一个很容易解释的问题 编辑:我理解==不等于。我不明白的是,为什么“a”==“a”中的两个a都被分配或视为相同的对象实例(它们是) 编辑是否有人阅读了问题,或者只是想按下关闭按钮?这与上述任何一项都无关。告诉我在哪里提到EQUALS方法…“a”==“a”给出true,因为“a”将被视为和池。所以,两个“a”都指向同一个实例,因为两个引用都指向同一个对象,==返回true 当你说新字符串(“a”)时。全新的对象将在堆和不同的引用上创建,因此==返回false,您需要使用.equ

可能重复:

这是一个很容易解释的问题

编辑:我理解==不等于。我不明白的是,为什么“a”==“a”中的两个a都被分配或视为相同的对象实例(它们是)

编辑是否有人阅读了问题,或者只是想按下关闭按钮?这与上述任何一项都无关。告诉我在哪里提到EQUALS方法…

“a”==“a”
给出true,因为“a”将被视为和池。所以,两个“a”都指向同一个实例,因为两个引用都指向同一个对象,==返回true


当你说
新字符串(“a”)
时。全新的对象将在堆和不同的引用上创建,因此==返回false,您需要使用
.equals()
您必须使用“a”.equals(“a”)

记住,
=
检查对象是否相同。两个对象可以不同但彼此相等

newstring(“a”)==newstring(“a”)
:使用相同的值创建两个不同的字符串对象,因此
=
返回false,因为对象不同

“a”==“a”
:字符串插入到同一个对象,因此
=
返回true

如果要检查两个对象是否具有相同的值,请尝试使用
.equals()

  • =
    检查引用(内存指针)是否相等
  • “a”
    是一个字符串文本,它存储在常量数据表中(因此每次使用它都指向同一个文本)
  • newstring(“a”)
    分配一个内容为“a”的字符串对象,但它是一个独立对象,具有自己的内存空间
  • 每个
    new
    总是分配不同的对象,所以两个分配的对象不能有相同的引用

Java为设计时已知的字符串创建字符串池。如果你写的是

字符串a=“a”; 字符串b=“b”; a==b将返回true,因为java只创建一个具有相同地址的对象

如果你写的是

新字符串(“a”)==新字符串(“b”)

这将返回false,因为在运行时使用不同的地址创建了两个对象


==运算符比较对象的地址,而不是值。

使用
新字符串(“a”)
时,它会创建一个新的内存位置。当您将对象(字符串是一个对象)与==进行比较时,它会比较内存位置,因此得到false。新的强制它创建两个不同的内存位置。“a”==“a”比较每个的内存位置,因为它们是字符串文字,所以它们具有相同的内存引用。比较字符串的正确方法是使用string类中的
.equals()
方法。

“a”==“a”
-此处的过程将此字符串保留在文本段中,该段为只读数据。您只是比较这个字符串所在的文本段的地址。这会给你真实的感觉


但是
newstring(“a”)
将在堆中动态分配内存,并将字符串
“a”
复制到动态分配的位置。所以
newstring(“a”)=newstring(“a”)
将在堆中分配两次内存。你在比较这两个地址,它完全不同。因为它在堆中分配了两次内存。

String('a')
将生成两个不同的字符串对象,它们的内部标识符不同,因此不能将它们作为相等对象进行比较。我完全知道equals和==,所以它与链接无关。我不知道的是字符串文字被当作常量。我从来没有问过运算符,问题是“为什么相同的语法有不同的行为”。我后来编辑,所以我具体到了真实的东西:第二部分或者为什么说“a”==“a”是true@user1352530如果您正确理解链接问题的含义,那么您就不会问这个问题。是的,因为我认为“a”是新字符串(“a”)的别名,我永远不会说编译器足够聪明,可以查看这个字符串是否已被使用,并指向内存中已分配的与内容匹配的对象。这是一个语法问题。我猜than 3==3也可能是真的,任何具有相同LGIC内容的原始类型都可以重新分配?我猜字符串a=“a”和字符串b=“a”也会指向相同的物理对象,这不是指针理论中的正常预期行为。这更像是编译器的微优化。例如,只需尝试通过匿名类对大多数其他对象执行相同的操作。
string a=“a”;字符串b=“b”;a==b
不会编译:是
String
不是
String
,也是“a”==b”返回false,不是true。我认为这是一个输入错误,他指的是String a=“a”和String b=“a”是的,这是一个输入错误,很抱歉。谢谢你的帮助,不需要为它的价值道歉,该构造函数参数也将与其他文本相等-是新对象的构造导致了差异的发生。目前还没有人真正说明这一点,而且这是相关的:在该池中找到的字符串文本值也被称为“内部值”或“内部值”,可通过String.intern方法获取<代码>(新字符串(“a”).intern())=“a”It在许多情况下,使用intern值允许您使用
=
而不是
equals
,从而实现更高的性能,但是您必须确保所有值都是intern'ed。@PlatinumAzure:两者都是有效点。感谢您添加评论。