Java引用的深入理解学习
透过几个小例子,深入理解Java中引用,对象,实用关系
遍历list
static void methoda() {
List<String> strList = new ArrayList<String>();
String[] strs = {
"A A", "B B", "C C"
};
for (String m : strs) {
strList.add(m);
}
for (String s : strList) {
strList.add(s);
System.out.println("s: " + s);
}
}
很普通的遍历list, 很显然遍历过程对strList修改,会抛出异常java.util.ConcurrentModificationException,产看源码:
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
发现每次对list迭代,调用next方法时都有检测list长度是否有更改,有则抛出异常
strList为实例的一个引用,对strList操作就是对原来的对象操作,程序Carsh.
真的想要遍历时操作list的化可以这样:
for (int i =strList.size() - 1 ; i >= 0; i--)
这个程序会崩溃吗?
同样的,下面方法目的是依次打印数组中的每个字符.
但是是在循环内部又对要打印的strs变量赋值,程序会按照设计运行吗?
//Show me the code
static void method(){
String[] strs = {"A A", "B B", "C C"};
for(String s : strs){
strs = s.split(" ");
for(String m : strs){
Ststem.out.println("m: " + m);
}
}
}
这个程序会Crash吗?会按照程序设计输出吗?
首先需要理解 引用 的意思,strs只是数组 {“A A”, “B B”, “C C”} 的一个引用,
此处String 与 List赋值方式不同
list是对其引用操作,导致原对象更改,此处strs = s.split(” “),只是新 new了个对象给strs ,原来的数组并没有被修改,所以程序正常运行:
输出:
m: A
m: A
m: B
m: B
m: C
m: C