最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把J2SE里面讲的容器的一些基础知识看了一下,总结一下最基本的东西。

围绕整章最核心的就属下面这张图了吧。

一、概念理解

为什么要有容器这个概念:刚接触,在我理解:在编程时,经常会遇到具有重复功能或属性的对象时,经常会大量的重复工作导致代码冗余,同时,随着用户的需求不断变更,改动的次数就不不断增加,如何避免大量的改动,同时减少模块之间的耦合度(如aop池),我们定义容器,凡是装在容器内部的对象全部具有容器的一切属性和方法,这便是容器的作用。

容器:可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。

通过上图可知,在JAVA容器中,有两个分支,collection和map,其中collection是一个独立元素的序列,list和set分别是实现collection接口的两种不同形式的容器,list运行对象重复且有序,而set容器的对象是无序且不能重复的。

map是以键值对形式来表现的对象之间的映射关系类型的容器。

在编码中,如果定义了一个容器,容器中具有一些属性和方法,那么向这个容器中添加一个对象,这个对象同时也具有了这个容器的属性和方法。

例如:collection接口中所定义的方法,如果在collection容器中加入了一个普通的string或者其他对象,那么这个l对象也会自动拥有collection的所有方法。

二、list和set

在list接口中实现它的有linkedlist和arraylist

1/arraylist来源于数组,只因数组必须制定固定的长度,且长度不可变,因此用arraylist来补充它的缺陷,arraylist拥有list的特点,可以根据对象的大小来成倍的扩充内存空间。linkedlist内部是按照链表来实现的。

2、set

实现set接口的只有一种就是hashset,开始以为是哈希表,后来才知道弄错了,它类似于数学里面的集合,无序且不重复。即相同的元素不会被加入集合中。

  1. public static void main(string args[]){
  2. Set s=new HashSet();
  3. s.add("hello");
  4. s.add("hello");
  5. s.add("world");
  6. System.out.print(s);
  7. }
  8. //输出结果[hello,world],重复的记录只会加入一次

小结:容器正如它的名字一样,用来承载大量的数据。同时可以减少很多重复的代码,在一定技术支持下,可以减少模块和模块之间的耦合度。运用容器可以给开发人员带来很多意想不到的效果。还是要多多深入的探讨和实践才行。

1.对 List 的选择

ArrayList 和LinkedList 都实现了List 接口,Vector 也是,不过已经废弃了。首选 ArrayList。

2 ,对 Set 的选择,

可以选择 TreeSet、HashSet,或者LinkedHashSet。HashSet 的性能总是比TreeSet 好(特别是最常用的添加和查询元素操作)。TreeSet存在的唯一原因是,它可以维持元素的排序状态。所以,只有当你需要一个排好序的Set时,才应该 使用TreeSet。

注意,对于插入操作,LinkedHashSet 比HashSet 略微慢一点;这是由维护链表所带来

额外开销造成的。不过,因为有了链表,遍历LinkedHashSet 会更快

3,对 Map 的选择

对 Map 不同的实现做选择时,Map 的大小是影响性能最重要的因素,

Hashtable 和HashMap 的效率大致相同。(你也看到了,HashMap 通

常更快一点,所以HashMap 有意取代Hashtable。)TreeMap 通常比HashMap 慢,

为什么还需要它?因为可以使用它生成一个排好序的队列。树的行为方式是:它总是处于

排序状态,不需要专门进行排序操作。当TreeMap 被填充之后,就可以调用keySet(),

取得由“键”组成的Set,然后使用toArray()生成“键”的数组。接下来使用static

Arrays.binarySearch()方法(稍后会讨论),在已排序的数组中快速地查询对象。当然,

你应该只在因为某些原因而无法使用HashMap 的时候,才去这么做。因为HashMap 正

是为快速查询而设计的。而且,你可以很方便地通过TreeMap 生成HashMap。所以,当

你需要使用Map 时,首选HashMap,只有在你需要一个总是排好序的Map 时,才使用

TreeMap。

LinkedHashMap 比HashMap 慢一点,因为它维护散列数据结构的同时还要维护链表。

IdentityHashMap 则具有完全不同的性能,因为它使用==而不是equals()来比较元素     。

java容器总结:

1. 数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对
结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是,数组
一旦生成,其容量就不能改变。
2.Collection 保存单个的元素,而Map 保存相关联的键值对。
3.像数组一样,List 也建立数字与对象的关联,可以认为数组和List 都是排好序
的容器。List 能够自动扩充容量。但是List 不能保存基本类型,只能保存Object
的引用,因此必须对从容器中取出的Object 结果做类型转换。
4.如果要进行大量的随机访问,就使用ArrayList;如果要经常从List 中间插入或

