黑马程序员技术交流社区
标题:
关于集合的引用是什么?
[打印本页]
作者:
李玉江
时间:
2013-6-1 17:34
标题:
关于集合的引用是什么?
class Demo
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
sop(al);
Iterator it =al.iterator();
while (it.hasNext())
{
Object obj=it.next();
if (obj.equals("java02"))
{
it.remove();
}
sop("obj="+obj);
}
sop(al);
//老师说将java02的引用从集合中删除了 。这个引用是角标吗?
//删除后那在打印集合的时候像数组一样没有al[1]了吗?
//应该不是吧也就是集合是怎么调用它的元素的?
}
}//在并发异常中如要用listIterator操作删除集合的元素,集合进行访问的时候不也会出错吗?
作者:
First
时间:
2013-6-3 19:07
首先要理解的是ArrayList 是动态的数组,
这样增加元素是会增加数组的长度,减少元素是会缩短数组的长度。
要实现这样的效果就要new 出新数组。
换句话说把原来那个数组里的元素遍历后重新放到一个新的数组中,这样是否可以理解?
贴个动态数组的例子,希望楼主能够理解我的观点:
/*
现在要求定义一个数组(Array),里面定义了一个整型数组,但是此整型数组属于动态分配大小,
即:所以大小由程序指定,并在此基础上实现以下的两个子类。
*反转类:可以将数组的内容反转排列
*排序类:可以对数组进行排序的操作
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MyDynamicArray {
public static void main(String []args){
ReverseArray al = new ReverseArray();
SortArray sa = new SortArray();
al.add(1);
al.add(15);
al.add(7);
al.add(19);
al.add(5);
al.add(29);
al.add(9);
/*
al.add(7);
al.add(19);
al.add(5);
al.add(29);
al.add(9);
sa.add(7);
sa.add(19);
sa.add(5);
sa.add(29);
sa.add(9); */
sa.add(1);
sa.add(15);
sa.add(7);
sa.add(19);
sa.add(5);
sa.add(29);
sa.add(9);
System.out.println(al.toString());
//System.out.println(al);
al.reverse();
System.out.println(al.toString());
System.out.println(sa.toString());
sa.sort();
System.out.println(sa.toString());
}
}
class Array {
private int [] array = new int[10];
private int size =0;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int get(int index){
return array[index];
}
public int set(int index, int element){
array[index] = element;
return get(index);
}
public boolean add(int i){
size++;
System.out.println(size);
if(size>10)
array = copyArray(array);
array[size-1] = i;
return true;
}
private int[] copyArray(int[] array){
int []array1 = new int[array.length+1];
for(int i = 0; i<array.length;i++){
array1[i] = array[i];
}
return array1;
}
public boolean remove(int index){
if(index>=size)
return false;
else{
int[] array1 = new int[size - 1];
for(int i = 0, count = 0; i<size;i++){
if(i == index)
continue;
array1[count++] = array[i];
}
array = array1;
size--;
return true;
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
Integer [] intList = new Integer[size];
for(int i = 0;i<size;i++){//注意角标越界。
intList[i] = get(i);
}
List list = Arrays.asList(intList);
return list.toString();
}
}
class ReverseArray extends Array{
public void reverse(){
int size = getSize();
int half = size>>1;
for(int i =0,x=0; i< half;i++){
x = get(i);
set(i, get(size-1-i));
set(size-1-i,x);
}
}
public void sort(){
int size = getSize();
for(int z=0,x=0;z<size-1;z++){
for(int y=z+1; y<size;y++){//y=z+1; 而不是1;
if(get(z)>get(y)){
x = get(z);
set(z, get(y));
set(y,x);
}
}
}
}
}
class SortArray extends Array{
public void sort(){
int size = getSize();
for(int z=0,x=0;z<size-1;z++){
for(int y=z+1; y<size;y++){
if(get(z)>get(y)){
x = get(z);
set(z, get(y));
set(y,x);
}
}
}
}
}
复制代码
作者:
王瀛
时间:
2013-6-4 00:06
我是这样理解的,在ArrayList集合中,"java02"这个对象有一个集合中的名字(索引、角标),当使用Iterator迭代器进行hasNext判断后,迭代器将这个集合中的名字告诉了外界,obj这时找到了对应的集合中元素。
在使用remove进行判断移除时,迭代器仅仅是将这个对象元素在集合中移除了,但是这个对象还是在的,他被obj指向,所以while循环内打印出来的相当于是集合中原来所有元素的遍历结果。
出循环后,打印的al就是迭代器进行了一轮操作后的集合元素
作者:
殇_心。
时间:
2013-6-4 16:16
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2