持有对象 --随笔

java容器诞生的意义:

       通常程序总是根据运行时才知道的某些条件去创建对象(例如当你执行一条查询语句返回多个对象)。但是在返回之前你是不知道它会返回多少个对象给你,甚至也不知道返回的类型。为了解决这种在任意时刻贺任意位置创建任意的对象,就不能像之前的new()来创建对象,并用其引用来持有每一个对象了。

      1.List

       list接口实现collection,但在其基础上添加了大量的方法,使得可以在list的中间插入和移除元素。

       有两种类型的list

       a、基本的arraylist,它常用于随机访问元素,但是在list的中间插入和移除元素时较慢。

       b、linkedlist,它通过代价较低的在list中间进行的插入和删除操作,提供了优化的顺序访问。linkedlist在随机访问方面相对比较慢,但是它的特性集较arraylist更大。

       由于两个特性不同我们在随机访问时选择arraylist,在进行删除插入操作时会选择linkedlist。

       下面时几个简单list接口的方法介绍,详情找api即可

       contains()方法来确定某个对象是否在列表中

       remove()移除某个对象

       indexof()来发现该对象在list中所处的第一个索引位置

       subList(int fromIndex, int toIndex) 方法允许你很容易的从较大列表创建一个片段,fromIndex起始索引(包含),toIndex结束索引(不包含)

       containsAll() 方法来判断多个或者一个片段是否再列表中

       toArray()方法,可以将任意的conllection转换为一个数组。这是一个重载方法,其无参版本繁华object数组,但是如果你向这个重载版本传递目标类型的数据,那么他将产生指定类型的数据,如果参数数组太小,存放不下list的所有元素,toarraylist()将会创建一个合适尺寸的数组。

      2、迭代器

       任何的容器类都必须以某种方式可以插入元素并将他们再次取回。对list,add()是插入元素的方法之一,而get()是取出元素的方法之一。对于map则是通过键值对进行存取。

       如果从更高的角度思考,会发现这里有个缺点:要使用容器必须对容器的确切类型编程。初看起来没什么不好,但是考虑下面的情况:如果原本是对着list编码的,后来发现如果能够把相同的代码应用于set,将会显的更方便,此时应该怎么做?难道你需要重新用set编码吗?

     迭代器的(一种设计模式)可以达到此目的。迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。

     java的iterator只能单向移动,这个iterator只能用来:

     1、使用方法iterator()要求容器返回一个iterator。iterator将准别好返回序列的第一个元素。

     2、使用next()获得序列中的下一个元素。

      3、使用hasNext()检查序列中是否还有元素。

      4、使用remove()将迭代器新近返回的元素删除。

     通过最上面红色标记的话我们大概已经才想到许多东西,没错,iterator真正的威力就是能够遍历序列的操作与序列底层的结构分离。这是由于这个特性我们有时会认为:迭代器统一了对容器的访问方式。

     例如:arraylist<pet> pets = pets.arraylist(8);

                linkedlist<pet> petl = new linkedlist<pet>(pets);

                hashset<pet> petset = new hashset<.pet>(pets);

                iterator<pet> t1 = pets.iterator();

                iterator<pet> t2 = petl.iterator();

                iterator<pet> t3 = petset.iterator();

      listiterator是一个更强大的iterator的子类型,它只能用于各种list类的访问。尽管iterator只能向前移动,但是listiterator可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。你可以通过listiterator()方法产生一个指向list开始处的listiterator,并且还可以通过调用listiterator(n)方法创建一个一开始就指向列表索引为n的元素处的listiterator。

       3.linkedlist

       linkedlist像arraylist一样实现了基本的list接口,但是在执行某些操作(插入移除)时比arraylist更高效,但是随机访问却要逊色点。

      linkedlist 添加了可以使其作用于栈、队列或双端队列的方法。

      4.栈

      5.set

      set 不保存重复的元素(至于如何判断元素相同则较为复杂)。如果你试图将相同对象的多个实例添加到set,那么它就会阻止这种重复的现象。set中最常被使用的是测试归属型,你可以很容易地询问某个对象是否在某个set中。正因为如此,查找就成为set中最重要的操作,因此你通常都会选择一个hashset的实现,他专门对快速查找进行了优化。

     set具有与collection完全一样的接口,因此没有任何额外的功能,不像前面有俩不同的list。实际上set就是collection,只是行为不同。(这是继承与多态思想典型的应用:表现不同的行为)set是基于对象的值来确定归属性的。用contains()来测试其归属型。

        6.map

        将对象映射到其它对象的能力是一种解决编程问题的杀手锏。map与数组和其他的conllection一样,可以很容易的扩展打多维,而我们只需将其值设置为map(这些map的值可以是其它容器,甚至是其它map)。因此我们可以很容易地将容器组合起来从而快速的生成强大的数据结构。例如,假设你正在跟踪拥有多个宠物的人,你所需只是一个map<person,list<pet>>。

        map可以返回它的键的set,它的值的collection,或者它的键值对的set。

      7.queue(队列)

      队列是一个典型的先进先出(FIFO).即从容器的一段放入事物,从另一端取出,并且事物放入容器的顺序是相同的。队列长别当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。

       8.collection

       collection是描述所有序列容器的共性的根接口,他可能会被认为是一个“附属接口”,即因为要表示其他若干个接口的共性而出现的接口。另外java.abstractcollection类提供了collection的默认实现,使得你可以创建abstractcollection的子类,而其中没有不必要的代码重复。

猜你喜欢

转载自blog.csdn.net/lihuihao2/article/details/83107325