集合:升级版数组

来源:互联网 发布:公安机关优化发展环境 编辑:程序博客网 时间:2024/06/03 18:59

       以前学习数组的时候,感觉特别方便,定义一个类型,就可以往里面储存很多数据;但是随着要求越来越多,越学到最后越觉得数组也不能满足自己的要求,于是集合出现在了我的视野。集合是在数组的基础上更加完善了其功能,解决了能很多数组不能解决的问题。众所周知,数组的长度必须在被定义出来之后就得确定。所以以后数组里的数据作善增修改的时候,就不能做了。比如一个数组的元素用了一段时间后,又有新的数据需要添加,数组就添加不了了。同时,如果数据用到了一定时期,里面有些数据就过期了,不再起到任何用处,这时这些数据就成了垃圾,如果删掉他们的话,里面的数据就会成为初始的样子,这样又会浪费内存。所以数组的弊端就会很明显,集合作为数组的升级版,很完美的解决了这些问题。

       集合的基类是Collection,基本上所有的集合都是在他的基础上发展和完善的,它的子类有List 和Map,这两个一个是所有单列集合的基类(List),一个是所有双列集合的基类(Map)。集合本身具备自动增大容量的功能,所以当集合的容量太小的话,集合就会自动扩容到原来的1.5倍。即,假如一个集合的原来容量是10的话,一旦发现容量不够,集合就会自动扩容到15,但当所有元素都加载进来之后,如果元素没有达到15的话,集合又会把容量缩小到元素的个数。List可以通过下标来完成对象的操作,Collection不确定是否有序,所以不能通过下标对象操作。list集合有序的而且值可以重复,但是与List集合相对应的是无序的,值不能重复的Set集合。

        List集合下面又会有LinkedList 和ArrayList集合,两种集合各有优劣, ArrayList查询效率高,但是增加和删除数据慢,集合中元素在内存中是一段连续的地址。 LinkedList增加和删除数据比较快,但查询比较慢,集合中的元素内存地址是杂乱无章的。这里需要注意的是有序不是按照自然排序,而是元素是怎样添加进去的,元素就怎样取出来。所以List集合下面的所有子集都可以通过下标来取值。ArrayList底层维护了一个Object[]用于存储对象,默认数组的长度是10。可以通过new ArrayList(20)显式的指定用于存储对象的数组的长度。当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。

    由于ArrayList是数组实现,在增和删的时候会牵扯到数组增容,以及拷贝元素.所以慢。数组是可以直接按索引查找,所以查找时较快

可以考虑,假设向数组的0角标未知添加元素,那么原来的角标位置的元素需要整体往后移,并且数组可能还要增容,一旦增容,就需要要将老数组的内容拷贝到新数组中.所以数组的增删的效率是很低的.

        LinkedList的特点是通过链表的方式实现,增删快,查找慢。由于LinkedList:在内存中的地址不连续,需要让上一个元素记住下一个元素.所以每个元素中保存的有下一个元素的位置.虽然也有角标,但是查找的时候,需要从头往下找,显然是没有数组查找快的.但是,链表在插入新元素的时候,只需要让前一个元素记住新元素,让新元素记住下一个元素就可以了.所以插入很快。由于链表实现,增加时只要让前一个元素记住自己就可以,删除时让前一个元素记住后一个元素,后一个元素记住前一个元素.这样的增删效率较高,但查询时需要一个一个的遍历,所以效率较低。

为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).。

Collection进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。

Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素

用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。

对象的相等性

引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖ObjecthashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。

   如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true

该集合中没有特有的方法,直接继承自Collection

暂时就这样吧!感谢众位观光鄙陋之作,一直以来写博客都没有写出感觉,所以写的东西平平淡淡,感觉像是再复述上课内容。所以很抱歉


0 0
原创粉丝点击