J2SE总结(一)-------容器
最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把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,开始以为是哈希表,后来才知道弄错了,它类似于数学里面的集合,无序且不重复。即相同的元素不会被加入集合中。
- public static void main(string args[]){
- Set s=new HashSet();
- s.add("hello");
- s.add("hello");
- s.add("world");
- System.out.print(s);
- }
- //输出结果[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总结(一)-------容器的更多相关文章
- JavaEE(12) - JPA规范及实现(TopLink和Hibernate)
1. JPA规范与ORM框架之间的联系 JPA规范并不属于EJB3规范,它是一套完全独立的规范,不仅可以在基于EJB的JavaEE应用程序中使用,而且完全可以在普通JavaSE应用程序中使用. JPA ...
- 8.AXIS1基础
转自:https://blog.csdn.net/chjttony/article/details/6209998 1.AXIS简介: Axis是Apache组织推出的SOAP引擎,Axis项目是Ap ...
- J2SE 容器
知识点:Collection接口.Iterator接口.增强的for循环.Set接口.List接口和Comparable接口.Collection类.Map接口.自动打包/解包.泛型 容器:API文档 ...
- Java2_J2EE、J2SE和J2ME的区别
解析J2EE.J2SE.J2ME.JDK的区别 本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ...
- Eclipse管理Java工程(j2se/j2ee/maven)
Eclipse管理J2SE/J2EE(Maven)项目 eclipse是一个集成开发工具,有编译,运行,打包部署等功能.eclipse可以新建多种项目,不同的项目有不同的IDE层次结构,方便用户管理资 ...
- J2SE J2EE J2ME的区别
J2SE J2EE J2ME的区别 J2SE J2EE J2ME的区别多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不 ...
- JDK 高性能编程之容器
高性能编程在对不同场景下对于容器的选择有着非常苛刻的条件,这里记录下前人总结的经验,并对源码进行调试 JDK高性能编程之容器 读书笔记内容部分来源书籍深入理解JVM.互联网等 先放一个类图util,点 ...
- jdk,j2ee,j2se,j2me的概念区别
jdk,j2ee,j2se,j2me的概念区别1.JDK是Java development toolkit,相当于是Java的库函数,是编译,运行java程序的工具包.J2EE是Java 2 ente ...
- j2se总结
j2se总结 经过一周多的时间完成了j2se基础的学习,个人感觉最大的收获不是对j2se的语法了解了多少,而是对面向对象的认识再一次加深了.面向对象,让类和对象成为一切. 下边是对j2se的一部分的总 ...
随机推荐
- SpringCloud框架搭建+实际例子+讲解+系列五
(4)服务消费者,面向前端或者用户的服务 本模块涉及到很多知识点:比如Swagger的应用,SpringCloud断路器的使用,服务API的检查.token的校验,feign消费者的使用.大致代码框架 ...
- 字符串的输入问题 C++
C++中,初学时最常用的输入字符的方式为cin,但是,cin是如何确定已经完成了字符串的输入了呢?由于不能通过键盘输入空字符("\0"),因此cin需要用别的方法来确定字符串的结尾 ...
- WPF里ItemsControl的分组实现
我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid.WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox ...
- LayoutInflater.Factory 妙用
LayoutInflater.Factory 可以调试 布局,你把下面的代码放到 onCreate里面,然后再里面的下面的onCreateView里面加上断点,然后你就可以知道所有的view构造,所有 ...
- videomon 环境搭建
1.安装ACE-5.8.0.tar.bz2 tar -zxvf ACE-.tar.bz2 cd ACE_wrappers/mkdir buildcd build../configuremake &am ...
- jQuery上传文件控件Uploadify使用
Uploadify是JQuery的一个上传插件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件等. 首先应下载jQuery和uploadify插件 jQuery下载地址:h ...
- Percona-Tookit工具包之pt-table-usage
Preface There always be some table join operations in our SQL statement.Although we can know ...
- Pythonyield使用浅析
转自:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...
- Python 装饰器初探
Python 装饰器初探 在谈及Python的时候,装饰器一直就是道绕不过去的坎.面试的时候,也经常会被问及装饰器的相关知识.总感觉自己的理解很浅显,不够深刻.是时候做出改变,对Python的装饰器做 ...
- LDA学习笔记
线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的线性学习方法.其思想非常朴素,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近,异类的样例的投 ...