在一次采访中,他们让我写一个程序来证明String是不可变的。我不知道该写什么,有人请帮助我吗?'
答案 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());
因此证明了