Java集合体系结构分析与比较
- 格式:doc
- 大小:19.11 KB
- 文档页数:15
Java基础知识点归纳Java基础学问点归纳对于刚刚接触Java的人,java基础学问技术点繁多,那么yjbys我为大家汇总最全java学问点如下,仅供大家参考学习!1. JVM相关(包括了各个版本的特性)对于刚刚接触Java的人来说,JVM相关的学问不愿定需要理解很深,对此里面的概念有一些简洁的了解即可。
不过对于一个有着3年以上Java阅历的资深开发者来说,不会JVM几乎是不行接受的。
JVM作为java运行的基础,很难信任对于JVM一点都不了解的人可以把java 语言吃得很透。
我在面试有超过3年Java阅历的开发者的时候,JVM几乎就是一个必问的问题了。
当然JVM不是唯一确定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。
在JVM这个大类中,我认为需要把握的学问有:JVM内存模型和结构GC原理,性能调优调优:Thread Dump,分析内存结构class 二进制字节码结构,class loader 体系,class加载过程,实例创建过程方法执行过程:Java各个大版本更新提供的新特性(需要简洁了解)2. Java的运行(基础必备)这条可能出看很简洁,java程序的运行谁不会呢?不过很多时候,我们只是单纯通过IDE去执行java程序,底层IDE又是如何执行java程序呢?很多人并不了解。
这个学问点是最最基本的java开发者需要把握的,初学java,第一个确定是教你如何在指令行中执行java程序,但是很多人一旦把java学完了,IDE用上了,就把这个都忘了。
为什么强调要知道这个呢,知道了java最纯粹的启动方式之后,你才能在启动出问题的时候,去分析当时启动的名目多少,执行命名如何,参数如何,是否有缺失等。
这样有利于你真正开发中去解决那些奇诧异怪的可能和环境相关的问题。
在这里需要把握的学问有:javac 编译java文件为class 文件java 指令的使用,带package的java类如何在指令行中启动java程序涉及到的各个路径(classpath,java。
IBM的Java VM在IO方面的性能优越。
SUN的Java VM在热点编译方面非常出色Java虚拟机的深入研究1 Java技术与Java虚拟机说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。
它们的关系如下图所示:Java四个方面的关系运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。
最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。
这个平台的结构如下图所示:在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。
它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API,利用Java API 编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
那么到底什么是Java虚拟机(JVM)呢?通常我们谈论JVM时,我们的意思可能是:对JVM规范的的比较抽象的说明;对JVM的具体实现;在程序运行期间所生成的一个JVM实例。
对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被许多生产厂商所实现,并存在于多种平台之上;运行Java程序的任务由JVM的运行期实例单个承担。
java工作总结(精选12篇)java工作总结(精选12篇)总结是事后对某一阶段的学习或工作情况作加以回顾检查并分析评价的书面材料,它能够使头脑更加清醒,目标更加明确,让我们一起来学习写总结吧。
那么如何把总结写出新花样呢?下面是小编整理的java总结,仅供参考,希望能够帮助到大家。
java工作总结篇1作为一个软件开发工程师(我也是一名软件开发工程师),所实在的如果每年只做那么一两个项目,年终工作总结写起来也应该得心应手的,我们只需要把本年度该项目的基本情况简历表述一下,自己在项目中的角色以及自己在项目中遇到的重点问题及解决方案描述一下,最后展望一下下一年度的工作计划,ok,本年度的工作总结基本完成。
20××年2月2日,我有幸成为北京超图一员,应聘为公司的java 软件工程师。
入任职以来,在部门领导的带领下,自己感觉无论学习、技术、生活等方面都有很大的提升。
我主要完成的工作有三方面:1、荆门石油石化巡检系统的调研和开发。
该项目是我工作以来第一次涉及到调研,对我来说算是一个不小的挑战。
在调研过程中,让我学会了如何通过和客户的沟通来了解客户的需求。
由于自己的工作经验不足,在调研工作中体现出一些问题。
不能很直接的在和客户沟通中非常准确的了解客户的更多需求,有很多需要和客户交流沟通多次才能明白客户的最终需求,也没有把自己作为最终用户并站在用户的角度上来考虑问题,这些都是我在以后的工作中需要提高和改进的地方。
在巡检系统的开发工作中,让我进一步巩固和加强了自己的开发能力。
2、电信12530增值业务的开发与维护。
从5月以来我就开始接手公司的主要业务之一,12530电信增值业务。
由于前面负责这个项目的同事突然离职,导致这个项目的交接工再做得不够好,对我顺利接手这个项目造成很大的困难。
而刚一接手这个项目,马上就需要新上一个投票活动,并要对一些主要代码进行修改,让我倍感压力,几乎都快放弃。
最后在金总的指导和鼓励下,顺利的完成这次活动。
软件体系结构◇软件体系结构概论◇软件体系结构建模◇软件体系结构风格◇软件体系结构描述◇动态软件体系结构◇Web服务体系结构◇基于体系结构的软件开发◇软件体系结构的分析与测试◇软件体系结构评估◇软件产品线体系结构软件危机的表现◎软件成本日益增长◎开发进度难以控制◎软件质量差◎软件维护困难软件危机的原因◎用户需求不明确◎缺乏正确的理论指导◎软件规模越来越大◎软件复杂度越来越高◎构件的定义构件是指语义完整、语法正确和有可重用价值的单位软件,是软件重用过程中可以明确辨识的系统;结构上,它是语义描述、通讯接口和实现代码的复合体。
构件模型的三个主要流派OMG(Object Management Group,对象管理集团)的CORBA(Common Object Request Broker Architecture,通用对象请求代理结构)Sun的EJB(Enterprise Java Bean)Microsoft的DCOM(Distributed Component Object Model,分布式构件对象模型)。
构件获取1.从现有构件中获得符合要求的构件,直接使用或作适应性修改,得到可重用的构件;2. 通过遗留工程,将具有潜在重用价值的构件提取出来,得到可重用的构件;3. 从市场上购买现成的商业构件,即COTS(Commercial Off-The-Shell)构件;4. 开发新的符合要求的构件。
构件管理◎构件描述◎构件分类与组织◎人员及权限管理构件描述构件模型是对构件本质的抽象描述,主要是为构件的制作与构件的重用提供依据;构件分类与组织◇关键字分类法◇刻面分类法◇超文本组织方法人员及权限管理一般来讲,构件库系统可包括五类用户,即注册用户、公共用户、构件提交者、一般系统管理员和超级系统管理员。
构件重用◎检索与提取构件◎理解与评价构件◎修改构件◎构件组装构件重用理解与评价构件◇构件的功能与行为◇相关的领域知识◇可适应性约束条件与例外情形◇可以预见的修改部分及修改方法构件组装◇基于功能的组装技术◇基于数据的组装技术◇面向对象的组装技术软件体系结构的定义软件体系结构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。
Java集合体系结构分析与比较1. Java集合框架图Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java集合框架图如下:集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础.抽象类:5个抽象类(长虚线表示),对集合接口的部分实现.可扩展为自定义集合类.实现类:8个实现类(实线表示),对接口的具体实现.在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码.Java集合的顶层接口是Collection,Collection 接口是一组允许重复的对象.Java集合框架主要由以下三个接口组成:(1) Set 接口继承Collection,但不允许重复,使用自己内部的一个排列机制.(2) List 接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列.(3) Map接口是一组成对的键-值对象,即所持有的是key-value pairs.Map中不能有重复的key,拥有自己的内部排列机制.容器中的元素类型都为Object,从容器取得元素时,必须把它转换成原来的类型.简化后的集合框架图如下:2. 接口Collection用于表示任何对象或元素组,想要尽可能以常规方式处理一组元素时,就使用这一接口.(1) 单元素添加、删除操作:boolean add(Object o):将对象添加给集合boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o(2) 查询操作:int size():返回当前集合中元素的数量boolean isEmpty():判断集合中是否有任何元素boolean contains(Object o):查找集合中是否含有对象o Iterator iterator():返回一个迭代器,用来访问集合中的各个元素(3) 组操作:作用于元素组或整个集合boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合void clear(): 删除集合中所有元素void removeAll(Collection c) : 从集合中删除集合c 中的所有元素void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素(4) Collection转换为Object数组:Object[] toArray():返回一个内含集合所有元素的array Object[] toArray(Object[] a):返回一个内含集合所有元素的array.运行期返回的array和参数a的型别相同,需要转换为正确型别.此外,您还可以把集合转换成其它任何其它的对象数组.但是,您不能直接把集合转换成基本数据类型的数组,因为集合必须持有对象.斜体接口方法是可选的.因为一个接口实现必须实现所有接口方法,调用程序就需要一种途径来知道一个可选的方法是不是不受支持.如果调用一种可选方法时,一个UnsupportedOperationException 被抛出,则操作失败,因为方法不受支持.此异常类继承RuntimeException 类,避免了将所有集合操作放入try-catch 块.Collection不提供get()方法.如果要遍历Collectin中的元素,就必须用Iterator.2.1 抽象类AbstractCollectionAbstractCollection 类提供具体“集合框架”类的基本功能.虽然您可以自行实现Collection 接口的所有方法,但是,除了iterator()和size()方法在恰当的子类中实现以外,其它所有方法都由AbstractCollection 类来提供实现.如果子类不覆盖某些方法,可选的如add()之类的方法将抛出异常.2.2 接口IteratorCollection 接口的iterator()方法返回一个Iterator.Iterator接口方法能以迭代方式逐个访问集合中各个元素,并安全的从Collection 中除去适当的元素.(1) boolean hasNext(): 判断是否存在另一个可访问的元素Object next(): 返回要访问的下一个元素.如果到达集合结尾,则抛出NoSuchElementException异常.(2) void remove(): 删除上次访问返回的对象.本方法必须紧跟在一个元素的访问后执行.如果上次访问后集合已被修改,方法将抛出IllegalStateException.Iterator中删除操作对底层Collection也有影响.迭代器是故障快速修复(fail-fast)的.这意味着,当另一个线程修改底层集合的时候,如果您正在用Iterator 遍历集合,那么,Iterator就会抛出ConcurrentModificationException (一种RuntimeException异常)异常并立刻失败.在遍历Iterator时不能对底层Collection执行remove()操作.3. 接口ListList 接口继承了Collection 接口以定义一个允许重复项的有序集合.该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作.(1) 面向位置的操作包括插入某个元素或Collection 的功能,还包括获取、除去或更改元素的功能.在List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置:void add(int index, Object element): 在指定位置index 上添加元素elementboolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置indexObject get(int index): 返回List中指定位置的元素int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1int lastIndexOf(Object o):返回最后一个出现元素o的位置,否则返回-1Object remove(int index) :删除指定位置上的元素Object set(int index, Object element):用元素element 取代位置index上的元素,并且返回旧的元素(2) List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集:ListIterator listIterator() : 返回一个列表迭代器,用来访问列表中的元素ListIterator listIterator(int index) : 返回一个列表迭代器,用来从指定位置index开始访问列表中的元素List subList(int fromIndex, int toIndex):返回从指定位置fromIndex(包含)到toIndex(不包含)范围中各个元素的列表视图对子列表的更改(如add()、remove() 和set() 调用)对底层List 也有影响.3.1 接口ListIteratorListIterator 接口继承Iterator 接口以支持添加或更改底层集合中的元素,还支持双向访问.ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间.一个长度为n的列表,有n+1个有效索引值:(1) void add(Object o): 将对象o添加到当前位置的前面void set(Object o): 用对象o替代next或previous方法访问的上一个元素.如果上次调用后列表结构被修改了,那么将抛出IllegalStateException异常.(2) boolean hasPrevious(): 判断向后迭代时是否有元素可访问Object previous():返回上一个对象int nextIndex(): 返回下次调用next方法时将返回的元素的索引int previousIndex(): 返回下次调用previous方法时将返回的元素的索引3.2 抽象类AbstractList和AbstractSequentialList有两个抽象的List 实现类:AbstractList 和AbstractSequentialList.像AbstractSet 类一样,它们覆盖了equals() 和hashCode() 方法以确保两个相等的集合返回相同的哈希码.若两个列表大小相等且包含顺序相同的相同元素,则这两个列表相等.这里的hashCode() 实现在List 接口定义中指定,而在这里实现.除了equals()和hashCode(),AbstractList和AbstractSequentialList实现了其余List 方法的一部分.因为数据的随机访问和顺序访问是分别实现的,使得具体列表实现的创建更为容易.需要定义的一套方法取决于您希望支持的行为.您永远不必亲自提供的是iterator方法的实现.3.3 类LinkedList、ArrayList和Vector在“集合框架”中有两种常规的List 实现:ArrayList 和LinkedList.使用两种List 实现的哪一种取决于您特定的需要.如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可选的集合.但如果,您要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好.ArrayList 和LinkedList 都实现Cloneable 接口,都提供了两个构造函数,一个无参的,一个接受另一个Collection3.1.1 类LinkedListLinkedList类添加了一些处理列表两端元素的方法.(1) void addFirst(Object o): 将对象o添加到列表的开头void addLast(Object o):将对象o添加到列表的结尾(2) Object getFirst(): 返回列表开头的元素Object getLast(): 返回列表结尾的元素(3) Object removeFirst(): 删除并且返回列表开头的元素Object removeLast():删除并且返回列表结尾的元素(4) LinkedList(): 构建一个空的链接列表LinkedList(Collection c): 构建一个链接列表,并且添加集合c的所有元素使用这些新方法,您就可以轻松的把LinkedList 当作一个堆栈、队列或其它面向端点的数据结构.3.1.2 类ArrayListArrayList类封装了一个动态再分配的Object[]数组.每个ArrayList对象有一个capacity.这个capacity表示存储列表中元素的数组的容量.当元素添加到ArrayList时,它的capacity在常量时间内自动增加.在向一个ArrayList对象添加大量元素的程序中,可使用ensureCapacity方法增加capacity.这可以减少增加重分配的数量.(1) void ensureCapacity(int minCapacity): 将ArrayList对象容量增加minCapacity(2) void trimToSize(): 整理ArrayList对象容量为列表当前大小.程序可使用这个操作减少ArrayList对象存储空间.3.1.3 类VectorVector类似于ArrayList.从API的角度来看这两个类非常相似.Vector是同步的,这个类中的一些方法保证了Vector 中的对象是线程安全的.而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的.3.1.4 三者之间的区别3.1.4.1 LinkedList与ArrayList的区别ArrayList:支持随机访问,不必在除尾部的任何位置插入或除去元素.LinkedList:频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素.3.1.4.2 Vector与ArrayList的区别(1) 同步性Vector是同步的.这个类中的一些方法保证了Vector中的对象是线程安全的.而ArrayList则是异步的,因此ArrayList 中的对象并不是线程安全的.因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList 是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销.(2) 数据增长从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象.当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大.所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销.(3) 使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示.但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置.为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作.这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以.如果是其他操作,你最好选择其他的集合操作类.比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的-O(1),但它在索引一个元素的使用却比较慢-O(i),其中i 是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作.LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销. 最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList.尤其是对于执行效率要求高的程序更应如此.因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作.4. 接口SetSet 接口继承Collection 接口,而且它不允许集合中存在重复项,每个具体的Set 实现类依赖添加的对象的equals()方法来检查独一性,因此加入Set的Object必须定义equals()方法以确保对象的唯一性.Set接口没有引入新方法,所以Set就是一个Collection,只不过其行为不同.4.1 Hash表Hash表是一种数据结构,用来查找对象.Hash表为每个对象计算出一个整数,称为Hash Code(哈希码).Hash表是个链接式列表的阵列.每个列表称为一个buckets(哈希表元).对象位置的计算index = HashCode % buckets (HashCode为对象哈希码,buckets为哈希表元总数).当你添加元素时,有时你会遇到已经填充了元素的哈希表元,这种情况称为Hash Collisions(哈希冲突).这时,你必须判断该元素是否已经存在于该哈希表中.如果哈希码是合理地随机分布的,并且哈希表元的数量足够大,那么哈希冲突的数量就会减少.同时,你也可以通过设定一个初始的哈希表元数量来更好地控制哈希表的运行.初始哈希表元的数量为buckets = size * 150% + 1 (size为预期元素的数量).如果哈希表中的元素放得太满,就必须进行rehashing(再哈希).再哈希使哈希表元数增倍,并将原有的对象重新导入新的哈希表元中,而原始的哈希表元被删除.load factor(加载因子)决定何时要对哈希表进行再哈希.在Java编程语言中,加载因子默认值为0.75,默认哈希表元为101.4.2 接口Comparable与Comparator在“集合框架”中有两种比较接口:Comparable接口和Comparator接口.像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次.对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式.4.2.1 接口Comparable在ng包中,Comparable接口适用于一个类有自然顺序的时候.假定对象集合是同一类型,该接口允许您把集合排序成自然顺序.(1) int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值在Java 2 SDK版本1.4中有二十四个类实现Comparable接口.下表展示了8种基本类型的自然排序.虽然一些类共享同一种自然排序,但只有相互可比的类才能排序.类排序BigDecimal,BigInteger,Byte, Double,Float,Integer,Long,Short按数字大小排序Character按Unicode 值的数字大小排序String按字符串中字符Unicode 值排序利用Comparable接口创建您自己的类的排序顺序,只是实现compareTo()方法的问题.通常就是依赖几个数据成员的自然排序.同时类也应该覆盖equals()和hashCode()以确保两个相等的对象返回同一个哈希码.4.2.2 接口Comparator若一个类不能用于实现parable,或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式),你可以实现Comparator接口,从而定义一个比较器.(1)int compare(Object o1, Object o2): 对两个对象o1和o2进行比较,如果o1位于o2的前面,则返回负值,如果在排序顺序中认为o1和o2是相同的,返回0,如果o1位于o2的后面,则返回正值与Comparable相似,0返回值不表示元素相等.一个0返回值只是表示两个对象排在同一位置.由Comparator用户决定如何处理.如果两个不相等的元素比较的结果为零,您首先应该确信那就是您要的结果,然后记录行为.(2)boolean equals(Object obj): 指示对象obj是否和比较器相等.该方法覆写Object的equals()方法,检查的是Comparator 实现的等同性,不是处于比较状态下的对象.4.3 接口SortedSet“集合框架”提供了个特殊的Set接口:SortedSet,它保持元素的有序顺序.SortedSet接口为集的视图(子集上一条: C语言程序当中异常安全的思考下一条: Tomcat 7 的七大新特性。