java集合知识点总结

2024-05-25

java集合知识点总结(共6篇)

篇1:java集合知识点总结

java集合知识点总结

Set:不区分元素的顺序,不允许出现重复的值

list:区分元素的顺序,且允许出现重复的值

map:采用key——values的,不允许有重复的键,每个键最多对应一个值

java集合只能保存引用类型的数据,是对象的引用

Collection接口描述set和list集合类型的根接口

相关方法:

add()如果增加重复元素,则增加失败,返回false

contains()判断是否包含有某个元素

iterator()返回成一个迭代器

List可以对元素的插入位置进行精确控制,根据元素索引访问元素等功能

set(index,elemetn)修改指定索引下的元素

Map关系集的形式查看某个映射的内容

put(objectkey,objectvalues)增加一个新的值

get(objectkey)查找key上面的值

SetkeySet()将所有的key返回到一个set中

Collectionvalues()将所有的值返回到一个collection集合中

Collection——set——hashset/treeset

Collection--list——Arraylist/vector——Stack(栈)

Map——hashmap/Treemap/hashtable——properties

StringTokenizer——Enumeration(不是很常用)

ArrayList类实现了list接口,用于表述长度可度的数组列表

他允许取值为null,除实现了list接口的所有功能外,还有以下方法

ArrayList()创建一个容量为10的null的列表

ArrayList()创建一个指定长度的null的列表

ensureCapacity(intminCapacity)增加此ArrayList实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

trimToSize()将此ArrayList实例的容量调整为列表的当前大小(也就是说,出除后面为null的值)

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16964.html

Vector也实现了list接口,其描述的也是可变长度的对象数组

是同步(线程安全的),运行效率要低一些,主要用于多线程环境中,而arryalist是不同步的,适合在单纯种环境中使用

vector()创建一个长度为10的vector容器

elementAt(intindex)得到指定的值

addElement(Objectojb)增加值

removeElementAt(intindex)移除指定的值

insertElecentAt(Eobj,index)在指定位置查入相关的值

removeElement(objectobj)删除值,如果有重复的只删除第一次出现的

Object[]toArray()将当前集合中的元素全部返回到一个数组中

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16965.html

Stack继承了vector,对应了数据结构中的“后进先出”存储和操作数据结象栈

Stack()创建一个空的栈

push()在当前栈中压入一个数据,把项压入堆栈顶部。

pop()移除堆栈顶部的对象,并作为此函数的值返回该对象。

peek()查看堆栈顶部的对象,但不从堆栈中移除它。

clear()清空栈

search(objecto)查看栈中的位置,返回最进的一个。以1为基数

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16966.html

Iterator接口描述的是以统一方式对各种集合元素遍历/迭代工具,也称”迭代器“

允许在遍历过程中移除集合中的元素

hasNext()如果仍有元素可以迭代,则返回true

next()返回迭代的下一个元素

remove()从迭代器指向的collection中移除迭代器返回的最后一个元素

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16967.html

HashSet类实现了set接口,描述典型的set集合结构

不允许出现重复元素,不保证集合中元素的序

允许包含值为null的元素,但最多只能有一个,

相关实例请查看hi.bccn.net/space-447825-do-blog-id-16968.html

TreeSet类也实现了Set,它描述的是set的一种变体——可以实现排序功能的集合

将对象元素添加到TreeSet集中时会自动按照某种比较规则将其插入到有序的对象序列中

以保证TreeSet集合元素组成的对象序列时刻按照“升序”排列

相关实例请看:hi.bccn.net/space-447825-do-blog-id-16969.html

Comparable接口中定义的compareTo()方法,实现对整体排序所需的比较逻辑

排序称为自然排序,和自然比较

如果重写了,compareTo()那么要保证equals()保持一致

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16971.html

HashMap实现了Map接口,基于哈希表的实现了前述的映射集合结构

不保证其中元素的先后顺序,并且允许null值和null键

当集合中不存在当前检索的,get()返回的是空,而不会报错

影响hashMap性能的两个参数:初始容量和加载因子

相关实例请看:hi.bccn.net/space-447825-do-blog-id-16972.html

Hashtable也是采用键和值,键和值不允许为null,是同步的,即线程安全的,效率相对要低一些,用于多线程,用法与hashmap完全一样

Enumeration接口:作用与iterator接口类似,但只提供遍历vector和hashtable(及子类properties)且不支持集合元素的移除操作些接口不是很常用,这里就不给实例了

Collections定义了多种集合操作的方法,实现对集合元素排序,取极值,批是拷贝,集合结构转换,循环移位以及匹配检查等功能

相关方法:

sort(Listlist)根据元素的自然顺序对指定列表按升序进行排序。

reverse(Listlist)反转指定列表中元素的顺序。

shuffle(Listlist)使用默认随机源对指定列表进行置换。

copy(Listdest,Listsrc)将所有元素从一个列表复制到另一个列表。

list(Enumeratione)返回一个数组列表,它按返回顺序包含指定枚举返回的元素

frequency(Collectionc,Objecto)返回指定collection中等于指定对象的元素数

max(Collectioncoll)根据指定比较器产生的顺序,返回给定collection的最大元素

rotate(Listlist,intdistance)根据指定的距离轮换指定列表中的元素。

相关实例请查看:hi.bccn.net/space-447825-do-blog-id-16973.html

Arrays类定义了多种数组操作方法,实现了对数组元素排序,填充,转换为列表或字符串形式、增强的检索和深度比较等功能

asList()返回一个受指定数组支持的固定大小的列表

sort()对指定的byte型数组按数字升序进行排序

binarySearch(int[]a,intkey)使用二分搜索法来搜索指定的int型数组,以获得指定的值。

toString(Object[]a)返回指定数组内容的字符串表示形式。

篇2:java集合知识点总结

(一)一、数组、集合数组、集合:都是一种容器,用一个对象管理多个对象;

