Java中的赋值
Java的数据类型分为基础类型和引用类型,两者赋值时分别发生了什么?
赋值实际上就是copy一个变量并将其赋给另一个变量,当变量类型为引用类型时,由于变量值为引用对象的内存位置,所以两个变量实际上指向同一个对象。
举个例子:
@Test
public void test(){
class A{
private int count;
public void setCount(int count){
this.count = count;
}
}
List<A> list = new ArrayList<>();
A var1 = new A();
list.add(var1);
System.out.println(list.get(0).count);
var1.setCount(1);
System.out.println(list.get(0).count);
}
//输出 0 1
这里还有一点是,ArrayList.add(e)
的内在实现是怎么样的?同一个变量可以重复add进去么?
ArrayList在内部使用一个数组Object[] Array
,所有操作发生在这个数组中:
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
它的add
实现如下:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Size Increments
elementData[size++] = e;
return true;
}
所以ArrayList
的add
只是对数组元素赋值,如果add
了同样的对象引用,则两个元素指向同一个对象。
同样的,ArrayList
的remove
方法也是对数组操作,将index+1
及之后的元素向前位移:
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}