最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把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. javaScript的闭包 js变量作用域

    js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...

  2. PHP脚本执行效率性能检测之WebGrind的使用

    webgrind这个性能检测是需要xdebug来配合,因为webgrind 进行性能检测分析就是通过xdebug生成的日志文件进行编译分析的 那么这就需要们配置好xdebug,这个一般的php 版本都 ...

  3. 面向对象特性 - php

    1.类的字段调用格式 公用字段   类内调用 $this->字段名  类外调用 $对象名->字段名 静态  类内调用 self::$字段名   类外调用 类名::$字段名 常量 类内调用 ...

  4. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

  5. Json的用处一

    今天,我们用到了json的的用处,其实也就是一个很简单的用处,就是点击一个按钮,触发一个事件,然后调用json, 之后我们就可以进行异步操作,其实只是针对于后台的操作,其实我们并没有对数据库进行刷新, ...

  6. WCF入门二[WCF的配置文件]

    一.概述 往往在很多项目中数据库连接字符串.变量和一些动态的加载类会写在配置文件中.WCF也会在配置文件中写入一些配置参数,比如服务的地址.服务用于发送和接收消息的传输和消息编码等,通过配置文件可以灵 ...

  7. The GNU C Library

    Any Unix-like operating system needs a C library: the library which defines the ``system calls'' and ...

  8. Java算法求最大最小值,倒序,冒泡排序,斐波纳契数列,日历一些经典算法

    一,求最大,最小值 int[] a={21,31,4,2,766,345,2,34}; //这里防止数组中有负数,所以初始化的时候给的数组中的第一个数. int max=a[0]; int min=a ...

  9. HTTP协议中POST方法和GET方法有那些区别?

    GET用于向服务器请求数据,POST用于提交数据 GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作 GET请求的URL有长度限制1k ...

  10. 程序员必需知道的Windows Shell命令

    Windows系统本来就很人性化的操作系统,操作很方便,但是对于开发人员来说,有些时候改变一些电脑配置或者执行某些任务来说,使用GUI操作反而事倍功半,因此建议使用Shell命令来提高一下工作效率. ...