数组:不能自动增长;只能存放同类型的元素

集合:能自动扩容;部分集合允许存放不同类型的元素;

二、学习这些集合类要掌握哪些东西:

1)怎样得到(选择)集合对象;

2)怎样添加元素

3)怎样删除元素

4)怎样循环遍历没一个元素

三、list、set、map

collection:父接口;

Set:接口---一个实现类:HashSet

List:接口---三个实现类:LinkedList,Vector,ArrayList

SortedSet:接口---实现类:TreeSet1、List:

List:有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;下标也是从0开始;

LinkedList:链表实现,增删快,查询慢

Vector:数组实现,线程安全,重量级

2.Set:

无序集合,不允许存放重复的元素;

实现类HashSet:equals返回true,hashCode返回相同的整数;哈希表;

子接口SortedSet:对Set排序实现类:TreeSet:二叉树实现的;

看API:泛型:表示一个对象;

Iterator:接口,迭代器;

java.util;

hasNext();

next();

remove();

Iterable:可迭代的,访问的;

ng;实现了可迭代的接口就可以用迭代的方式访问;

只需实现iterator();方法即可;Iteratoriterator();

三种循环的访问方式:

只有实现了Iterable接口的才能用第三种;能用第二种的也一定能用第三种;

ArrayList:自动扩容,是数组照搬过来的;

3.Map

HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;

HashSet的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;

如果有两个Key重复,那么会覆盖之前的;

Hashtable:线程安全的Properties:java.util.Properties;key和value都是String类型,用来读配置文件;

HashMap与Hashtable区别:

HashMap线程不安全的,允许null作为key或value;

Hashtable线程安全的,不允许null作为key或value;

TreeMap:对key排好序的Map;key就是TreeSet,value对应每个key;

key要实现Comparable接口或TreeMap有自己的构造器;

HashSet:remove(Objecto)的原则看这个对象O的Hashcode和equals是否相等,并不是看是不是一个对象;

定义一个Map;key是课程名称,value是Integer表示选课人数;

map.put(cou,map.get(cou)+newInteger(1));

四、Hashtable、Properties

1,Hashtable:实现了Map接口,此类实现一个哈希表,作用和HashMap相同。任何非null对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals法。

2,Properties:继承自Hashtable,比Hashtable更严格属性列表中每个键及其对应值都是一个字符串。

常用方法StringgetProperty(String?key)和setProperty(Stringkey,Stringvalue);

用法:我在C盘下建了一个名为yy.dat的文件,文件的内容为:

name=hehe

password=1234

5执行以下程序,输出hehe,可见用Properties可以很方便的解析配置文件

Propertiesp=newProperties();

p.load(newFileInputStream(“C:yy.dat”));

System.out.println(p.getProperty(“name”))

五、两个工具类Arrays和Collections

1.Arrays、此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂

2.Collections、主要提供了在collection上进行操作的静态方法

六、遗留的几个类

1.Hashtable,作用和HashMap相同,不过它是线程安全的,如果不需要线程安全,应该使用HashMap

2.Enumeration,遗留集合使用枚举接口来遍历元素,它有两个方法,hasMoreElements和nextElement,用法类似Iterator。

3.Stack,继承自Vector,实现了栈的功能,提供了push()方法押栈和pop()方法出栈。

4.BitSet,位集。如果需要高效率的存储一个位序列,例如一个标志序列,请使用位集。它可以对各个位进行

读取get(i)

设置set(i)

清楚clear(i)

七、常见笔试题目汇总

1.Collection和Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2.List,Set,Map是否继承自Collection接口?

List,Set是,Map不是

3.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?

不对,有相同的hashcode。

4.你所知道的集合类都有哪些?主要方法?

最常用的集合类是List和Map。List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。

Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

5.排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。

//使用快速排序方法对a[0:n-1]排序

从a[0:n-1]中选择一个元素作为middle,该元素为支点

把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点

递归地使用快速排序方法对left进行排序

递归地使用快速排序方法对right进行排序

所得结果为left+middle+right

6.HashMap和Hashtable的区别

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap类没有分类或者排序。它允许一个null键和多个null值。

Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是同步的。

7.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

java集合总结

(二)java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类分为:set、list、map、queue四大体系。其中set代表无序、不可重复的集合;list代表有序、可重复的集合。map代表具有映射关系的集合;queue代表队列集合。

java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。下面是其接口、子接口和实现类的继承树。

下面就一一介绍四大接口及其实现类。

Set接口。set集合不允许包含相同的元素。set判断两个对象是否相同是根据equals方法。如果两个对象用equals方法返回的是true,set不会接受这两个对象。

HashSet是set接口的典型实现,HashSet按hash算法来存储集合中的元素。因此具有很好的存储和查找性能。HashSet判断两个元素的标准是两个元素的equals方法比较相等,同时两个对象的hasCode()方法返回值也相等。HashSet可以保存null元素。

List集合代表一个有序集合。集合中的每个元素都有其对应的顺序索引。Arraylist和vector是list接口的两个典型实现。他们之间的显着区别就是:vector是线性安全的,而arraylist不是。它们两个都是基于数组实现的list类。List还有一个基于链表实现的LinkedList类。当插入、删除元素的速度非常快。这个类比较特殊,功能也特别多,即实现了List接口,也实现了Dueue接口(双向队列)。可以当成双向队列使用,也可以当成栈使用。

Queue用于模拟队列的数据结构。LinkedList和ArrayDueue是其两个比较常用的实现类。

Map用于保存具有映射关系的数据。Map接口有如下几个常用的实现类:HashMap、HashTable、TreeMap。TreeMap是基于红黑树对TreeMap中所有key进行排序。HashMap和HashTable主要区别有两点:

1、Hashtable是线性安全的,因此性能差些。

2、HashMap可以使用null作为key或者value。

