我编写了一些代码来理解如果将原始对象,可变对象或不可变对象存储到Array对象中会发生什么情况。我可否在存储后修改它们,看看它是否正确解除了这些事情并返回了修改后的值。我没有得到我期望的代码要做的事情?我想我知道为什么,并且想澄清这种理解是否正确。这是代码。了解对Java Object Object中对象的引用
public class DriverApp3 {
private static String CYEAR = "2014" ;
private static StringBuffer CYEARFLG = new StringBuffer("1914") ;
public double money = 2.13 ;
public static void main(String args[])
{
Integer j = 12 ;
DriverApp3 d = new DriverApp3();
StringBuffer sb = new StringBuffer("Unicorn");
MutableInteger mi = new MutableInteger(67);
int i = 76 ;
Object[] parseXML = new Object[]{j,DriverApp3.CYEAR,d, d.money,DriverApp3.CYEAR, sb, mi, DriverApp3.CYEARFLG,i};
// 0 1 2 3 4 5 6 7 8
System.out.println("======chng of all original values ==========");
j = 13 ;
d.money = 3.14 ;
parseXML[4]="2015";
DriverApp3.CYEAR = "2013";
mi.set(9);
sb.replace(3,5,"KO");
DriverApp3.CYEARFLG.replace(0,4,"1939");
i = 7 ;
Object[] chngdO = new Object[]{j,DriverApp3.CYEAR,d, d.money,DriverApp3.CYEAR, sb, mi, DriverApp3.CYEARFLG,i};
int cnt = 0 ;
for (Object m : parseXML)
{
Integer s_objid = m.hashCode();
String clsType = "Type="+m.getClass().getTypeName();
String clsName = "SimplName="+m.getClass().getSimpleName();
String canName = "CanonName="+m.getClass().getCanonicalName();
Object n = chngdO[cnt];
Integer ns_objid = n.hashCode();
String nclsType = "Type="+n.getClass().getTypeName();
String nclsName = "SimplName="+n.getClass().getSimpleName();
String ncanName = "CanonName="+n.getClass().getCanonicalName();
System.out.println(cnt + ": Hashcode=" + s_objid + ":" + clsType + ":" + m + "\n " + ": Hashcode=" + ns_objid + ":" + nclsType /*+ ":"+ clsName+ ":"+ canName*/+ ":" + n + "\n");
cnt++ ;
}
}
@Override
public String toString()
{
return "Hashcode="+this.hashCode() + "," + DriverApp3.CYEAR ;
}
}
的可变类也在这里.....
/** * * 从stackoverflow.com @author代码片段*不是线程安全的 */ 公共类MutableInteger {
private int value;
public MutableInteger(int value) {
this.value = value;
}
public void set(int value) {
this.value = value;
}
public int intValue() {
return value;
}
public String toString()
{
return "id="+this.hashCode()+" val=" + this.value ;
}
}
我的应用程序的输出是.....
======chng of all original values ==========
0:Hashcode方法= 12:种类= java.lang.Integer中:12 :Hashcode方法= 13:种类= java.lang.Integer中:13
1:Hashcode方法= 1537249:种类= java.lang.String中:2014 :Hashcode方法= 1537248:种类= java.lang.String中:2013
2:Hashcode方法= 366712642:种类= Xander的。 DirRefOrCopy.DriverApp3:Hashcode = 366712642,2013 :Hashcode = 366712642:Type = xander.DirRefOrCopy.DriverApp3:哈希码= 366712642,2013
3:哈希码= 815979831:种类= java.lang.Double中:2.13 :哈希码= 300063655:种类= java.lang.Double中:3.14
4:哈希码= 1537250:类型= java.lang.String中:2015年 :Hashcode方法= 1537248:种类= java.lang.String中:2013
5:Hashcode方法= 1829164700:种类= java.lang.StringBuffer中:UniKOrn :Hashcode方法= 1829164700:种类= java.lang.StringBuffer:UniKOrn
6:Hashcode = 2018699554:Type = xander.DirRefOrCopy.MutableInteger:id = 2018699554 val = 9 :Hashcode方法= 2018699554:种类= xander.DirRefOrCopy.MutableInteger:ID = 2018699554 VAL = 9
7:Hashcode方法= 1311053135:种类= java.lang.StringBuffer中:1939年 :Hashcode方法= 1311053135:种类= java.lang中.StringBuffer:1939
8:Hashcode方法= 76:种类= java.lang.Integer中:76 :Hashcode方法= 7:种类= java.lang.Integer中:7