删除元素,则应该使用LinkedList。
5. 队列、双向队列以及栈的行为,由 LinkedList 提供支持。
6.Map 是一种将对象与对象相关联的设计。HashMap 着重于快速访问;TreeMap
保持“键”始终处于排序状态,所以没有HashMap 快。LinkedHashMap 保
持元素插入的顺序,也可以使用LRU 算法对其重排序。
7. Set 不接受重复元素。HashSet 提供最快的查询速度,TreeSet 保持元素处于排
序状态。LinkedHashSet 以插入顺序保存元素。
8.新程序中不应该使用过时的 Vector、Hashtable 和Stack

J2SE总结(一)-------容器的更多相关文章

  1. JavaEE(12) - JPA规范及实现(TopLink和Hibernate)

    1. JPA规范与ORM框架之间的联系 JPA规范并不属于EJB3规范,它是一套完全独立的规范,不仅可以在基于EJB的JavaEE应用程序中使用,而且完全可以在普通JavaSE应用程序中使用. JPA ...

  2. 8.AXIS1基础

    转自:https://blog.csdn.net/chjttony/article/details/6209998 1.AXIS简介: Axis是Apache组织推出的SOAP引擎,Axis项目是Ap ...

  3. J2SE 容器

    知识点:Collection接口.Iterator接口.增强的for循环.Set接口.List接口和Comparable接口.Collection类.Map接口.自动打包/解包.泛型 容器:API文档 ...

  4. Java2_J2EE、J2SE和J2ME的区别

    解析J2EE.J2SE.J2ME.JDK的区别       本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ...

  5. Eclipse管理Java工程(j2se/j2ee/maven)

    Eclipse管理J2SE/J2EE(Maven)项目 eclipse是一个集成开发工具,有编译,运行,打包部署等功能.eclipse可以新建多种项目,不同的项目有不同的IDE层次结构,方便用户管理资 ...

  6. J2SE J2EE J2ME的区别

    J2SE J2EE J2ME的区别 J2SE J2EE J2ME的区别多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不 ...

  7. JDK 高性能编程之容器

    高性能编程在对不同场景下对于容器的选择有着非常苛刻的条件,这里记录下前人总结的经验,并对源码进行调试 JDK高性能编程之容器 读书笔记内容部分来源书籍深入理解JVM.互联网等 先放一个类图util,点 ...

  8. jdk,j2ee,j2se,j2me的概念区别

    jdk,j2ee,j2se,j2me的概念区别1.JDK是Java development toolkit,相当于是Java的库函数,是编译,运行java程序的工具包.J2EE是Java 2 ente ...

  9. j2se总结

    j2se总结 经过一周多的时间完成了j2se基础的学习,个人感觉最大的收获不是对j2se的语法了解了多少,而是对面向对象的认识再一次加深了.面向对象,让类和对象成为一切. 下边是对j2se的一部分的总 ...

随机推荐

  1. bootloader svc 模式

    bootloader 和操作系统都是工作在svc模式下 /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0, ...

  2. GNU汇编 伪指令

    伪指令 本身并没有所对应的机器码 它只是在编译的时候起作用,或者转换为其他的实际指令来运行 global ascii byte word data equ align @ 下面的例子是在数据段存放数据 ...

  3. Python文件IO(普通文件读写)

    ## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...

  4. JS常用数组方法及实例

    1.join(separator):将数组的元素组起一个字符串,以separator为分隔符 ,,,,]; var b = a.join("|"); //如果不用分隔符,默认逗号隔 ...

  5. Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...

  6. DNS无法区域传送(axfr,ixfr)

    这两天博主在学习dns服务器的配 首先简单介绍一下axfr,ixfr axfr:完全区域传送 ixfr :增量区域传送 主要是在dns主从服务器上面进行备份更新的. ----------------- ...

  7. C# 控件置于最顶层、最底层、隐藏、显示

    控件置于最顶层.最底层 pictureBox1.BringToFront();//将控件放置所有控件最前端 pictureBox1.SendToBack();//将控件放置所有控件最底端 控件隐藏.显 ...

  8. [Codeforces976E]Well played!(贪心)

    [不稳定的传送门] Solution 首先可以证明,hp翻倍的操作一定是在同一个生物上最优 Code #include <cstdio> #include <algorithm> ...

  9. Flume是什么

    分布式流式实时收集日志文件系统,便于实时在线的流式计算,常配合 Storm 和 spark streming 使用. Flume is a distributed分布式的, reliable可靠的, ...

  10. 1 Django初探

    1.理解MTV request 向服务器请求 response发送数据给用户 M:数据库取出数据 T: 模板渲染 V:渲染好的网页返回给用户 URL找到特定的views 2.创建django项目 (1 ...