集合类还提供了一个工具类Collections。主要用于查找、替换、同步控制、设置不可变集合。

上面是对java集合类的一般概述,下面就set、list、map三者之间的关系进行剖析。

Set与Map的关系。Map集合中所有key集中起来,就组成了一个set集合。所以Map集合提供SetkeySet()方法返回所有key组成的set集合。由此可见,Map集合中的所有key具有set集合的特征,只要Map所有的key集中起来,它就是一个Set集合,这就实现了Map到Set的转换。同时,如果把Map中的元素看成key-value的set集合,也可以实现从Set到Map之间的转换。HashSet和HashMap分别作为它们的实现类。两者之间也挺相似的。HashSet的实现就是封装了HashMap对象来存储元素。它们的本质是一样的。类似于HashSet和HashMap的关系,其实TreeMap和TreeSet本质也差不多,TreeSet底层也是依赖TreeMap实现。

Map与List的关系。把Map的key-value分开来看,从另一个角度看,就可以把Map与List统一起来。

Map集合是一个关联数组,key可以组成Set集合,Map中的value可以重复,所以这些value可以组成一个List集合。但是需要注意的是,实质Map的values方法并未返回一个List集合。而是返回一个不存储元素的Collection集合,换一种角度来看对List集合,它也包含了两组值,其中一组就是虚拟的int类型的索引,另一组就是list集合元素,从这个意思上看,List就相当于所有key都是int型的Map。

下面讲解几个相似类之间的差异。

ArrayList和LinkedList。ArrayList是一种顺序存储的线性表,其底层是采用数组实现的,而LinkedList是链式存储的线性表。其本质就是一个双向链表。对于随机存储比较频繁的元素操作应选用ArrayList,对于经常需要增加、删除元素应该选用LinkedList。但总的来说ArrayList的总体性能还是优于LinkedList。

篇3:java集合知识点总结

大型的面向对象的金融软件每天可能要处理海量数据,而这些数据通常是以数据对象的形式存放在内存中的,以备使用时直接从内存获取。这些金融软件通常都有长时间连续工作的需求。随着系统的持续运行,内存中的数据对象越来越多,又因为业务逻辑的需求,无法通过面向对象语言本身的垃圾回收器来自动回收,此时问题就产生了:内存中存储对象总量超出内存容量上限而引起内存泄露。所以引入了面向对象分析[1,2]和面向对象设计[3,4]的一个产品-对象数据库。它与面向对象的编程语言[5]有着紧密的联系,程序员可以把需要操作的对象存放在对象数据库里,需要时获取即可,在代码中创建非持续化对象,虽然非常容易实现。对正在运行程序中的对象的改动,等到程序下次运行时这些改动仍然维持不变,基本上就类似于把对象存储在内存中。而且对象数据库还能创建某些特殊的程序,这些程序能处理与面向对象范例紧密结合的持久化对象。然而,由于对象数据库还没有被广泛使用,不少程序员不一定了解它的使用方法,因此而提出了一个基于对象数据库的扩展的 Java集合框架。把它设计得尽量简单易用,使得程序员使用起对象数据库来非常方便。

1 对持久化的研究

1.1 持久化技术概述

对象持久化,即将对象保存到可永久保存的存储介质和设备中,目前最主要的存储介质和设备仍为关系数据库,关系数据库中存放的是关系数据是非面向对象的。对象和关系数据其实是业务实体的两种表现形式:内存中表现为对象,在数据库中表现为关系数据。将业务对象持久化到关系数据库中时一般都基于 JDBC 拼写SQL语句实现,而SQL是结构化查询语言,这就造成了“对象-关系的阻抗适配”。随着设计思想的演化,出现了很多对象/关系型数据映射ORM(Object-Relation Mapping),如 Hibernate,从而将开发者从JDBC和SQL 解放出来。使用Hibernate,开发者可以采用面向对象的方法操作数据库,提高工作效率[6]。另外几种持久化技术是:

主动域对象模式 它是在实现中封装了关系数据模型和数据访问细节的一种形式。

JDO 模式 JDO(Java Data Objects)是 SUN 公司制定的描述对象持久化语义的标准API。它支持把对象持久化到任意一种存储系统中,包括关系数据库、面向对象的数据库、基于XML的数据库,以及其他专有存储系统。

CMP模式 在J2EE 架构中,CMP(Container-Managed Persistence)表示由 EJB 容器来管理实体 EJB 的持久化,EJB 容器封装了对象关系的映射及数据访问细节。

以上几种持久化技术的相似处是它们都有对象关系映射。

1.2 关系数据库和对象数据库持久化对比

通过以上对各种持久化技术的介绍可以了解到:各种技术均有对象关系映射。下面用目前业界非常流行的Hibernate和对象数据库在持久化方面做一个比较,看看两者的区别[7,8,9],以及Hibernate究竟能不能代替对象数据库。

1.2.1 避免阻抗不匹配

在对象数据库里,没有表和对象之间的相互映射关系,这样的结果是项目开发时可以减少相当数目的代码量。

避免阻抗不匹配是两者最重要的区别。Hibernate的主要功能是做从Java类到数据库表之间的映射(从Java数据类型到SQL数据类型的映射)。Hibernate也有数据查询和获取的功能。Hibernate产生对SQL的调用,把开发人员从手工的ResultSet的操作和对象转换中解放出来,使得程序可以移植到任何支持SQL语句的数据库上,而且移植所花的代价也比较小。通过使用Hibernate的对象关系映射把对象存储到关系数据库中也是可行的,这样也能解决上面提到的内存泄露问题。而且Hibernate作为一种流行的框架,对其的使用已被广大程序员所掌握。然而,即使Hibernate本身的功能非常强大,但是它还是没法取代BerkeleyDB、DB4O等对象数据库在对象操作上的优势(由于BerkeleyDB价格较为昂贵,DB4O成为一种相对理想的选择,DB4O也是本文研究选取的对象数据库)。Java程序中的对象,通过Hibernate要存到数据库中,需要做对象关系映射,因为数据库都是表结构的,用Hibernate还是要配置映射关系的,还是没跳出表的框框。而一般的对象数据库,可以简单理解为带有查询功能的对象序列化。这里举个例子:持久化一棵二叉树[10],这棵二叉树的深度很大,看起来很烦,如果要存数据库,那么光设计表就够折腾的了。使用Hibernate把这个工作转向了设计人员,开发人员用配好的接口开发是很简单的,但是设计人员还是要有设计表这个痛苦的过程。使用对象数据库,完全可以把这棵二叉树存下来,然后查询满足某个条件的节点。

