• 持有对象(看think in java)


     

    思考为什么要引入容器这个概念?

    Java有多种方式保存对象(应该是对象的引用),例如使用数组,数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定尺寸的,你必须视线知道你要需要多少个对象。但是在一般的情况中,你在写程序中并不知道将需要多少个对象,或者是否需要更加复杂的方式来存储对象,因此数组尺寸固定很不爽!

    为了解决上述问题,引入了容器的概念。容器提供了完善的方法来保存对象,你可以使用这些工具来解决数量惊人的问题。Java日容器类可以自动调整自己的尺寸,因此与数组不同,你可以将任意数量的对象放到容器中,并不担心容器设置为多大。

    基本概念    

    java容器类库用途是保存对象。分为2类:

     1. Collection

          一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与插入的顺序相同)。

     2. Map

          一组成对的键值对对象,允许使用键来查找值,将数字和对象关联到一起。映射表允许我们使用另一个对象来查找某个对象,也被称为关联数组或字典。Map很强大!

    应尽量使用接口去声明对象,例如使用List接口声明对象:

    List<Apple> apples = new ArrayList<Apple>(); 

    而代替ArrayList<Apple> apples = new ArrayList<Apple>(); 因为你可以很方便的修改你的实现,就像下面这样:

    List<Apple> apples = new LinkedList<Apple>(); 

    但是这种方法并总是好的,因为某些类有额外的功能,例如:LinkedList类具有在List接口中未包含的方法,而TreeMap类也具有在Map接口中未包含的方法。如果你们需要这些方法,就不能向上转型成为更通用的接口。

     

       创建出一个具体类的对象,将其转型为对应的接口,在其余的代码中都使用这个接口。

     

    ***Arrays类 Collections类

        包含一些常用的排序 查询 转换等静态方法

         class A{}

           class AA1 extends A{}

           class AA2 extends A{}

           class AAA1 extends AA1{}

           class AAA2 extends AA1{}

     

           public class MyTest {

                 public static void main(String[] args) {    

                      List<A> list1=Arrays. asList ( new AA1(), new AA2()); //right

                      List<A> list2= Arrays. asList ( new AAA1(), new AAA2()) ; //wrong

                      List<A> list3=Arrays.<A> asList ( new AAA1(), new AAA2()); //right

                }

          }

            第二种asList,由于添加的是AAA1 AAA2对象,默认应为List<A1>,所以出错,需在asList前声明类型,但

              List<A> list=Arrays. asList ( new AA1(), new AA2());

                      Collections. addAll (list, new AAA1(), new AAA1() );

        Collectionsaddall方法正确,因为第一个参数说明了list的类型。

    List类型

    List接口在Collection的基础上添加了大量的方法,使得可以在List中间插入和移除元素。

       1 ArrayList和 LinkedList

        都按照被插入的顺序保存元素,区别在于执行某些操作时的性能。且LinkedList包含的操作也多于ArrayList.

    (1)ArrayList  :长于随机访问元素,但是在List的中间插入和移除元素时较慢。

    你可以把ArrayList  当做“可以自动扩充自身的数组”来看待,使用ArrayList也相当简单:创建一个实例,用add()插入对象;然后用get()访问这些对象,此时需要索引,就像数组一样,但是不需要方括号。ArrayList还有一个size()方法,使你知道有多少个元素添加进来,从而不会不小心因索引越界而引发错误。

        (2)LinkedList:在List中间插入删除较快,提供优化的顺序访问。随机访问时较慢,特性集较ArrayList  大。

        各种Queue以及栈的行为,由LinkedList提供支持。

    Set类型

        1.HashSet TreeSet LinkedHashSet 

        输出显示在Set中,每个相同的项只保存一次,但存储的方式不同:

         (1)  Hashset存储方式复杂,但保证了最快的获取速度

       (2)TreeSet按照升序保存对象

       (3)LinkedHashSet按照添加的顺序保存对象

    Map

        可以使用键来查找对象,类似于数组下标。Map.put(key,value)插入数据,Map.get(key)查找数据。键要求唯一。存储方式不是顺序存储,速度快。不必指定Map的尺寸,因为它自己会自动的调整。

       (1)HashMap使用最快的查找技术,存储无顺序。

       (2)TreeMap按照比较结果升序保存。

       (3)LinkedHashMap按照插入顺序保存键,同时保留HashMap的查询速度

    迭代器(也是一种设计模式)

    容器缺点:使用容器,必须对容器的确切类型进行编程,但若像更换或扩展至其他容器,必须重写代码。迭代器可以解决这个问题,实现代码的重用。它是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。它是轻量级对象,创建的代价小。

    因此经常对迭代器有些奇怪的限制:

    1)使用方法Iterator()要求容器返回一个IteratorIterator将准备好返回序列中的第一个元素。

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

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

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

        迭代器能够将遍历序列的操作与序列底层的结构分离,它统一了对容器的访问方式,这是它的威力所在。

    Queue

        先进先出容器,是区域之间传输对象的可靠的途径,在并发编程中尤为重要。

        PriorityQueue确保调用peek() poll() remove() 时,获取的元素是队列中优先级最高的元素。即可以对队列中的元素进行排序操作。

    CollectionIterator

        都可以实现与底层容器的解耦。Collection可以使用foreach,看起来更清晰,但必须实现Collection接口中的方法,如果选择继承 AbstractCollection类,仍必须实现iterator方法和size方法。而在类内部使用Iterator则可以避免以上不足,是将队列 和消费队列的方法连接在一起耦合度最小的方式。

    foreach与迭代器

        实现了Iterable接口的类,都可以被用在foreach中。数组到Iterable之间必须进行显式转换。

        

     

    Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!
  • 相关阅读:
    Selector + 线程池 遇到的问题
    【转】Android TabActivity无法正常bindService解决方法
    Android 中的 Service 全面总结
    【转】IT 圈里有哪些经常被读错的词?
    【转】线程的7种状态及相互转换
    【eoeandroid 特刊】第117期打包网盘下载地址
    使用 Android 自带的 proguard 混淆源码
    Google+ 连接不上的解决办法
    【转】AsyncTask的用法
    winForm简单数据绑定
  • 原文地址:https://www.cnblogs.com/200911/p/2703135.html
Copyright © 2020-2023  润新知