String[] names = {"ABC", "XYZ", "zoo"};
String s = names [1];
System.out.println(System.identityHashCode(names[1]) == System.identityHashCode(s));
names [1] = "cat";
System.out.println(System.identityHashCode(s));
1、这里第一段,这里声明了一个names的变量,因为是引用类型,此时会开辟一个内存地址,内存空间为3个长度,其中的每项也会开辟一个内存空间存放,"ABC", "XYZ", "zoo",然后通过下标去对应分别的内存空间。
2、第二行代码,我们声明一个叫s的变量,因为是引用类型,这里也会开辟一个内存地址,这里的s = names[1], 实际上是s指向了names[1]的地址。
3、第三行代码,这里我在names[1]复制前,用System.identityHashCode方法查看它是否一致,也就是一楼说的是否是同一把钥匙,这里打印结果是true
4、第四行代码,来到names[1] = "cat"这行,这里cat会开辟一个新的内存空间,然后names[1] 指向它,其实的内存引用已经发生变更了
4、第五行代码,来到names[1] = "cat"这行,这里cat会开辟一个新的内存空间,然后names[1] 指向它
5、第六行代码,为了验证是否是同一个引用指向,这里我执行代码System.out.println(System.identityHashCode(names[1]) == System.identityHashCode(s)),执行结果为false,说明names[1] = 'cat', 确实发生了内存指向的改变
6、经过上面的验证后,最终输出结果为"XYZ"
总结:这是我逐行分析的结果,如果有不对的地方,还请大家多多指出。
Sign in to make a reply
Never Settle
String[] names = {"ABC", "XYZ", "zoo"};
String s = names [1];
System.out.println(System.identityHashCode(names[1]) == System.identityHashCode(s));
names [1] = "cat";
System.out.println(System.identityHashCode(names[1]) == System.identityHashCode(s));
System.out.println(System.identityHashCode(s));
1、这里第一段,这里声明了一个names的变量,因为是引用类型,此时会开辟一个内存地址,内存空间为3个长度,其中的每项也会开辟一个内存空间存放,"ABC", "XYZ", "zoo",然后通过下标去对应分别的内存空间。
2、第二行代码,我们声明一个叫s的变量,因为是引用类型,这里也会开辟一个内存地址,这里的s = names[1], 实际上是s指向了names[1]的地址。
3、第三行代码,这里我在names[1]复制前,用System.identityHashCode方法查看它是否一致,也就是一楼说的是否是同一把钥匙,这里打印结果是true
4、第四行代码,来到names[1] = "cat"这行,这里cat会开辟一个新的内存空间,然后names[1] 指向它,其实的内存引用已经发生变更了
4、第五行代码,来到names[1] = "cat"这行,这里cat会开辟一个新的内存空间,然后names[1] 指向它
5、第六行代码,为了验证是否是同一个引用指向,这里我执行代码System.out.println(System.identityHashCode(names[1]) == System.identityHashCode(s)),执行结果为false,说明names[1] = 'cat', 确实发生了内存指向的改变
6、经过上面的验证后,最终输出结果为"XYZ"
总结:这是我逐行分析的结果,如果有不对的地方,还请大家多多指出。