1.2.2 显明的持续化

在对象数据库管理系统中,可以用同一种方式访问存储在磁盘上的持久化对象和存储在内存中的瞬时对象。不像关系数据库里最小的使用单元是行和列,对象数据库中最小单元是一个对象。

1.2.3 对象模型

对象数据库管理系统就是面向对象编程语言的典型使用对象,这意味着开发人员只需要关注他们自己的对象模型就可以了,可以改善应用程序设计或架构。

1.2.4 性能增强

关系数据库把对象分开成几个不同的数据表,通过外键来维护这些表之间的关系,把这些对象打包或解包的过程是相当费时的。对象数据库则是直接存储这些复杂的对象和关系。图1为 对象数据库DB4O 官方公布的基准测试数据,DB4O比采用 Hibernate/MySQL 方案在某些测试线路上速度高出 44 倍之多!

1.2.5 其 它

安装简单,仅仅需要 400Kb 左右的 .jar 或 .dll 库文件。

易嵌入。使用 DB4O仅需引入400多k的jar文件或是dll文件,内存消耗极小。

零管理。使用 DB4O无需 DBA,实现零管理。

支持多种平台。DB4O支持从 Java 1.1 到 Java 6.0,此外还支持 .NET 、 CompactFramework 、 Mono 等 .NET 平台,也可以运行在 CDC、PersonalProfile、Symbian、Savaje以及Zaurus这种支持反射的J2ME方言环境中,还可以运行在CLDC、MIDP、RIM/Blackberry、Palm OS这种不支持反射的J2ME环境中。

2 基于对象数据库的扩展Java集合框架

2.1 框架设计思路

基于对象数据库的扩展Java集合框架,是为了解决有长时间连续工作需求的、处理海量数据的企业应用系统的内存泄漏问题而提出的,而且扩展了Java类库里的集合类。举个简单的例子:如果一个系统要求长时间内往HashMap中存放对象,最终会导致内存空间耗尽,引起内存泄漏,导致系统无法正常工作。现在用一个实现了Map接口的DBMap来代替,而这个DBMap就是基于对象数据库的扩展Java集合框架里的一个类。现在往DBmap中存放对象,当对象数目达到系统设定值时,系统会把这些对象转存到磁盘中,永远都不会出现内存泄漏的问题,其框架图如图2所示。

2.2 框架优点

有了这个扩展 Java集合框架,使得操作对象数据库里的对象时也像平时常用的集合API操作对象一样,程序员根本就不会感觉到自己是在使用另一套API。这样使得不懂对象数据库可以完全不用理睬对象数据库提供的API库,从而使得学习曲线降到尽可能低,把心思全部放在项目开发上去了。

2.3 性能改进策略

针对扩展Java集合可能会产生的性能问题,可以采用如下策略:一开始,程序产生的引用全部存储在一个对象池里,当这些不同数据类型的对象在对象池里占据的空间达到设定的上限时,系统会把那些当前最不常用的对象存入对象数据库。当程序需用到这些引用,且该对象又恰好在对象池里时,系统自动从对象池里取出这些对象,然后再返回;如果该对象不在对象池里,那么就用该对象来代替对象池里最久未被使用的对象,而那个在对象池里被替代的对象则会被存储到对象数据库里。

2.4 DBMap的实现

下面简单介绍一下基于对象数据库的实现了Map接口的DBMap类。

2.4.1 DBMap的域变量

DBCount,这是一个静态的int对象,用于生成不同的数据库地址,即生成不同的文件路径,用户每次新生成一个DBMap对象就会有一个新的数据库地址。程序员可以同时使用好几个Java 常规Map,同样也能同时使用好几个DBMap。

DB4OFILENAME,这是一个最终的静态的String对象,代表对象数据库的文件地址。

index,这是一个HashMap对象,用于存放每个存放在DB4O中的对象的引用地址。

db,这是一个ObjectContainer对象,顾名思义它是一个对象数据库的引用。

storeCnt,这是一个int对象,当storeCnt的数值到达一个给定值时,程序会执行db.commit()方法,把暂存在内存中的对象转存到设定好的对象数据库中,并清除内存中的数据。

2.4.2 DBMap的方法

包括Map接口提供的所有方法,全部以基于对象数据库的方式实现了。其核心方法put(K key, V value)和get(Object key),如图3和图4所示。

put(K key, V value)方法的精简伪代码如下:

而values(int size)和put(K key, primitiveType pt)方法是对这个扩展Map的补足。

values(int size):values(int size)的引入是因为这个扩展的Java集合框架是用来处理海量数据的,而Map接口提供的values()方法返回值是一个collection,把这个map中所有的数据以一个collection的形式返回,而这个collection是存放在内存中的,当collection中对象数量过多时,亦会造成内存泄漏。所以现在在values()方法的基础上提供了values(int size)方法,允许用户把map中存储的前size个对象以一个collection的方式返回。

