Java 字符串对象实例

Java 字符串对象实例,java,Java,可能重复: 给定 是否将s和k都视为引用相同的String对象?是否存在String对象的单个实例?是的,Java应该对此进行优化,以便s==k来节省内存。 (引用s和k引用同一对象) 因为java没有指针,所以不能更改s或k指向的字符串, 但是你当然可以改变s或k指向的字符串。如果java允许指针, 然后改变s点的位置,上面的优化将产生不良后果 这就是为什么不应该使用像“LOCK”这样的字符串来锁定线程, 因为如果第三方jar文件执行相同的操作,您将在不知不觉中使用相同的对象作为线程锁,这可

可能重复:

给定


是否将
s
k
都视为引用相同的
String
对象?是否存在
String
对象的单个实例?

是的,Java应该对此进行优化,以便
s==k
来节省内存。 (引用s和k引用同一对象)

因为java没有指针,所以不能更改s或k指向的字符串, 但是你当然可以改变s或k指向的字符串。如果java允许指针, 然后改变s点的位置,上面的优化将产生不良后果

这就是为什么不应该使用像“LOCK”这样的字符串来锁定线程,
因为如果第三方jar文件执行相同的操作,您将在不知不觉中使用相同的对象作为线程锁,这可能会产生非常奇怪且难以发现的错误。

是的,Java应该对此进行优化,以便
s==k
来节省内存。 (引用s和k引用同一对象)

因为java没有指针,所以不能更改s或k指向的字符串, 但是你当然可以改变s或k指向的字符串。如果java允许指针, 然后改变s点的位置,上面的优化将产生不良后果

这就是为什么不应该使用像“LOCK”这样的字符串来锁定线程,
因为如果第三方jar文件执行相同的操作,您将在不知不觉中使用相同的对象作为线程锁,这可能会产生非常奇怪且难以发现的bug。

它们是相同的实例。它们是字符串常量池的一部分。因为字符串被认为是不可变的(反射表示不可变),所以这通常根本没有问题。

它们是相同的实例。它们是字符串常量池的一部分。由于字符串被认为是不可变的(反射表示不可变),这通常根本没有问题。

。我从来没有想过!非常感谢您的回复,先生!先生,我在同步块中使用字符串对象作为同步对象。每次通过从构造函数参数中获取值来创建新线程时,都会为String对象赋值。因此,每次对象实例更改时,都无法实现同步。但是当使用相同的字符串值时,它同步了线程。这让我得出结论,创建了单个对象实例。这就是我问这个问题的原因。你给了我问题的真实答案。是的,在Java编程论坛上,程序员们认为两个字符串都可以创建一个实例,也可以不创建一个实例。我从来没有想过!非常感谢您的回复,先生!先生,我在同步块中使用字符串对象作为同步对象。每次通过从构造函数参数中获取值来创建新线程时,都会为String对象赋值。因此,每次对象实例更改时,都无法实现同步。但是当使用相同的字符串值时,它同步了线程。这让我得出结论,创建了单个对象实例。这就是我问这个问题的原因。你给了我问题的真实答案。是的,在Java编程论坛上,程序员认为两个字符串都可以创建单个实例,也可以不创建单个实例。
String s= "God";
String k= "God";