【发布时间】:2015-02-05 06:59:43
【问题描述】:
我编写了一些代码来了解如果我将基元、可变或不可变对象的混合存储到 Array 对象中会发生什么。我可以在存储后修改它们,看看它是否正确取消引用这些东西并返回它们修改后的值。我没有得到我期望我的代码做的事情?我想我知道为什么并且想澄清这种理解是否正确。这是代码。
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 ;
}
}
可变类也在这里.....
/** * * @author 代码 sn-p 来自 stackoverflow.com * 不是线程安全的 */ 公共类 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: 哈希码=12:Type=java.lang.Integer:12 : Hashcode=13:Type=java.lang.Integer:13
1: 哈希码=1537249:Type=java.lang.String:2014 : Hashcode=1537248:Type=java.lang.String:2013
2: Hashcode=366712642:Type=xander.DirRefOrCopy.DriverApp3:Hashcode=366712642,2013 : Hashcode=366712642:Type=xander.DirRefOrCopy.DriverApp3:Hashcode=366712642,2013
3: 哈希码=815979831:Type=java.lang.Double:2.13 : Hashcode=300063655:Type=java.lang.Double:3.14
4: 哈希码=1537250:Type=java.lang.String:2015 : Hashcode=1537248:Type=java.lang.String:2013
5: 哈希码=1829164700:Type=java.lang.StringBuffer:UniKOrn : Hashcode=1829164700:Type=java.lang.StringBuffer:UniKOrn
6: 哈希码=2018699554:Type=xander.DirRefOrCopy.MutableInteger:id=2018699554 val=9 : Hashcode=2018699554:Type=xander.DirRefOrCopy.MutableInteger:id=2018699554 val=9
7: 哈希码=1311053135:Type=java.lang.StringBuffer:1939 : Hashcode=1311053135:Type=java.lang.StringBuffer:1939
8: 哈希码=76:Type=java.lang.Integer:76 : Hashcode=7:Type=java.lang.Integer:7
【问题讨论】:
标签: java arrays pointers memory