put(K key, primitiveType pt):put(K key, primitiveType pt)方法的引入是因为对象数据库本身是不接受Java的基本类型的,强制在对象数据库中存放基本类型对象会造成程序抛异常而无法继续执行。所以在这里提供了这些方法,程序在执行这些方法时,先把基本类型的数据用它们的包装类来包装它们,然后再调用put(K key, V value)方法来存储这些基本类型。这里还值得一提的是对象数据库也不支持String对象,这里采取的方法是用一个叫StringWrapper的类来包装普通String对象,然后把这个StringWrapper对象存储到对象数据库,当调用get(Object key)方法时同样也需做必要的处理,确保最后返回的是String对象。

2.5 其 它

同样地,也可以实现分别实现了接口List和Set的DBList和DBSet,其方法基本和DBMap类似。

3 实 验

3.1 实验环境

操作系统:Microsoft XP SP3 Home Edition

CPU:Intel® CoreTM2 Duo CPU E7200 @2.53GHz

内存:Kingston 3.25GB

数据库:Oracle9i

Hibernate版本:3.3.1

3.2 测试工具

JProfiler 5.2.2。JProfiler是一个全功能的Java剖析工具。它可以把CPU、线程和内存的分析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合功能,它以直接的GUI使得开发者能够找到性能瓶颈、抓住内存泄漏并解决多线程的问题[12]。

3.3 测试用例

(1) 简单用例

通过一个简单的while循环生成大量的Student对象并存储,用对象数据库存储到本地文件以及用Hibernate把对象存储到关系本地数据库中,并且分别记录存储一定数量的Student对象所需的时间。通过JProfiler来记录一段时间内内存中的对象数目。其中Student类是一个有两个String变量和两个int变量的简单类。

(2) 较复杂用例

一个Team类中有两个域:一个是int类型的team_id,另一个是一个Car对象。Car类中有三个域:第一个是int类型的car_id,第二个是String类型的model,第三个是一个Pilot对象。Pilot类里有三个域:第一个是int类型的pilot_id,第二个是String类型的name,第三是int类型的points。现在要比较的是用对象数据库和Hibernate加关系数据库存储Team对象的时间。并通过JProfiler来记录一段时间内内存中的对象数目。这里使用Hibernate来持久化Team对象需为Team,Car,Pilot三个类分别写一个映射文件,并且建立Team到Car,Car到Pilot类的多对一的单向关联关系。现在这3个类的层次只有2层,关系还比较简单明朗。但是当处理对象是一个极其复杂的对象时,对Hibernate的配置将是一个极其繁琐的过程。

3.4 内存使用对比

结合表1,从图5中不难看出,当使用HashMap时,程序运行40毫秒之后就抛出异常:Exception in thread ″main″ java.lang.OutOfMemoryError: Java heap space而停止运行了,这是由于内存中堆泄漏引起的,此时内存中有近800000个Student对象。相反,当使用DBMap时,程序已经运行了超过1小时,成功在磁盘上存储了30000000个Student对象,可以看到内存中的Student对象个数基本上在0~3000之间波动。这是因为在程序里设置了一个值,也就是3000,当DBMap中存储的Student对象数达到3000时,通过commit方法把这些对象转存到对象数据库里了,当然在部分时间内内存中的Student对象超过了3000个,这是因为一次commit操作还未完成时,又有Student对象存储在内存中了,又随着新一次的commit操作将内存中的数据又存储到磁盘中,所以总的对象数目始终保持在0~3000左右。

3.5 性能对比

在性能方面,使用对象数据与直接访问内存,在速度上必然有很大的劣势,这也可以从表1中明显得出,两者相差甚多,当然存储介质的不同使得DBMap和HashMap的性能是没法比较的,但是相信使用对象数据库存储对象一定还有改进的空间。本节主要还是将对象数据库与普通关系数据库和Hibernate的组合做比较,对比实验同样也通过存储简单Student对象和较复杂的Team对象,从表1和表2中可以看出DBMap在性能上比用Hibernate要胜出不少。

摘要:常规的数据持久化方法是通过对象关系映射把对象存储到关系数据库中,但是易用性和效率一直是个问题。提出了一种更加方便、性能更强的方法,即用对象数据库来存储海量数据。然而目前对象数据库的使用还不是非常广泛,不少程序员可能还不了解对象数据库的使用。提出的基于对象数据库的扩展Java集合框架(Java Collection Fram ework),可以使程序员操作对象数据库就像使用普通的Java集合框架一样方便,而且在性能上也优于普通的关系数据库。

关键词:对象关系映射,对象数据库,Java集合框架

参考文献

[1]Meyer B.Objected-Oriented Software Construction[M].Prentice Hall,1988.

[2]Lee S,Carver D L.Object-oriented analysis and specification:A knowl-edge base approach[J].Journal of Object-Oriented Program.Jan,1991:3543.

[3]Coad P,Yourdon E.Object-Oriented Design[M].Prentice Hall,1991.

[4]Rumbaugh J,Blaha M,Premerlani W,et al.Objected-Oriented Modelingand Design[M].Prentice Hall,1991.

[5]Elisa Bertino,Lorenzo Martino.Object-Oriented Database System—Concepts and Architectures[M].Addison-wesley,1993.

[6]苏艳,许南山.对象持久化技术Hibernate的应用研究[J].福建电脑,2008(3).

[7]Won Kim.Introduction to object-oriented database[R].MITpress,1990.

[8]Atkinson M,Bancilhon F,DeWitt D,et al.The Object-Oriented DatabaseSystem Manifesto[C]//Proceedings of the First International Conferenceon Deductive and Object-Oriented Databases,Kyoto,Japan,December 1989.

[9]DB4O develop team.http://www.service-architecture.com/object-orien-ted-databases/articles/object-oriented_database_oodbms_definition.html.

[10]Jeffrey D Ullman,Jennifer Widom.A First Course in Database System[M].Prentice Hall,1997.

[11]DB4O develop team.http://www.db4o.com/about/productinformation/benchmarks/.

