平常我们用数组来存放东西,数组存取确实挺方便的,但是数组的容量是个限制。每次存放东西时,必须判断是否超出范围了,太不灵活了,并且数组中的类型还必须是相同的类型,要是int都是int,哎,想放个string类型,必须重新new数组,当然不相同类型的东西放到一块确实不好,但是无论怎么样,就是不方便,不灵活啊。。
要想灵活,要想不受限制,就得找java容器:javaAPI所提供的一系列类的实例,用于在程序中存放对象。
java所提供的容器,容量这个嘛,不用担心,随便添加,至于添加类型,也不用担心,可以随便存放,可以存放一只狗,可以存放一个人,人与狗同在,相处融洽,快活自在,挺好挺好滴,蛮适合我的生活口味滴哈。。
java中提供的容器结构图如下,只有掌握此图就可以了,至于其中的方法什么的,我们到时候可以直接查api文档哈。
简单介绍一下这个图:
其中Set中的数据对象没有顺序并且不可以重复。所以每个人打印出来的东西顺序不同,很正常。
List中的数据对象有顺序并且可以重复。
Map接口定义了存储键值对方法,其中的键(Key)相当于一本书的目录,而值(value)相当于真正的内容。所以键Key不能重复。若是存在重复,则后面的内容会替代前面的内容。
LinkedList 和ArrayList 的区别:
LinkedList的底层的数据结构是链表形式,链表的内存空间是散列形式。
ArrayList的底层的数据结构是数组形式,数组的内存空间是连续的。
其中ArrayList的读取速度快,若是想读取某一个内存空间,比如最后一个,直接使用第一个+偏移量即可。
而LinkedList的读取速度慢,是一个节点next,一个节点next寻找。
但是。ArrayList 的修改速度慢。若是删除数组中某一个值,则其后的值会一个个不断向前移动,若是添加数组中某一个值,则其后的值会一个个不断向后移动。
而LinkedList的修改速度快,若是删除、添加链表中的一个节点,直接更改指针。
上述容器中虽然可以装载任何类型的对象,但是这样效率不高,为什么呢?因为向容器中存放的对象,完全当成object,即使存放的具体的Dog,还是存放的具体的Person。然后读取数据的时候,需要转型,把Object转化成相应的Person或者Dog。
所以,我们还是最后放同样对象吧,这样不需要转型,不用降低效率,是不是使用数组啊?数组可是存放的相同的对象啊。当然不是喽,数组容量可以一个限制,不爽。需要一种像java提供的容器 ,又可以像数组一样放同样的对象,那是什么呢?哈哈,那就是集合了两者的优点一身的泛型。。
泛型,容量当然没有限制,操作又方便,直接把对象add进去即可,丢掉一个对象直接remove即可。存放相同的类型的对象。
比如这个容器中完全是Dog类,到时候直接取出来即可,而不用再判断是否是Dog类了,不用再转成Dog类,因为前提就已经声明这个是装Dog的,List<Dog> c=new ArrayList<Dog>();不需装Person,否则后果自负哈。。
那紧接着把所有的好看的狗统统装进去了,此时我想看看我都装了那些狗哈,如何办?这就涉及到了一个接口Iterator,涉及到一个方法iterator。此方法iterator,所有实现上图中Collection接口的类都实现了此iterator方法。
Iterator对象称作迭代器,用以方便地遍历。
Iterator中的方法:hasNext:判断是否还有下一个。next:表示下一个对象。哎呀,so convenient!!!!!
for(Iterator<Dog> it =c2.iterator();it.hasNext();)
{
Dog dog =it.next();
System.out.println(dog);
}
所有的狗我看了一遍,但是我想看看哪个狗最帅,哪个狗年龄最大?怎么办?哈哈,这有涉及到一个接口Comparable 。
若想排序,只要实现Comparable接口,重写其中的compareTo方法即可。
恩呢,java容器只要掌握上述那个图,以及Iterator接口、Comparable接口。若遇到不懂的方法可以及时找帮助哈。