讲解人:郭馨惠 日期:8月29日
![f18d6dcbe77b8f5ea488c0a6c3fa0240.gif](https://img-blog.csdnimg.cn/img_convert/f18d6dcbe77b8f5ea488c0a6c3fa0240.gif)
1.Java容器:Java容器是一个Java所编写的程序。
容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。
2.容器(Container):
容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,容器都会自动帮您做好。
常用容器:
WebSphere,WebLogic,Resin,Tomcat,Glassfish
![35a4d6d14a865f883fc438cd5877967d.gif](https://img-blog.csdnimg.cn/img_convert/35a4d6d14a865f883fc438cd5877967d.gif)
3.Java内部的容器类:
Java容器类包含:List、ArrayList、Vector及map、HashTable、HashMap、Hashset
ArrayList和HashMap是异步的,Vector和Hashtable是同步的,所以Vector和Hashtable是线程安全的,而ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和Hashtable的执行效率要低于 ArrayList和HashMap。
![17df4efaad6b3e5c4b6db8e9615b31a3.png](https://img-blog.csdnimg.cn/img_convert/17df4efaad6b3e5c4b6db8e9615b31a3.png)
4. Collection:是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。其中List必须按照插入的顺序保存元素、Set不能有重复的元素、Queue按照排队规则来确定对象的产生顺序(通常也是和插入顺序相同)。
![17df4efaad6b3e5c4b6db8e9615b31a3.png](https://img-blog.csdnimg.cn/img_convert/17df4efaad6b3e5c4b6db8e9615b31a3.png)
5. Map:一组成对的值键对对象,允许用键来查找值。ArrayList允许我们用数字来查找值,它是将数字和对象联系在一起。而Map允许我们使用一个对象来查找某个对象,它也被称为关联数组。或者叫做字典。
(1)HashMap:采用是散列函数所以查询的效率是比较高的。HashMap的键可以是null,而且键值不可以重复,如果重复了以后就会对第一个进行键值进行覆盖。
(2)TreeMap:TreeMap保持键始终处于排序状态,所以不如HashMap快。
(3)LinkedHashMap:保持元素插入的顺序,但是也通过散列提供了快速访问的能力。
![abdcca5b94b62fa83a501d0fc0c5dca8.png](https://img-blog.csdnimg.cn/img_convert/abdcca5b94b62fa83a501d0fc0c5dca8.png)
6. List:List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上加入了大量的方法,使得可以在List中间可以插入和移除元素。
下面主要介绍2种List:
(1)ArrayList:它的优点在于随机访问元素快,但是在中间插入和移除比较慢ArrayList有三种方式进行初始化。ArrayList其实就是采用的是数组(默认是长度为10的数组)。所有ArrayList在读取的时候是具有和数组一样的效率,它的时间复杂度为1。
(2)LinkedList:它是通过代价较低在List中间进行插入和移除,提供了优化的顺序访问,但是在随机访问方面相对较慢。但是他的特性功能要比ArrayList强大的多。支持Queue和Stack。ListedList采用的是链式存储。链式存储就会定一个节点Node。包括三部分前驱节点、后继节点以及data值。所以存储存储的时候他的物理地址不一定是连续的。先获取插入索引元素的前驱节点,然后把这个元素作为后继节点,然后在创建新的节点,而新的节点前驱节点和获取前驱节点相同,而后继节点则等于要移动的这个元素。所以这里是不需要循环的,从而在插入和删除的时候效率比较高。
![d9a58eea916f8d0b8a4a4739926d0b49.png](https://img-blog.csdnimg.cn/img_convert/d9a58eea916f8d0b8a4a4739926d0b49.png)
7. Set:Set也是一个集合,但是他的特点是不可以有重复的对象,所以Set最常用的就是测试归属性,很容易的询问出某个对象是否存在Set中。并且Set是具有和Collection完全一样的接口,没有额外的功能,只是表现的行为不同。
(1)HashSet:HashSet查询速度比较快,但是存储的元素是随机的并没有排序。
(2)TreeSet:TreeSet是将元素存储红-黑树结构中,所以存储的结果是有顺序的(所以如果你想要自己存储的集合有顺序那么选择TreeSet)。
(3)LinkedHashSet:以插入顺序保存元素。
![12573c9b9ec2c8b5be15363fecc57bee.png](https://img-blog.csdnimg.cn/img_convert/12573c9b9ec2c8b5be15363fecc57bee.png)
8. Queue:Queue是队列,队列是典型的先进先出的容器,就是从容器的一端放入元素,从另一端取出,并且元素放入容器的顺序和取出的顺序是相同的。LinkedList提供了对Queue的实现,LinkedList向上转型为Queue。其中Queue有offer、peek、element、pool、remove等方法。
offer是将元素插入队列尾,返回false表示添加失败。peek和element都将在不移除的情况下返回对头,但是peek在对头为null的时候返回null,而element会抛出NoSuchElementException异常。poll和remove方法将移除并返回对头,但是poll在队列为null,而remove会抛出NoSuchElementException异常。
![aa12321e07ee6fdb91dc65b6113ce2ee.png](https://img-blog.csdnimg.cn/img_convert/aa12321e07ee6fdb91dc65b6113ce2ee.png)
总结:
1):数组是将数字和对象联系起来,它保存明确的对象,查询对象时候不需要对查询结果进行转换,它可以是多维的,可以保存基本类型的数据,但是数组一旦生成,其容量不能改变。所以数组是不可以直接删除和添加元素。
2):Collection保存单一的元素,而Map保存相关联的值键对,有了Java泛型,可以指定容器存放对象类型,不会将错误类型的对象放在容器中,取元素时候也不需要转型。而且Collection和Map都可以自动调整其尺寸。容器不可以持有基本类型。
3):像数组一样,List也建立数字索性和对象的关联,因此,数组和List都是排好序的容器,List可以自动扩容。
4):如果需要大量的随机访问就要使用ArrayList,如果要经常从中间插入和删除就要使用LinkedList。
5):各种Queue和Stack由LinkedList支持
6):Map是一种将对象(而非数字)与对象相关联的设计。HashMap用于快速访问,TreeMap保持键始终处于排序状态,所以不如HashMap快,而LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问的能力。
7):Set不接受重复的元素,HashSet提供最快的访问能力,TreeSet保持元素排序状态,LinkedHashSet以插入顺序保存元素。
![8f330f1078b56ae9df2eedc2ed6b1d58.gif](https://img-blog.csdnimg.cn/img_convert/8f330f1078b56ae9df2eedc2ed6b1d58.gif)
![876dc8636f8e73d21ef472b7374d34b4.gif](https://img-blog.csdnimg.cn/img_convert/876dc8636f8e73d21ef472b7374d34b4.gif)