篇4:集合知识如何讲解

关键词:集合;子集;空集;二次函数;一次函数

进入高中很多学生从集合开始感到比较难以适应,那么如何清晰有效地讲解就变得至关重要了,集合的内容分为三个部分,我将通过课标要求、课标解读、教学重点、教学难点、易错点、相应题型等这几项,对本部分进行详细的分析,并在其中加上自己认为的有效解决问题的办法,在此与大家共同分享。

集合分为三个部分,第一部分,集合的含义与表示。课标要求:(1)了解集合的含义,掌握常用数集及其记法。(2)体会元素与集合的关系,能判断某一元素“属于”或“不属于”某一集合。(3)理解集合表示的常用方法,(自然语言法;列举法;描述法)能选择不同的表示方法描述不同的具体问题,感受集合语言的意义和作用。

教学重点:1.集合元素具有确定性、互异性、无序性。2.“属于符号:∈■。3.描述法。

教学内容:1.集合的概念。2.元素与集合的关系(大写字母表集合小写字母表元素,用属于)。3.特殊数集(R实数集,Q有理数集,Z整数集,N自然数集有零)。4.集合的表示法:列举法、描述法(语言描述,符号描述)。

习题的选择至关重要,首先选择和本节知识点联系密切的,其次易混淆知识,用来理解知识点,最后做正常练习,弥补知识漏洞,其中包括初中知识,其目的在于进行初中高中的知识衔接。选择例题1 下列每组对象是否构成一个集合:(确定性)

(1)数学必修1课本中所有的难题。

(2)不超过20的非负数。

(3)方程x2-3x+2=0在实数范围内的解。

(4)■的近似值x2-3x+2=0的全体。

本题主要考查集合元素的确定性,教科书中明确指出,给定一个集合,任何一个元素在不在这个集合中就是确定的,依照这一原则给出的题型。

例题2.已知集合A={a-2,2a2+5a,12},且-3∈A,求a的值。(互异性)主要考查集合元素间的互异性,从而引出分类讨论的思想方法,非常重要,并给出必要的解题步骤,让学生通过此题,学会用数学的思想方法研究数学问题。

例题3.集合A={x|x=a+■b,a∈Z,b∈Z},判断下列元素x=0,■,■与集合A之间的关系。考查元素与集合的关系,然而对于初中知识不是非常好的学生,难点主要是分母有理化。

例题4.已知集合M={(x,y)|x+y=2},N{(x,y)|x-y=4},若a∈M且a∈N,那么a为()

A.{3,-1} B.(3,-1) C.{(3,-1)} D.{x=3,y=-1}

常考题型,主要考查学生对描述法的理解,一定要注意代表元素。

例题5.用适当的符号填空:已知A{x|x=3k+2,k∈Z},A={x|x=6m-1,m∈Z},则有:17    A;-5    A;17    B.利用本题可将偶数集与奇数集的表示方法给出。

例题6.用集合语言表示下列集合:

(1)坐标平面内,不在第一、三想象的点的集合;

(2)所有被3除余1的整数的集合;

(3)使y=■有意义的实数x的集合。选择适当方法表示集合。

例题7.方程组x+y=3x-y=1的解的集合为    。注重点与数的区分。

例题8.已知集合A={x|ax2-3x+2=0,a∈R}

(1)若A中不含有任何元素,求a的取值范围。

(2)若A中只有一个元素,求a的值,并把这个元素写出来。

(3)若A中至多有一个元素,求a的取值范围。本题对于初学者来说综合性较强,主要考查二次函数,一次函数和分类讨论的思想方法。

第二部分集合间的基本关系课标要求:(1)识别集合之间包含与相等的含义,能写出给定集合的子集,能归纳出子集和真子集的区别和联系。(子集和真子集符号也不同,重点放在子集的讲解)(2)能在具体情境中解释空集和相等集合的含义。(空集是难点,但是绝对不可说得过多,过多对学生是负担的同时也影响学生的理解)(3)能正确区分易混淆的数学符号属于与包含于,会判断两个集合间的关系,能用Venn图表示集合间的关系。(这是本节的难点,要求教师给予充分的讲解,而做题时不建议出现集合中元素是集合的题型,这样对于学生理解集合关系还会起到不良的作用。)

第三部分集合的基本运算,课标要求:(1)理解两个集合的并集与交集的含义,会求两个简单集合的交、并运算。(2)理解在给定集合中一个子集的补集的含义,会求给定子集的补集。(3)能使用Venn图表示集合的关系及运算,体会直观图示对理解抽象概念的作用。

集合始终是比较抽象的内容,希望教师在讲解的过程中给予必要的重视,而作为学生要给自己时间研究知识,必须经过自己的研究,才能最终掌握知识点。

参考文献:

篇5:对java集合类的一些总结

答:所有的集合类都实现了iterator接口,用于遍历集合中的元素,iterator接口中的方法有hashNext(),next(),remove()三种方法,不同的集合类提供了不同的实现(无序集合实现这个接口,只能向后遍历)。如果要实现向前遍历,也就是说集合中的元素是有序的,实现的是linkedIterator接口,这是iterator的子接口,实现了这个接口的类能实现双向(前后)遍历。

Hashset:hashset继承了抽象类AbstractSet,而AbstractSet类又实现了set接口,并且AbstactSet又继承了AbstractCollection,AbstractCollection实现了Collection接口,因此hashset实际上实现了collection接口,又实现了set接口,因为所有的集合接口都实现了iterator接口,因此hashset可以上转型为set,collection,以及iterator,并且调用响应的方法。特点:hashset不能存放重复的元素,并且采用散列的存储方法,因此元素的插入与输出并不是一致的。附:散列是使用了数组和链表来进行存储的一种结构,数组是连续的,每个数组的元素都是一条链表。

