证明String的程序是不可变的

时间:2015-01-12 12:52:48

标签: java

在一次采访中,他们让我写一个程序来证明String是不可变的。我不知道该写什么,有人请帮助我吗?'

7 个答案:

答案 0 :(得分:4)

使用类sun.misc.Unsafe并更改String的内容,以证明相反。你应该知道什么时候不可能。

import sun.misc.Unsafe; import java.lang.reflect.Field;

class Main {
    static Unsafe getUnsafe() throws Throwable {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    }

    public static void main(String[] args) throws Throwable {
        String a = "abcdef";
        Unsafe u = getUnsafe();
        int stringOffset = 40; //this might be platform dependant I used guessing in a loop and keept what whorked.

        System.out.println(a);  // abcdef

        u.putChar(a,stringOffset + 0 * u.ARRAY_CHAR_INDEX_SCALE, 'g');
        u.putChar(a,stringOffset + 1 * u.ARRAY_CHAR_INDEX_SCALE, 'h');
        u.putChar(a,stringOffset + 2 * u.ARRAY_CHAR_INDEX_SCALE, 'i');

        System.out.println(a);  // ghidef
    }
}

由于使用了不安全的

,您可能会收到警告

答案 1 :(得分:1)

要显示字符串是不可变的,您必须显示一旦创建字符串,您就无法更改它。因此,您必须证明该类的所有公共方法都不会改变它。但是你也必须表明你不能从中继承,因为这可能是打破这种特性的一种方式(或者它的状态不能被改写者改变)。

答案 2 :(得分:0)

使用字符串文字创建的字符串对象存储在字符串常量池中,并且池中的任何两个对象都不能具有相同的内容。

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

    String s1 = "java";
    String s2 = "java";

    System.out.println("No modification is made");

    referenceCheck(s1,s2);

    s1 = s1.concat("code");

    System.out.println("After modification");

    referenceCheck(s1,s2);

}


public static void referenceCheck(Object x, Object y)
{
    if(x==y)
    {
        System.out.println("Both objects points to same reference");

    }

    else
    {
        System.out.println("Both pointing to different object");
    }
}

在修改之前,它们指向同一个对象。一旦我们尝试使用's1'更改对象的内容,就会在池中创建一个新对象,并将其引用分配给s1。如果字符串是可变的,那么即使在修改之后,s1和s2也应该指向同一个对象。

答案 3 :(得分:0)

以下是示例:

public class Immutable {

    public static void main(String[] args) {
        String str1 = "123";
        String str2 = "123";

        System.out.println(str1 == str2);         //Output : true

        str1 = str2 + "456";

        System.out.println(str1 == str2);         //Output : false
    }
}

答案 4 :(得分:0)

要证明不变性,请使用以下代码:

public class Mutable {

    public static void main(String[] s) {

        String a = "abc";
        String b = a;
        a = a.concat("d");
        System.out.println(a);
        System.out.println(b);

        StringBuffer c = new StringBuffer("abc");
        StringBuffer d = c;
        c.append("d");
        System.out.println(c);
        System.out.println(d);

    }
}

可变类将显示相同的结果,因为变量的引用相同。

答案 5 :(得分:-1)

    String first = "CATCAT";
    String second = first.replace('A', 'Z');
    System.out.println("First = " + first);
    System.out.println("Second = " + second);

初始字符串仍然相同。

答案 6 :(得分:-1)

可能你可以这样做

 String str1="String1";  
 String str2 = "String2";  
 System.out.println("str1 " + str1.hashCode());  
 System.out.println("str2 = " + str2.hashCode());  

 str1=str1 + str2;  
 System.out.println("The hashcode str1 changed : " + str1.hashCode());

因此证明了