如果字符串对象被中断,那么为什么改变一个不会影响其他对象

时间:2015-05-22 19:14:45

标签: java

如果字符串对象被实习,那么为什么改变其中一个不会影响其他

public class EqualExample {
public static void main(String[] args) {

    String str = new String("Hello");
    String str1 = new String("Hello");

    System.out.println(str == str1);
    System.out.println(str1.equals(str));

}

}

上述程序的输出将是

假 真

    public class EqualExample {
    public static void main(String[] args) {

    String str = "Hello";
    String str1 = "Hello";

    System.out.println(str == str1);
    System.out.println(str1.equals(str));

}

}

上述代码的输出是

真 真

这是因为在字符串池中存在Heloo alredy所以它实际上是字符串并引用相同的对象然后为什么如果我将str1更改为“heloo java”然后为什么str仍然具有值“heloo”。因为它们引用相同的对象所以str的值必须改变     公共类EqualExample {         public static void main(String [] args){

    String str = "Hello";
    String str1 = "Hello";

    System.out.println(str == str1);
    System.out.println(str1.equals(str));

    str1="Heloo java";
    System.out.println(str+str1);
    System.out.println(str == str1);
    System.out.println(str1.equals(str));

}

}

输出true 真正 HelooHeloo java 假 假

5 个答案:

答案 0 :(得分:11)

str1不是字符串。它是对String对象的引用。通过做

str1 = "Heloo java";

您没有修改String对象,只需将引用点指向另一个不同的String对象。

在:

str --------> "Hello"
                ^
str1 -----------|

后:

str --------> "Hello"

str1 -------> "Heloo Java"

更改对象将包括执行类似

的操作
str1.setCharacters("Heloo Java");

但是这样的方法不存在,因为字符串是不可变的。因此,他们的角色不能被修改(除非使用肮脏的反射技巧)。

答案 1 :(得分:5)

你有两个指向内存中相同地址的指针。更改一个值意味着重定向一个指针而另一个指针保持不变。

答案 2 :(得分:1)

您无法更改现有字符串。字符串不可变。当您说“将str1更改为"heloo java"'实际上,您正在为不同的不可变对象分配引用。

答案 3 :(得分:1)

根据Java DocsString是不可变的。那就是:它们不会改变,或者一旦创建:它们永远不会改变(对象的状态,而不是参考变量。)

但是,您可以在现有引用变量中更改引用变量,创建新的String对象。如果没有引用变量指向" old" String对象," old" String您的程序认为对象无法访问,垃圾收集器可能会清除它。

在实践中,在代码中解释说明:

    public static void main(String[] args) {

    String s1 = "Test 1";

    String s2 = s1;

    System.out.println("s1: "+s1+ " and s2: "+s2);

    s2 = "String 2";

    System.out.println("s1: "+s1+ " and s2: "+s2);

    //Garbage Collector will not clean the "String 1" because we still have the s1 Reference Variable pointing. 

}

输出:

  

s1:测试1和s2:测试1

     

s1:测试1和s2:字符串2

正如您所提到的,为了提供更好的性能,如果创建的新String是"有意义的等于"则JVM不会在堆中创建新的String对象。 (将String.equals方法传递给Heap中的现有方法)。但您可以在引用变量中强制new String("test 1")创建此项。

String的不可变状态是为了保证您的计划的良好工作。想象一下,如果你有两个String的引用和其中一个变化,那将是多么危险:另一个也会改变,奇怪的事情可能会发生。

Java类也是不可变的;像包装类:java.lang.Integerjava.lang.Double,....

我已经向您展示了垃圾收集器,以便您深入了解与堆中对象的引用变量关系。

答案 4 :(得分:1)

String str = "Hello"

平均值

if "Hello" exists in the pool,
      then return "Hello" instance reference from pool
else
    create an object "Hello". Keep the object in the pool, then return reference

但是

String str = new String("Hello");

装置

始终创造"你好"对象,无论它是否存在于池中。