ArrayList:ArrayList继承了AbstractList并且实现了List接口。其中AbstractList继承了AbstractCollection并且实现了List接口,AbstractCollection实现了Collection接口,因此AbstractList可以说是间接或者是直接实现了List,Collection,iterator接口。ArrayList使用的数据结构是数组。方便对元素的检索,但是增删需要移动数组元素,因此不适合增删,增删使用链式存储的线性表(如:LinkedList)会比较方便,详细见LinkedList。

LinkedList:linkedList继承了AbstractSequentialList并且实现了List接口,AbstractSequentialList继承了AbstractList,Abstractlist继承了AbstractCollection接口,因此LinkedList也是有序集合。LinkedList在java中的实现是双向链表,因此LinkedList对空间的利用率比较高,但是对元素的检索较慢,但是增删较快,只需要简单调整链的指向即可。

Vector:Vector的结构和ArrayList几乎相同,不同的地方就是在公有方法层次上,Vector加了关键字synchronized,因此理论上来说,Vector每个方法都是现成安全的。但是个人认为(包括查资料了解到)这并不能完全保证并发访问下的线程安全。在并发访问情况下,任何时候都只能有一个线程去访问其中的共有方法,在方法级别是线程安全的。但是现在有两个线程A、B,线程A向Vector添加一个对象,此时线程B查询Vector的长度是1,但是线程B并没有进行任何操作(插入操作),这样仍然会造成并发问题,但是在线程A、B都进行插入操作的时候,jvm会根据自动进行线程调度从而确保在任何时刻只有一个线程操作Vector的插入操作。因此在Vector之后,新版的jdk里面有了arraylist(非线程安全),其实我认为就是把并发控制的问题交给程序员处理。

Stack:Stack是栈结构,后进先出。Stack继承Vector,并且新增了一些方法,例如出栈,入栈操作。Stack内部的方法也是加了synchronized关键字的,因此,也是“线程安全”的。

HashMap:HashMap继承了AbstractMap并且实现了Map接口,而AbstractMap也实现了Map接口,总的来说hashMap实现了Map接口以及abstractMap的一些方法。hashMap是通过键值对来存储以及检索数据的。HashMap是通过一个数组以及链表组合来存储数据的。java中的hashMap的实现是一个长度为16的数组,并且每个数组存储都是一个单链表,存储一个数据的时候,根据key的hash值去判断到底应该存在下标为多少的数组中,找到对应的数组位置后,并且一直对这个位置的链向后索引,查到链的最后面。hashMap综合了线性表以及链表的优点,使检索以及增删都变得方便。附:非线程安全,并且hashMap可以存储null值

HashTable:HashTable也是一个散列表(和hashMap一样),存储的是键值对,HashTable继承于Dictionary,实现了Map接口,和hashMap最大的区别是:hashTable的读写方法是线程安全的,加了synchronized关键字,而且hashtable不能存储null。

篇6:Java基础知识点总结

*使用class关键字定义类,注意类名大写

*成员属性:成员属性不赋值会有默认值(默认值规则参考PPT)

*成员方法

*构造方法:没有任何返回值,名字与类名一样,构造方法的本意是用来初始化对象(初始化对象的属性值)

4.2 实例化对象:Student s = new Student;

*使用new + 构造方法实例化对象

*new 在堆中开辟了对象的空间,并且给属性赋上默认值

*接下来调用构造方法,执行构造方法中的代码

*最后返回对象的引用

4.3区分引用类型与基本数据类型

*引用类型的变量在内存中有两块区域,一块是引用本身,另一块是引用所指向的对象

*基本数据类型在内存中只有一块空间:里面存着值

4.4如何操作对象:使用.操作符

*使用对象名.属性操作对象的属性(如:stu.age = 18;)

*使用对象名.方法调用对象的方法(如:stu.study());

*this:每个对象都有this,this是指向本身的引用,代表本身

4.5. 必须能够独立写出Point3D的代码(题目在PPT上)

5. 访问控制,方法定义与调用,重载,方法重写5.1 访问控制5.1.1 package包的使用

*使用package 定义包:package只能放在代码的第一行

*import:导包,可以到入包下所有import java.io.*;可以导入具体的一个类import java.io.Reader;

*包的作用:1,分类;2,隐藏(封装的作用),3,便于管理

*java本身提供了一些包:java.lang(核心类,此包如需要引入),java.util(集合框架以及其他常用类),java.io(输入输出),java.awt,javax.swing(图形)

5.1.2 继承(简单概念):使用extends关键字表示继承

*子类继承父类的所有属性

*子类继承父类除private(非同包的时候也除默认的方法)外的所有方法

*子类对象拥有super引用,表示父类的引用,可以使用super明确的调用父类的方法或属性

5.1.3四个访问级别,从大到小:public ,protected,默认,private

*注意访问级别是针对类来讲的,不是针对对象!!!!!!!

*注意类的访问修饰符只能使用public 或默认

*学了访问控制后:类的属性都写private,通过set/get方法对属性进行赋值,取值

5.2 重载与重写

1.判断是否是重载,或者是否是重写,如果不是重写或者重载,就不受重写重载规则的约束

5.2.1重载:一个类当中,有方法名相同,参数不同的方法,称为重载

*不能只改返回值:不能根据方法的返回进行重载

5.2.2重写:在继承当中,子类将父类的方法重新写了一遍:重写的方法与被重写的方法拥有相同的方法签名(返回值类型,方法名,参数列数)

*.重写的方法能够改变被重写的方法的访问级别,注意只能是相等或者扩大

*.重写的方法不能抛出比被重写方法更多的异常,注意只能缩小异常的范围

*.如果被重写的方法是具体的,重写之后不能改为abstract

5.3 类与对象的生命周期

5.3.1类与对象的初始化过程:

*静态属性先初始化,而且仅仅初始化一次

*首先给静态属性进行声明,并赋默认值,然后代码从上往下执行静态代码块或静态赋值

