Java容器浅谈

来源:互联网 发布:avmoo最新域名2016 3 编辑:程序博客网 时间:2024/06/07 23:16

简单谈谈Java容器

1.首先,我们经常谈论Java容器,那么什么是容器呢?它有什么作用呢?在Java的一系列特性中它处于什么地位呢?结合《Java编程思想》这本书上的知识和google的一些汇总简单的讨论一下这些内容。

  • 我们都知道,Java是一切皆是对象的一门语言,它的所有数据都可以看作是对象,Java中所有的基础数据类型都进行了封装(wrapped),具体可参见Java基础,后面有机会会谈谈这个问题。那么Java容器的功能就呼之欲出了——存储对象
  • 如何存储对象也是一门艺术。数组可以存储对象吗?当然可以,但是数组存储对象的方法太单一:首先Java中数组在创建的时候它的尺寸就已经固定了,第二是数组只能通过索引来访问,并且它是顺序存储的,这给对象的insert和delete带来很大麻烦。后面详细讨论。但是Java在实际的使用中,对象的创建和存储方式越来越多样化,远远不是数组可以满足的,于是容器诞生了——可以在任意时刻任意位置创建任意数量的对象。

2.接下来谈谈容器的大致框架,Java中有那些容器?它们在Java包里面的继承关系如何?每个容器有哪些特性?

  • 学习容器初期下意识的忽略了这个问题,被问到的时候一脸懵逼,于是决定温习一下这部分内容。Java的容器主要是四类:Map,Set,List,Queue。在这四类中呢根据继承又分为两大类:Set,List,Queue继承Collection(想有个直观的认识可以去看看Java API),Map本身就是个接口,独立化为一类。Set下面有HashSet(HashSet下面有LinkedListHashSet)和TreeSet,List下面有ArrayList和LinkedList,Queue下面有PriorityQueue(有关Concurrent下面的Queue暂时不讨论)。Map下面有HashMap(HashMap下面有LinkedListMap)和TreeMap。这些就是Java容器类的一个简单分布图(手画一下会更好)。最重要也是平时用的最多的有四种:ArrayList, LinkedList,HashMap, HashSet。下面我们会详细讨论这些容器。

3.详细谈谈每个容器的特点?使用场景?

  • ArrayList:它可以看做一个可以拓展长度的数组,一般用在随机访问元素,但是在insert和delete的时候比较慢,这是因为ArrayList是顺序存储在一整块内存中的元素,它的访问是顺序遍历List,但是insert或者delete的时候该元素后面的所有元素都需要移动,所以时间复杂度和空间复杂度都比较高。
  • LinkedList的特性和使用场景和ArrayList形成了互补。LinkedList也就是链表,它是通过节点中指向的指针来定位下一个元素(Queue,Stack,双向链表基于此容器),现在使用Stack的时候都默认使用net.mindview.util的的版本,而不是使用Java.util.Stack。LinkedList可以实现Stack的所有需求
  • Set:Set不保存重复的元素,所以在add的时候需要判断add元素在Map中是否存在。Set最常用的是测试归属性,可以很容易的询问某个对象是否在Set中。所以,查找是Set中最重要的操作。HashSet对快速查找进行了优化。Set是基于对象的至来确定归属性的,Set的接口和Collection的接口完全一样,但是行为不同。
  • 元素存储顺序方式的不同:HashSet使用散列函数,TreeSet使用红黑树数据结构,LinkedListSet使用链表来维护元素的插入顺序。所以如果想对结果排序,使用TreeSet比较好。
  • Map:什么是Map?Map就是可以把对象和其他一些对象关联起来的关联数组。它可以把对象映射到其它的对象,这对解决编程问题是非常有用的。Map注意点:两个对象之间的关系
  • Queue是FIFO(先进先出)的容器,在容器的一端放入对象,在容器的另外一端将该对象输出,并且顺序是一样的。Queue在并发编程中非常有用,可以比较安全的把一个任务传递给另外一个任务,Queue是通过LinkedList实现的,可以把LinkedList向上转型为Queue:Queue<> queue = new LinkedList<>();
  • PriorityQueue:队列规则:是指在给定一组队列的情况下,确定下一个弹出队列的元素的规则,先进先出代表的规则是下一个弹出的应该是等待时间最长的元素。那么优先级队列声明呢?弹出的是最需要的元素。如何定义最重要呢?与插入顺序无关,一般默认自然排序,我们还可以通过Comparator(比如Collection。reverseOrder)来改变默认的优先级。

4.使用容器无论如何也无法绕过的Iterator(迭代器),什么是迭代器?有什么作用?

  • 如何才能够不重复写代码就可以(display(Iterator))应用与不同类型的容器呢?Iterator只能够单向移动。iterator用于便利并且选择序列中的对象,它最大的特点是把便利序列的操作和序列底层的结构分离,迭代器同意了对容器的访问方式。
  • ListIterator:是Iterator的子类,只能用于对List的访问,但是可以双向移动,ListIterator(n)可以创建一个一开始的列表索引就指向n的ListIterator,set()替换它访问过得最后一个元素。
0 0
原创粉丝点击