先看集合的原理。
集合是什么?集合就是将数据封装,然后将封装好的对象进行关系.不明白?
那这样说。一个类里面可以包括N个数据和N个方法,你现在有一个数据假设是int,你想将这个int数据放进集合里,那么集合是怎么做的呢?其实集合就是在一个类的内部定义了一个int的变量,将你这个int记录了下来,你再来一个int他再重新生成一个对象,再把你这个int在它内部的成员记录下来,他还有别的属性和方法,主要是为了连接自身其它对象用的。
举个形象点的例子。
你有三个数,int a=1,b=2,c=3;你想将这三个数放进集合。假设这个集合是一个链表集合
此时集合会在内部产生一个包装类,这个包装类会自动建立三个对象,这外包装类它里有几个属性,一个是int就是用来记录你的变量的比如a,一个指向自身类的引用是记录下一个对象的。
大概简单用代码写一下就是。
假设包装类名为array
class Array
{
Array(int num,Array next){this.num = num;this.next = next;}
int num;
Array next;
}
三个变量进入集合后,其实集合内的代码就是
Array ar = new Array(a,null);
ar = new Array(b,ar);
ar = new Array(c,ar);
然后将ar返回给集合记录,集合本身只记录ar就可以了,然后通过ar.next就可以一直向下找到其它的集合成员。
当然这是简单的单向链表,java中的LinkedList使用的双向是更复杂一点,我为了给你演示就只说单向的了。
从上面的例子你应该可以看的出集合的原理是什么了,其实就是把原来的数据外面再包一层数据,然后将这个新的数据之间建立相互的联系,而被包装后的新数据是一个对象,同一集合中的新包装对象必须是同一个类创建出来的,否则他们之间怎么建立联系呢?
就像数组一样,一个6个元素的数组,你总不能让他前三个存int后三个存long吧。数组一被初始化时,就会向操作系统申请一块和这个数组大小相同的内存空间。比如数组是int有三个元素 ,那就是3*4=12个字节,int[] arr={1,2,3};执行到这句,系统就会在内存中找出一块大小大于或等于 12字节的空间,将空间的第一个地址交给arr来保管。然后arr通过每次移动4个字节的大小来找到arr数组中后面的元素位置。如果你一个数组中类型不相同,那么大小也就可能不相同,你让他怎么找?让他每次移动多少个字节去找后面的数据?int[] arr={1,2,3}; arr 移动一次就是4字节代表2了再移动一次4字节代表3了,你丫中间突然来个8字节的long 形,你让他怎么移?
由上可知数组中的元素 必须是同一类型,同理集合中的元素 也必须是同一类型产生的对象,否则arraylist这是个java数组集合,他就不知道一次要移动多少字节。他包装新数据时也不知道要包装什么类型的,提取数据时也不知道要提出来的到底是int还是long,只有这个数据在集合一建立时就确定了,他才能正常的执行后面的内存查找工作。
一个集合你写不写模板泛型,只要第一个元素一进去,这个集合可以添加的类型就已经被确定了。因为只要你一个元素进去,他里面那个自动包装对象就成型了。你再传一个新的类型进去,他那个包装类包装不了。如果再产生一个新的类去包装你新的数据类型,那么与之前的那个包装类就不是同一个类的对象了。大小不同先不说,他们之间根本没办法建立联系了。
就像上面写的代码一样,他包装类内部 有一个array类的引用 ,用来记录下一个对象的地址,如果你两个对象都不一样,他用什么类型去记录?当然可以用object来记录,可是这样以来,你取出来的时候你知道这个object包装类,里面包装的是哪个类型吗, |