*每创建一个对象,就先实例化成员属性:首先给成员属性声明,赋默认值,然后.执行赋值语句

*成员属性初始化后再调用构造方法

5.3.2垃圾回收机制

*java虚拟使用垃圾回收机制进行垃圾回收

*垃圾回收本身是一个线程(当内存不够用的时候,一般会进行垃圾回收)

*垃圾回收不能通过程序来调用,仅仅能够通过System.gc()建议虚拟机进行垃圾回收

*当进行垃圾回收时,会调用对象的finalize方法

5.4 单例模式:一个类仅仅能有一个实例(设计模式的一种)

*构造方法必须为私有的

*提供静态的方法来获得对象

*提供静态的属性,该属性是该类的一个对象

6. 继承,抽象类,接口

6.1 继承:

6.1.1 继承的语法:使用extends关键字表示继承

*子类继承父类所有的属性

*私有方法不能被继承

*super关键字表示父类的引用,可以用super来调用父类的方法或属性

6.2.2 继承中的构造方法:了解下面的知识点以及实例化对象时代码的执行过程

*子类的构造过程必须调用其基类的构造方法

*子类可以在自己的构造过程中使用super (arg_list)来调用基类的构造方法

*如果调用super,必须写在子类构造方法的第一行

*可以使用this(argument_list)调用本类的另外的构造方法

*如果子类的构造方法中没有显示的调用基类的构造方法,系统默认调用基类无参数的构造方法

*如果子类构造方法中既没有显式的调用基类构造方法,基类中又没有无参数的构造方法,编译出错

6.3.3 对象的转型

*一个基类的引用类型变量可以指向其子类的对象

*一个基类的引用不可以访问其子类对象新增的成员

*可以使用instanceof 关键字来判断一个引用类型变量所指向的对象是否是制定的类型

*子类的对象可以当作基类的对象来使用称作向上转型,反之称为向下转型

*子类可以当成父类来使用,无需显示转换

*父类引用转换为子类引用要进行强制转换

*注意:不兼容的类型之间不能进行相互转换(只有具有直接或间接父子关系的类才是兼容的类型),否则编译时会报错

*注意:兼容类型之间的转换要看对象的实际类型,因此向下转化时最好先用instanceof来判断是否是某个类型,在转换,以免报报错

6.4.4 多态:也称运行时绑定:一般是指父类的引用指向子类对象,通过父类的引用调用被子类重写的方法,这个时候执行的是子类的方法

*一句话总结多态:对象实际是什么类型就调用什么类型的方法

*多态成立的条件:1,要有继承。2,要有重写。3,必须有父类引用指向子类对象。

6.2 抽象类:用abstract修饰的类称为抽象类(抽象的本意是不具体)

1.抽象方法不能有方法体

2.抽象类不能被实例化。

3.含有抽象方法的类必须被声明为抽象类,

4.子类继承抽象类,必须被重写父类的抽象方法,否则本身也必须被声明为抽象类

5.抽象类中的方法和属性没有其他规则来约束,抽象类中没有抽象的方法是可以的,抽象类中可以有非抽象的方法和属性

6.3 static :静态关键字

6.3.1static属性:在类中,用static申明的成员变量叫静态变量,他为该类的公用变量,在第一使用时被初始化,对于该类的所有对象来说,static成员变量只有一份

6.3.2 static方法:用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以static方法中不可以访问非static的成员。

*静态方法中不能访问非静态成员

*静态成员方法没有this引用

*可以通过类名(不需要实例化)或对象引用来访问静态成员

6.4 final关键字:

final表示最终的意思

*final的变量的值不能够被改变

*final的成员变量

*final的局部变量(形参)

*final的方法不能够被重写

*final的类不能够被继承

6.5 接口:interface

1. 使用interface定义一个接口,使用implements实现一个接口

2. 接口中的属性只能为public static final类型(静态常量)

3. 接口中的方法只能为public abstract类型

4. 一个类可以实现多个接口,但只能继承一个类

5. 接口也可以继承接口

7. 异常处理

java的异常处理机制

异常的关键字Exception

try,catch,finally,throw,throws关键字

7.1什么是异常,为什么要引入异常

*java程序运行时出错,java就抛出异常,程序立即终止(也可以说程序崩溃)

*java将错误信息封装在异常对象里抛出

*学会查看异常的信息:异常的名字,异常的信息,程序抛异常的位置

*java引入异常处理机制,是防止程序出错崩溃

7.2java的异常的分类

*java的抛出的错误用异常类来表示,java拥有一个异常体系(有许多异常类,并且相互之间具有关系)

*java里面的所有异常都是Throwable的子类

*java虚拟机的异常是Error的子类,一般不需进行处理(因为没法进行处理)

*除Error之外还有Exception,Exception分为两类:RuntimeException(运行时异常),被检查异常(除了RuntimeException都是被检查异常)

*RuntimeException(运行时异常,可以不捕获或声明抛出,编译不会报错,一般是控制不当造成的),可检查异常(必须捕获或声明抛出,这类异常通常需要检测并处理,一般使用资源时造成的)

*几个常见的异常:NullPointerException(空指针),IndexOutOfBoundsException(索引越界),SQLException(数据库异常),IOException(文件异常)

7.3异常的处理方式

*使用try,catch,finally进行处理

*不处理,使用throws,throw交给别人来处理

7.4try,catch,finally中程序的运行过程

*尝试执行try里面的语句

*一次运行当中最多执行一个catch块,如果没有抛出异常,catch块不执行

*finally总会执行,不管有没有抛出异常

*如果try块里面有return语句,finally也会执行

7.5区分RuntimeException与被检查异常

*RuntimeException不需要捕获或声明抛出(但是如果你捕获或声明抛出也不会有错)

上一篇:美丽雪世界作文下一篇:小学普法方案