有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java字符串作为不可变对象

如果字符串是一个不可变的对象,那么是否可以恢复更改后的值? 我的意思是如果有一个字符串变量

String str="Hello";

如果改成

str="Hi!";

现在,我们知道它将创建两个字符串对象“Hello”和“Hi!”目前str指向“嗨!”。所以我要问的是,是否可以将字符串“Hello”(前一个,不是通过创建新的)的引用分配给str,因为它存在于内存中的某个地方


共 (6) 个答案

  1. # 1 楼答案

    你能行

    str = "Hello"

    JVM试图在它的String pool中查找String{},如果它发现它将把变量str重新分配给Hello

  2. # 2 楼答案

    由于字符串“Hello”仍在字符串池中,并且将在那里停留一段时间,因此可以引用任何变量:

    str = "Hello";
    str = "Hi";
    String s = "Hello"; //its the same Hello as the first one
    

    唯一不引用同一字符串的情况是i you do

    String s = New String ("Hello"); //this will be a different "Hello" from the first one.
    
  3. # 3 楼答案

    答案是肯定的,当一个String被创建并放置在处理过的内存字符串池中时,在这种情况下,JVM搜索字符串池以查看是否已经存在等效字符串。如果是,则返回对相同对象的引用。如果不是,则将其添加到字符串池并返回引用。因此,可以创建或不创建新对象

  4. # 4 楼答案

    当您执行str = "Hi";操作时,str的第一个值将被覆盖,并且不会出现在RAM中。 如果要保留其值,需要将其存储在临时变量中:

    String str = "Hello";
    String temp = str;//store Hello in temporary variable
    str = "Hi!" ;
    str = temp ; //first value is back
    

    您还可以像使用以前值的历史记录或存档一样使用Arraylist<String>

  5. # 5 楼答案

    是的,你能做到。Java使用字符串池。因此,如果你这样做:

    String str = "abc";
    str = "def";
    str = "abc";
    

    str现在将从一开始就指向原始的“abc”

    但是,如果使用new字符串,则可以通过调用String的intern方法强制它们相同。此方法将确保返回的字符串位于内存中的共享字符串池中

    String str1 = new String("abc").intern();
    String str2 = new String("abc").intern();
    

    现在,str1 == str2,这意味着它们指向同一个字符串对象


    要回答是否可以撤消作业的问题:。你的问题是关于字符串的,但同样的想法适用于所有东西

    int k = 4;
    k = 9;
    // now reverting to the "previous value" is impossible without hardcoding 4 again
    k = 4;
    

    您可能认为使用字符串时情况有所不同,但事实并非如此。唯一的区别是字符串对象在内存中的某个位置,而int在内存中只有4个字节

  6. # 6 楼答案

    1. 您的代码创建零个对象。所有字符串文本都是在类加载时创建的,在执行任何代码之前

    2. 在代码中使用相同字符串文字的地方,都引用同一个对象。因此,在任何时候再次引用"Hello"字符串都非常容易