持有对象

  Java是面向对象的编程语言,所有的实例都被称为对象。持有对象指的是获取对象并存放,他有很多种方式,比如:Student stu = new Student();这里创建了一个Student的对象并把它赋值给了变量stu,那么就称stu持有Student对象。

  通常,程序总是运行时根据知道的某些条件去创建对象,在此之前是不知道创建对象的类型和数量的。那怎么解决这个问题呢?要解决这个问题就不能用之前的例子来创建命名的引用持有,可以使用Java提供的容器来解决这个问题。容器中数组是不能解决这个问题的,因为数组长度是固定的,运行时程序是不知道具体需要创建多少对象。

  Java中有专门的容器类来处理这个问题,容器类提供了完善的方法来保存对象,你可以使用这些容器类来解决数量和存储类型的问题。容器类主要分为Collection和Map的子类。

  一、Collection,代表一组独立元素的序列,这些元素都服从一条或多条规则。它下面的主要子集有List、Set、Queue;

  二、Map是一组成对的“键值对”对象,使用键来查找值,Map也被称为“关联数组”,使用过PHP的会有深刻感受。

  Collection:

  1、List的实现类可以将元素维护在特定的序列中,能够对元素进行插入(set())、增加(add())、遍历(iterator()、foreach()、listIterator())、查找(get()、indexOf()、contains())、删除等操作;具体实现:

    --ArrayList,它的底层是以数组实现,但是它没有数组的长度限制,它的长度是通过加载因子来不断扩容的;由于是数组实现,它随机访问的速度对比LinkedList来说要快,插入和删除慢(元素的多少决定了变更元素的速度)。

    --LinkedList,它是以双向链表实现,在插入和删除元素的代价较低(变更元素的花费是固定的,与元素的多少无关);提供了顺序的优化访问元素;在随机访问方面比ArrayList慢。如果频繁对List集合进行插入和删除建议使用LinkedList,因为它的插入的花费是固定的。

    --Stack,“栈”通常是指“后进先出”,它分为栈底和栈顶,它的入口也是出口,最先进去的数据总是在栈底,最后进去的总是在栈顶;它是继承Vector来实现的,所以它是线程安全的。

  2、Set,保证集合元素的唯一性,这种唯一性在开发中需要自己去定义equals()和hashCode()方法,否则使用Object对象的默认equals()和hashCode()实现。Set的具体实现大多都是利用Map的实现类来进行存储实现的。具体实现类:

    --HashSet,专门对快速查找进行了优化,实际是HashMap对这方面进行了优化,HashSet之所以能实现无重复对象是因为它把存入的对象用Map的Key来进行存储,它能保证数据的唯一性,但不能保证数据的顺序,因为是散列实现。

    --TreeMap,是通过TreeMap来进行存储的,它能够保证元素的排序,需要开发者实现比较器(Comparable,Comparator)。

    --LinkedHashSet,能够保持元素的线性顺序,同时提供散列的快速访问。

  3、Queue,“队列”通常是“先进先出”,队列一般不能插入null,因为poll()的时候会弹出列头的数据,如果没有就返回null,这样会导致冲突。

    --LinkedList,实现了List的同时也实现了Queue接口,它可以实现“先进先出”的队列。

    --PriorityQueue,优先级队列,它会把添加的数据按照优先级进行排序,默认是自然排序,可以使用比较器(Comparator)来实现自定义优先级。

  Map:

  1、HashMap,通过散列的机制,能够快速查找,对于元素的顺序是无序的。

  2、TreeMap,保持key处于排序状态,访问速度不如HashMap。

  3、LinkedHashMap,保持元素的线性顺序,同时提供散列的快速访问。

  

 

posted @ 2019-07-22 20:59  廖不倒i  阅读(193)  评论(0编辑  收藏  举报