容器,对于我们来说并不陌生.在生活中,盛水的水桶是一个容器,盛饭的碗是一个容器,一个鱼塘也是一个容器.如:
在生活中我们接触过很多容器.那么在我们的程序设计中是不是也有容器呢,在我们开始接触VB时,VB6.0左侧的工具箱就是一个盛放控件的容器,一个界面就是一个容器.VS中的工具箱也是一个容器,如:
而今天我要说的是关于JAVA中所要提到的容器,java API提供了一些列类的实例,用于在程序中存放对象.容器就是用来保存多个对象的东西.严格来说是保存对象的引用.因为对象实际的数据是放在另外的地方的.放在容器中的只是指向那块内存区域的一个标识.
JAVA的容器所提供的API位于java.util包内:
可以用1136来表示这张图.
1表示的是一个UML类图
1表示的是一个类(Collections)
3表示的是三个知识点(For,Generic,Auto-Boxing/Unboxing)
6表示的六个接口(Collection,Set,List,Comparable,Map,Iterator)
JAVA容器的缺点
(1)将对象保存到容器的时候它的类型信息就丢失了.因为容器是针对Object的.所以可以将不同类型的对象放入同一个容器中.而数组则不同,一个数组里只能存同一类型的对象.
(2)在从容器中取出对象使用时必须进行类型转换.
当然,上面的问题可以通过泛型来解决.
容器的选择
容器实际上只有三种:Map ,List, Set;但每种接口都有不同的实现版本.它们的区别可以归纳为由什么在背后支持它们.也就是说,你使用的接口是由什么样的数据结构实现的.
List的选择:
比如:ArrayList和LinkedList都实现了List接口.因此无论选择哪一个,基本操作都一样.但ArrayList是由数组提供底层支持.而LinkedList是由双向链表实现的.所以,如果要经常向List里插入或删除数据,LinkedList会比较好.否则应该用速度更快的ArrayList.
Set的选择
HashSet总是比TreeSet 性能要好.而后者存在的理由就是它可以维持元素的排序状态.所以,如果需要一个排好序的Set时,才应该用TreeSet
常用容器组件
面板(JPanel):是一种最简单的容器类,它提供空间将其它的组件附在其上.可以在一个Panel上放入其他Panel.一个Frame里面可放入多个Panel.
框架(JFrame):Frame类使用户可以创建带有菜条的全功能窗口.
对话框(JDialog):对话框用于短暂的窗口.如:提示警告或向用户询问特定信息的窗口等.
窗口(JWindow):Window类所有有边框容器的父类.它的边框是不可见的.Window窗口必须由一个Frame创建.并依附于这个Frame面而存在.
滚动窗格(JScrollpane):Scrollpane是一种带滚动条的无边框容器.当Scrollpane容器容纳的组件比窗格大时,则可以通过滚动条查看整个内容.
Window,Dialog,Frame容器的总结:
(1)就层级结构来看,Window是Frame及Dialog的超类。也就是说Frame及Dialog也是一种Window。
(2)Window没有边框、没有标题、没有菜单,也不能缩放大小,而且必须以一个frame或dialog作其拥有者。Window最适合用来展示需要浮在其它组件之上的无边矩形区域。
(3)Frame有边,可设标题,上面也可放菜单,且可调整大小(最大和最小化)。Frame最合适用于需要有菜单的窗口。
(4)Dialog有边,可设标题,也可调整大小,很像Frame。但与Frame不同的是它不能放菜单。
(5) Window和Dialog要依附于一个Frame而存在。
容器犹如一个大仓库,存放着程序中的所有对象,更好的管理着对象,给程序设计员提供了很多方便.