文档库 最新最全的文档下载
当前位置:文档库 › 使用 Java 集合框架

使用 Java 集合框架

使用 Java 集合框架
使用 Java 集合框架

使用Java 集合框架

Sang Shin, sang.shin@https://www.wendangku.net/doc/8810121670.html,, Sun Microsystems, https://www.wendangku.net/doc/8810121670.html,

本动手实验室将介绍如何使用Java 集合框架(Java Collection Framework)开发Java 应用程序。

预计时间:75 分钟

软件需求

开始之前,需要在您的计算机中安装以下软件。

?Java Standard Development Kit (JDK?)版本5.0(下载)。

o如果已经安装了JDK 5.0,那么可以跳过此步骤。

o安装文件的名称如下所示(针对JDK 5.0 更新版本x)。

?jdk-1_5_0_xx-windows-i586-p.exe(Windows)

?jdk-1_5_0_xx-linux-i586.bin(Linux)

?jdk-1_5_0_xx-solaris-i586.sh(Solaris x86)

?NetBeans IDE 5.5(下载)

o在安装NetBeans IDE 5.5 时,安装程序会询问使用哪个版本的JDK。

?1016_javacollections.zip(下载)

o其中含有本文档和实验室内容

o下载此压缩文件,并将它解压到任意目录中

变更记录

?2007 年 2 月9 日:创建

?2007 年 4 月12 日:课外练习由使用TreeSet 变更为HashSet

实验室练习

?练习1:构建和运行使用"Set" 集合对象的应用程序(30 分钟)

?练习2:构建和运行使用"List" 集合对象的应用程序(30 分钟)

?练习3:构建和运行使用"Map" 集合对象的应用程序(30 分钟)

?练习4:Iterator(10 分钟)

?练习5:算法

?课外练习(针对Sang Shin“Java EE 编程在线课程”的学习者)

练习1:构建和运行"Set" 集合对象

Set接口扩展了Collection 接口,且根据定义它也禁止在集合中出现重复元素。它采用所有原始方法,并且未引入任何新方法。具体的Set 实现类依赖于该对象的 equals()方法,其作用是检验等同性。

集合框架为Set 接口提供了两种通用实现:HashSet 和TreeSet。您偶尔也会用HashSet 来存储不重复的集合。出于提高效率起见,添加到HashSet 中的对象需要用一种能够合理分配哈希码的方式来实现hashCode()方法。而大多数的系统类覆盖了Object 中缺省的hashCode()实现,因而当您自己创建要添加到HashSet 的类时,请记住要覆盖hashCode()。当需要以一种排序的方式从集合中提取元素的时候,TreeSet 实现很有用。为了正确运行,添加到TreeSet 中的元素必须是可排序的。集合框架为Comparable 元素添加了支持,稍后将详细介绍。当前,假定树知道如何保证https://www.wendangku.net/doc/8810121670.html,ng 封装类的元素排好序。通常,将元素添加到HashSet ,然后将该集合转换成一个TreeSet 进行排序遍历,这样更快一些。欲优化HashSet 的空间利用,可以调整初始容量和加载因子。TreeSet 不含调优选项,因为树总是平衡的,这确保了用于插入、删除和查询的log(n)性能。

1.构建和运行使用HashSet 的应用程序

2.通过HashSet 查找重复元素

3.通过HasetSet 2 查找重复元素

4.构建和运行使用TreeSet 的应用程序

5.构建和运行使用LinkedHashSet 的应用程序

6.Set 和多态性

(1.1)构建和运行使用HashSet 的应用程序

在本步骤中,我们将构建一个使用HashSet的应用程序。您将实践HashSet类中的各个方法。以下内容引用自在线HashSet JavaDoc。

此类依靠散列表(实际上是HashMap实例)的支持来实现Set接口。它不保证 set 的迭代顺序;通常,它也不保证该顺序固定不变。此类允许null元素。

此类为基本操作(add、remove、contains和size)提供固定的时间性能,假定散列函数使元素合理地分散于多个散列桶中。对这个集合进行迭代,所需的时间需同HashSet实例的总大小(元素的数量)加上支持它的HashMap实例的"容量"(桶的数量)成比例。因而,当迭代性能很重要时,一定不要将初始容量设置得过高(或将加载因子设置得过低)。

0. 如果尚未启动NetBeans IDE,请启动它。

1. 创建一个新的NetBeans 项目。

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Set-HashSet-add作为项目名。

?在创建主类字段中,选择IDE 默认的sethashsetadd.Main。

?单击完成按钮。

图1.10:创建一个新项目

注意到出现了Set-HashSet-add 项目,而IDE 生成的Main.java则显示于NetBeans IDE 的源编辑窗口中。

2. 根据代码1.10 修改生成Main.java的IDE。仔细阅读以下代码,特别要注意粗体注释。

代码 1.10:经过修改的Main.java 文件

3. 生成和运行项目

?右键单击Set-HashSet-add 项目并选择运行。右键单击Set-HashSet-add 项目并选择运行。

?在输出窗口中查看结果。(如图1.11 所示)

图1.11:运行Set-HashSet-add 应用程序的结果

故障排除和解决方案:如果您在编译过程中看到以下警告消息,这是预料之中的。这条警告消息是由javac 编译器生成的,是由于在使用泛型时未指定集合类型。当前,忽略该消息即可。

?将源文件编译到

C:\handson2\development\javacollections\samples\Set-HashSet-add\build\c

lasses

注意:

C:\handson2\development\javacollections\samples\Set-HashSet-add\src\set

hashsetadd\Main.java 使用了未经检查或不安全的操作。注意:要了解详细信息,请

使用-Xlint:unchecked 重新编译。

?解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-HashS

et-add。您可以打开并运行它。

4. 作为练习,请执行以下操作

?创建您自己的NetBeans 项目,并将其命名为MyHashSet

?创建您自己的HashSet 对象,初始容量设为5

?将以下对象添加到新创建的HashSet 对象中

o 2 个String 对象

o 2 个MyOwnClass 对象(首先需要创建MyOwnClass.java)

o 3 个Integer 对象

?显示HashSet 对象

返回练习顶部

(1.2)通过HashSet 查找重复元素

1. 创建一个新的NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Set-HashSet-FindDup作为项目名。

?在创建主类字段中,使用IDE 提供的缺省值sethashsetfinddup.Main。

?单击完成按钮。

?注意到出现了Set-HashSet-FindDup项目,IDE 生成的Main.java显示于NetBeans IDE 的源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码1.20 所示的内容。仔细学习代码,需要特别注意黑体部分。

代码 1.20:经过修改的Main.java 文件

3. 生成和运行项目

?右键单击Set-HashSet-FindDup项目并选择运行。

?在输出窗口中查看结果。(如图1.21 所示)

图1.21:运行Set-HashSet-FindDup 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-HashSet-FindDup。您可以打开并运行它。

4. 作为练习,请完成以下任务:

?根据以下要求修改Main.java

o创建含有多个重复元素的名为myownnames[] 的Strings 数组

o通过数组创建一个HashSet 对象,显示该对象并确保在此集合中不含重复值。

返回练习顶部

(1.3)通过HashSet 2 查找重复元素

在此步骤中,您将实践removeAll()方法。

1. 创建一个新的NetBeans 对象

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Set-HashSet-FindDup2作为项目名。

?对于创建主类字段,使用IDE 所提供的默认值。

?单击完成按钮。

?注意到出现了Set-HashSet-FindDup2项目,IDE 生成的Main.java显示于NetBeans IDE 的源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码1.30 所示的内容。仔细学习代码,需要特别注意黑体部分。

代码 1.30:经过修改的Main.java 文件

3. 生成和运行项目

?右键单击Set-HashSet-FindDup2项目并选择运行。

?在输出窗口中查看结果。(如图1.31 所示)

图1.31:运行Set-HashSet-FindDup2 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-HashSet-FindDup2。您可以打开并运行它。

4. 作为练习,请完成以下任务:

?根据以下要求修改Main.java 或创建您自己的项目

o创建含多个重复值的名为myownnames[] 的Strings 数组

o创建两个HashSet 对象,使用rem oveAll()方法从原始集合里删除带重复值

的条目。

o显示这两个HashSet 对象

返回练习顶部

(1.4)构建和运行使用TreeSet 的应用程序

在本步骤中,我们将构建一个使用TreeSet的应用程序,并且将实践TreeSet类的各个方法。以下内

容引用自在线HashSet JavaDoc。

此类实现了Set接口,由TreeMap实例提供支持。此类保证排好序的集合将以元素升序排列,排序根据元素的自然顺序(参见Comparable),或者由集合创建时提供的比较器进行排序,这取决于使用哪个构造函数。

此实现保证了基本操作(add、remove和contains)所需的log(n)时间消耗。

请注意,如果由集合所维持的排序(而不论是否提供显式的比较器)要正确地实现Set接口,那么它就必须和equals 保持一致(请参考Comparable或者Comparator以对和equals 相一致有一个精确的定义。)。这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo (或compare)方法执行所有的键值比较,从集合的角度讲,使用此方法而注定相等的两个键值是相等的。Set 的行为是被定义好的,即使它的排序和equals 不一致;它也只是没有遵照Set 接口的总体约束而已。

1. 创建一个NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Set-TreeSet作为项目名。

?对于创建主类字段,使用IDE 所提供的默认值。

?单击完成按钮。

?注意到出现了Set-TreeSet ,IDE 生成的Main.java显示于NetBeans IDE 的源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码1.40 所示的内容。

代码 1.40:经过修改的Set-TreeSet.java 文件

3. 生成和运行项目

?右键单击Set-TreeSet 项目并选择运行。

?在输出窗口中查看结果。(如图1.41 所示)

图1.41:运行Set-TreeSet 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-TreeSet。您可以打开并运行它。

返回练习顶部

(1.5)构建和运行使用LinkedHashSet 的应用程序

1. 创建一个新的NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中项目名称字段中输入Set-LinkedHashSet作为项目名。

?对于创建主类字段,使用IDE 所提供的默认值。

?单击完成按钮。

?注意到出现了Set-LinkedHashSet 项目,IDE 生成的Main.java显示于

NetBeans IDE 源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码1.50 所示的内容。仔细学习代码,需要特别注意黑体部分。

代码 1.50:经过修改的Main.java 文件

3. 生成和运行项目

?右键单击Set-LinkedHashSet 项目并选择运行。

?在输出窗口中查看结果。(如图1.51 所示)

图1.51:运行Set-LinkedHashSet 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-LinkedHashSet。您可以打开并运行它。

返回练习顶部

(1.6)Set 和多态性

1. 创建一个新的NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Set-Polymorphism作为项目名称。

?对于创建主类字段,使用IDE 所提供的默认值。

?单击完成按钮。

?注意到出现了Set-Polymorphism 项目,IDE 生成的Main.java显示于NetBeans IDE 的源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码1.60 所示的内容。仔细学习代码,需要特别注意黑体部分。

代码 1.60:经过修改的Main.java 文件

3. 编写MyOwnUtilityClass.java.

代码 1.61:MyOwnUtilityClass.java

4. 生成和运行项目

?右键单击Set-Polymorphism 项目并选择运行。

?在输出窗口中查看结果。(如图1.62 所示)

图1.62:运行Set-Polymorphism 应用程序的结果

解决方案:本练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Set-Polymorphism。您可以打开并运行它。

返回练习顶部

结束语

在本练习中,您了解了如何使用HashSet、TreeSet 和LinkedHashSet。

返回顶部

练习2:构建和运行使用List 集合对象的应用程序

List 接口扩展了 Collection 接口,从而定义排好序的、允许重复值的集合。该接口添加了定位操作,以及只对列表的部分进行操作的功能。

集合框架中有两个通用的List 实现:ArrayList 和LinkedList。使用这两种实现中的哪个取决于具体

的要求。如果需要支持随机访问,要在除结尾以外的任意位置插入或删除元素,那么ArrayList 是最佳选择。如果需要从list 中部频繁添加和删除元素,并且只按顺序访问列表元素,那么 LinkedList 的实现则更好一些。

在本步骤中,将构建一个使用ArrayList的应用程序。您将练习ArrayList 类的几个方法。以

下引用自在线的ArrayList 的JavaDoc。

ArrayList是List 接口的一个可以重新改变尺寸的数组实现。它实现所有可选List 操作,

并允许所有元素,包括null 元素。除了实现List 接口,此类还提供多个方法以操纵用于

列表内部存储的数组的尺寸。(除了非同步这一点,此类大体上等同于Vector)

方法size、isEmpty、get、set、iterator 和listIterator 操作都在固定的时间运行。

而Add 操作在固定的时间里分次运行,即,添加n 个元素需要的时间为 O(n)。其他所

有操作都以线性时间运行(粗略地讲)。相比LinkedList 实现而言,固定因数较低。

每个ArrayList 实例都有一个容量。容量是用于存储列表中元素的数组尺寸。容量通常至

少也和列表的尺寸一样。随着元素被添加进ArrayList,其容量也会自动增大。并没有明确

的增大规则,增大无非基于这样一个事实,即添加元素会在固定的时间里分次运行。

应用程序可以在使用ensureCapacity 操作添加大量元素前增大ArrayList 实例的容量。

这样做也许会减小不断增加的需要重新配置的数量。

1.构建和运行使用ArrayList 的应用程序

2.构建和运行另一个使用ArrayList 的应用程序

3.构建和运行使用LinkedList 的应用程序

(2.1)构建和运行使用ArrayList 的应用程序

0. 如果尚未启动NetBeans IDE,请启动它。

1. 创建一个新NetBeans 项目。

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格下,项目名称处输入List-ArrayList作为项目名。

?在创建主类处,选择由IDE 提供的缺省值。(如图2.11 所示)

?单击完成按钮。

?注意到出现了List-ArrayList 项目,IDE 生成的Main.java显示于NetBeans IDE 的源编辑器窗口。

2. 将IDE 生成的Main.java文件修改为代码2.12 所示的内容。

代码 2.12:经过修改的LinkedListDemo.java 文件

3. 生成和运行项目

?右键单击List-ArrayList 项目并选择运行。

?在输出窗口中查看结果。(如图2.13 所示)

图2.13:运行List-ArrayList 应用程序的结果

4. 作为练习,请完成以下任务

?创建您自己的NetBeans 项目,将其命名为MyOwnArrayList。

?创建您自己的ArrayList 对象,初始容量设为5。

?将以下对象添加到新创建的ArrayList对象中。

o 2 个String 对象

o 1 个MyOwnClass 对象(首先需要创建MyOwnClass.java)

o 3 个Integer 对象

?通过ArrayList 对象创建Iterator 对象,并通过迭代显示它们。

?通过ArrayList对象创建Object 数组,并在一个for 循环中显示它们。

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/List-ArrayList。您可以打开并运行它。

返回练习顶部

(2.2)构建另一个使用ArrayList 的Java 应用程序

1. 创建一个新NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入List-ArrayList-Deal作为项目名。

?在创建主类字段中输入listarraylistdeal.Deal。

?单击完成按钮。

?注意到出现了List-ArrayList-Deal项目,生成Deal.java的IDE 显示于

NetBeans IDE 的源编辑器窗口中。

2. 根据以下代码2.20 修改IDE 生成的Deal.java。仔细阅读以下代码。

代码 2.20:经过修改的Deal.java 文件

3. 生成和运行项目

?右键单击List-ArrayList-Deal项目并选择运行。

?在输出窗口中查看结果。(如图2.21 所示)

图2.21:运行List-ArrayList-Deal 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/List-ArrayList-Deal。您可以打开并运行它。

返回练习顶部

(2.3)构建和运行使用LinkedList 的应用程序

在本步骤中,我们将构建一个使用LinkedList的应用程序,并且将实践LinkedList 类各个方法。以下内容引用自在线LinkedList JavaDoc。

LinkedList是List接口的一个实现。它实现所有可选的列表操作,并允许所有元素(包括null 元素)。除了实现List 接口外,LinkedList 类还提供一些在列表头部和尾部获取、删除和插入元素的统一命名的方法。在这些操作中,允许将多个联接的列表作为一个堆、队列或双端队列(deque)来使用。

1. 创建一个新的NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入List-LinkedList作为项目名。

?单击完成按钮。

?注意到出现了List-LinkedList 项目,IDE 生成的Main.java显示于NetBeans IDE 源编辑器窗口中。

2. 将IDE 生成的Main.java文件修改为代码2.31 所示的内容。

代码 2.31:经过修改的Main.java 文件

3.编译并运行该项目

?右键单击List-LinkedList 项目并选择运行。

?在输出窗口中查看结果。(如图2.32 所示)

图2.32:运行List-LinkedList 应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/List-LinkedList。您可以打开并运行它。

4. 请完成下列任务作为练习

?创建您自己的NetBeans 项目,命名为MyOwnLinkedList

?创建您自己的LinkedList 对象

?将以下对象添加到新创建的LinkedList 对象

o 2 个String 对象

o 1 个MyOwnClass 对象(首先需要创建MyOwnClass.java)

o 3 个Integer 对象

?练习以下方法

o将MyOwnClass 对象的第二个实例添加到第三个位置

返回练习顶部

结束语

在本练习中,我们构建并运行了使用ArrayList 和LinkedList 集合对象的Java 应用程序。

返回顶部

练习3:构建和运行使用"Map" 集合对象的应用程序

Map 接口并非 Collection 接口的扩展。该接口拥有自己的接口层级,从而维护键-值关联。根据定义,该接口描述了从键到值的映射,而没有多余的键。

可以该接口方法分解为三套操作:更改、查询和提供备选视图。

更改操作允许添加或从该映射删除键-值对。键和值都可以为null。但不能把Map 作为键或值添加给它本身。

* Object put(Object key, Object value)

* Object remove(Object key)

* void putAll(Map mapping)

* void clear()

查询操作可用于检验映射的内容:

* Object get(Object key)

* boolean containsKey(Object key)

* boolean containsValue(Object value)

* int size()

* boolean isEmpty()

最后一组方法可用于将键群或值群作为集合来操作。

* public Set keySet()

* public Collection values()

* public Set entrySet()

既然映射中键的集合必须是惟一的,那么您就取回一个Set。既然映射中值的集合不一定是惟一的,那么您就得回一个Collection。最后一个方法返回一个实现Map.Entry 接口的元素Set ,接下来将介绍该接口。

Map 的 entrySet()方法返回一个实现Map.Entry 接口的对象集。该集合中的每个对象都是底层Map 中具体的键-值对。

在这个集合中进行迭代,可以获取键或值,也可以改变每个条目的值。然而,如果底层Map 在Map.Entry 接口的setValue()方法外被修改,该条目集就会变为无效,从而导致迭代器的行为成为未定义行为。

集合框架提供两个通用Map 实现:HashMap 和TreeMap 。在所有具体的实现中,使用哪个实现取决于具体的需求。对于在一个Map 中插入、删除和定位元素,HashMap 是最佳选择。如果要以一种排列好的顺序遍历键,TreeMap 更好一些。依据集合大小,向HashMap 中添加元素,然后将该映射转换为TreeMap 以供排好序的键遍历,要更快一些。使用HashMap 要求添加的键类具有一个定义良好的hashCode()实现。使用TreeMap 实现,添加到映射的元素必须是可排序的。同样,稍后将进一步介绍排序。

1.构建和运行使用HashMap 的简单应用程序

2.构建和运行使用TreeMap 的简单应用程序

3.构建和运行使用LinkedHashMap 的简单应用程序

4.映射和多态性

(3.1)构建和运行使用HashMap 的简单应用程序

1. 创建一个NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Map-HashMap作为项目名。

?单击完成按钮。

?注意到出现了Map-HashMap project 项目,IDE 生成的Main.java显示于NetBeans IDE 的源编辑窗口中。

2. 将IDE 生成的Main.java文件修改为代码

3.10 所示的内容。

代码 3.10:Main.java

3. 生成和运行项目

?右键单击Map-HashMap 项目并选择运行。

?在输出窗口中查看结果。(如图3.11 所示)

图3.11:运行应用程序的结果

解决方案:此练习作为可运行的NetBeans 项目包含在动手实验室的压缩文件中。项目文件位于

/javacollections/samples/Map-HashMap。您可以打开并运行它。

4. 作为练习,请完成以下任务

?创建您自己的NetBeans 项目,将其命名为MyHashMap

?创建您自己的HashMap 对象

?将以下对象添加到新创建的HashMap 对象中。

o 2 个键值为"1st"、"2nd"的String 对象

o 2 个键值为"3rd"、"4th"的MyOwnClass 对象

o 1 个键值为"5th"的Integer 对象

?以未排序和排序两种顺序显示这些对象

返回练习顶部

(3.2)构建和运行使用TreeMap 的简单应用程序

1. 创建一个NetBeans 项目

?选择文件->新建项目(Ctrl+Shift+N)。此时将出现新建项目对话框。

?在选择项目窗格中,选择类别列表中的Java,并选择项目列表中的Java 应用程序。单击下一步按钮。

?在名称和位置窗格中的项目名称字段中输入Map-TreeMap作为项目名。

?单击完成按钮。

Java集合框架实验报告

浙江大学城市学院实验报告 课程名称Java高级程序设计 实验项目名称Java集合框架实验 学生姓名专业班级学号 一、实验目的 1.理解Java集合框架的特点、接口与类之间的关系 2.掌握Java集合框架的List接口,以及List接口的重要实现类LinkedList、ArrayList 3.掌握Java集合框架的Set、SortedSet接口,以及重要实现类HashSet与TreeSet 4.掌握Java集合框架的Map、SortedMap接口及其重要实现类HashMap、TreeMap 5.掌握Java集合框架的Collection与Iterator接口的特点与使用方式 二、实验内容 1、使用List管理对象集合 2、使用Map管理对象集合 3、使用Set管理对象集合 4、设计一个自定义的集合类 三、实验步骤 1、在Eclipse中新建工程(即项目) 2、使用List管理对象集合 1)新建一个包listExample 2)在这个包中新建三个类:Student类,StudentList类,StudentListTest类。 参考代码: Student、java, StudentList、java,StudentListTest、java 3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改源代码程序, 给出具体的实现代码(不使用泛型类)。

void addStudent(Student student){//添加一个学生对象 boolean a=true; for(int i=0;i

JAVA集合框架(精校版本)

集合框架 ?Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。它们都封装在java.util包中 核心接口 ?Java集合框架的核心接口有两种:Collection(聚集)和Map(映射) ?Collection 接口是一组允许重复的对象。 ?Set 中的数据对象没有顺序且不可以重复。接口 ?List中的数据对象有顺序且可以重复。接口 ?Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。不能有重复的键 Collection ?类java.util.Collections 提供了一些静态方法实现了基于List容器的一些常用算法?void sort(List l) 对List容器内的元素排序 ?void shuffle(List l) 对List容器内的对象进行随机排列 ?void reverse(List l) 对List容器内的对象进行逆续排列 ?void fill(List l, Object o) ?用一个特定的对象重写整个List容器 ?void copy(List dest,List src) ?将src List容器内容拷贝到dest List容器 ?int binarySearch(List l, Object o) ?对于顺序的List容器,采用折半查找的方法查找特定对象

例题: List l1 = new LinkedList(); List l2 = new LinkedList(); for(int i=0; i<=9; i++) { l1.add("a"+i); } System.out.println(l1); Collections.shuffle(l1); //随机排列 System.out.println(l1); Collections.reverse(l1); //逆续 System.out.println(l1); Collections.sort(l1); //排序 System.out.println(l1); System.out.println(Collections.binarySearch(l1,“a5”)); //折半查找List

Java集合体系结构分析与比较

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 中所有元素添

java集合详解

集合 版本号:1.0 作者:huangdos 日期:2006年6月06日

摘要 摘要内容 Java里面最重要,最常用也就是集会一部分了。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。 关键字: Collection , List ,Set , Map , 集合,框架。

目录 1集合框架 (2) 1.1集合框架概述 (2) 1.1.1容器简介 (2) 1.1.2容器的分类 (3) 1.2C OLLECTION (5) 1.2.1常用方法 (5) 1.2.2迭代器 (8) 1.3L IST (10) 1.3.1概述 (10) 1.3.2常用方法 (10) 1.3.3实现原理 (14) 1.4M AP (18) 1.4.1概述 (18) 1.4.2常用方法 (18) 1.4.3Comparable 接口 (23) 1.4.4实现原理 (24) 1.4.5覆写hashCode() (29) 1.5S ET (32) 1.5.1概述 (32) 1.5.2常用方法 (33) 1.5.3实现原理 (36) 1.6总结:集合框架中常用类比较 (38) 2练习 (38) 3附录:排序 (40)

集合 1集合框架 1.1集合框架概述 1.1.1容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一些有意义的事情。 举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员的身份证号。我们可以通过身份证号来顺序存储每个雇员,但是在内存中实现呢?是不是要准备足够的内存来存储1000个雇员,然后再将这些雇员逐一插入?如果已经插入了500条记录,这时需要插入一个身份证号较低的新雇员,该怎么办呢?是在内存中将500条记录全部下移后,再从开头插入新的记录? 还是创建一个映射来记住每个对象的位置?当决定如何存储对象的集合时,必须考虑如下问题。 对于对象集合,必须执行的操作主要以下三种: ◆添加新的对象 ◆删除对象 ◆查找对象 我们必须确定如何将新的对象添加到集合中。可以将对象添加到集合的末尾、开头或者中间的某个逻辑位置。 从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个“洞”。 在内存中建立对象集合后,必须确定如何定位特定对象。可建立一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的对象为止。 前面大家已经学习过了数组。数组的作用是可以存取一组数据。但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应用场景的要求。 1.首先,在很多数情况下面,我们需要能够存储一组数据的容器,这一点虽然数组可以实现,但是如果我们 需要存储的数据的个数多少并不确定。比如说:我们需要在容器里面存储某个应用系统的当前的所有的在线用户信息,而当前的在线用户信息是时刻都可能在变化的。也就是说,我们需要一种存储数据的容器,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。 2.我们再假设这样一种场景:假定一个购物网站,经过一段时间的运行,我们已经存储了一系列的购物清单 了,购物清单中有商品信息。如果我们想要知道这段时间里面有多少种商品被销售出去了。那么我们就需要一个容器能够自动的过滤掉购物清单中的关于商品的重复信息。如果使用数组,这也是很难实现的。 3.最后再想想,我们经常会遇到这种情况,我知道某个人的帐号名称,希望能够进一步了解这个人的其他的 一些信息。也就是说,我们在一个地方存放一些用户信息,我们希望能够通过用户的帐号来查找到对应的该用户的其他的一些信息。再举个查字典例子:假设我们希望使用一个容器来存放单词以及对于这个单词的解释,而当我们想要查找某个单词的意思的时候,能够根据提供的单词在这个容器中找到对应的单词的解释。如果使用数组来实现的话,就更加的困难了。 为解决这些问题,Java里面就设计了容器集合,不同的容器集合以不同的格式保存对象。

常用的几种java集合类总结

一:直观框架图 简单版: 详细版: Java集合框架 Java集合框架主要包括两种类型的容器,一种是集合(Collection),另一种是图(Map)。Collection接口又有3种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、lixxxxnkedList、HashSet、lixxxxnkedHashSet、HashMap、lixxxxnkedHashMap等等。Map常用的有HashMaplixxxxnkedHashMap等。 二、Collection接口 1.List List接口扩展自Collection,它可以定义一个允许重复的有序集合,从List接口中的方法来看,List接口主要是增加了面向位置的操作,允许在指定位置上操作元素,同时增加了一个能够 双向遍历线性表的新列表迭代器ListIterator。AbstractList类提供了List接口的部分实现,

AbstractSequentialList扩展自AbstractList,主要是提供对链表的支持。下面介绍List接口的 两个重要的具体实现类,也是我们可能最常用的类,ArrayList和lixxxxnkedList。 1.1ArrayList 通过阅读ArrayList的源码,我们可以很清楚地看到里面的逻辑,它是用数组存储元素的,这 个数组可以动态创建,如果元素个数超过了数组的容量,那么就创建一个更大的新数组,并 将当前数组中的所有元素都复制到新数组中。假设第一次是集合没有任何元素,下面以插入 一个元素为例看看源码的实现。 1. 2. 1、找到add()实现方法。 3. 4. 5. 6. public boolean add(E e) { 7. 8. ensureCapacityInternal(size + 1); // Increments modCount!!

Java集合框架的线程安全

集合框架的线程安全Java Java集合框架的线程安全 周庆岳 Java集合框架是由Java平台标准版1.2 (Java SE 1.2)引入的通用数据结构与算法框架。其灵活的面对对象设计受到了广大Java程序员的一致青睐,为Java

平台的成熟奠 定了坚实的基础。 一个集合(也称容器)是指将一组元素组合成一个单元的简单对象。集合用于存储、取回、操作和传递这些聚合的元素。集合框架是指一个统一的用来表示和操作集合的体系结构[Bloch,1999]。最简单的集合如数组、列表和队列等,集合框架最著名的例子如C++ 标准库(STL)。 线程安全不是一个全有或全无的问题,难以对其进行精确的定义。线程安全笼统地讲是指程序在多线程环境下运行时的正确性。Java集合框架的设计者Bloch Joshua在他著名的《Java高效编程》一书中对Java线程安全的等级做出了相对精确的定义[Bloch,2001]:非可变、线程安全、条件线程安全、线程兼容和线程不友好。 本文将结合上述Bloch关于线程安全等级的定义,对Java集合框架中的集合类进行线程安全性分析,并指出各个集合类在现实的编程环境中需要注意的并发

编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行分析。所涉及的集合类不仅包括Java SE 1.2引入的集合类,还包括旧集合类(Java SE 1.2前引入)和新集合类(Java SE 5引入)。从而帮助Java程序员在进行并发编程时更加高效地利用Java集合框架。 Java线程安全的等级定义 根据Bloch的定义,将线程安全分为五个等级,下面将给出这五个等级的描述和部分示例。 1、非可变 如果一个类的所有实例对于调用它们的客户端对象总是恒定不变的,而无需外部同步,则称为非可变的。字符串类和整数类都是非可变的,但在集合框架中并没有提供直接的非可变类,而是通过对可变类进行封装而得到非可变类。 非可变集合不可修改,因而它可以在各个线程间安全共享而无需额外的同步。作为一个好的实践准则,一旦生成非可变类之后,不要再持有被其封装的集合类的 引用,这样才可以完全保证其非可变性。2、线程安全 类的实例是可变的,但它的所有方法已经通过使用足够的内部同步使其实例可以被并发的使用而无需外部同步。并发的调用将会以某种全局一致的方式连续地执行。随机类和 定时器类都是线程安全类。集合框架中线程安全的类并发哈希映射类在Java SE 5 中被引入,它并不包含在原来的集合框架中,但它实现了集合框架Map接口。并发哈希映射类实现了并发和效率之间的高效平衡,已被作为哈希表类和同步映射表封装在并发环境下的高效替代品。 3、条件线程安全 - 2 - 除了某些方法需要在没有其它线程的干扰的情况下顺次执行之外,条件线程安全类和线程安全类类似。为了消除线程干扰的可能性,客户端对象在调用这类方法的过程中需要获得该集合类对象的锁来进行同步。一些旧集合类如Vector和Hashtable都是条件线程安全类,对这些集合类进行遍历操作时需要对其进行外部同步。 4、线程兼容 对其对象实例的所有方法调用都通过外部同步之后再进行,线程兼容类可以安全

Java 集合框架类图

Collection <>Deque <>Queue <>List <>Set <>SortSet <> Iterable <> ArrayDeque <> LinkedList PriorityQueue ArrayList <> Stack Vector <> EnumSet> <> HashSet LinkedHashSet NavigableSet <> TreeSet <> <> Map <>EnumMap,V> <> HashMap <> LinkedHashMap TreeMap <> SortedMap <>NavigableMap <> <> <> <> Hashtable <> IdentityHashMap <> WeakHashMap <> Java 集合框架类图

Java集合Collection、List、Set、Map使用详解

Java集合排序及java集合类详解(Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。 目录 1 集合框架 (1) 1.1 集合框架概述 (2) 1.1.1 容器简介 (2) 1.1.2 容器的分类 (4) 1.2 Collection (6) 1.2.1 常用方法 (6) 1.2.2 迭代器 (8) 1.3 List (10) 1.3.1 概述 (10) 1.3.2 常用方法 (11) 1.3.3 实现原理 (15) 1.4 Map (18) 1.4.1 概述 (18) 1.4.2 常用方法 (18) 1.4.3 Comparable 接口 (23) 1.4.4 实现原理 (24) 1.4.5 覆写hashCode() (29) 1.5 Set (33) 1.5.1 概述 (33) 1.5.2 常用方法 (33) 1.5.3 实现原理 (38) 1.6 总结:集合框架中常用类比较 (39) 2 练习 (40) 3 附录:排序 (41) 1集合框架

1.1集合框架概述 1.1.1容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一些有意义的事情。 举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员的身份证号。我们可以通过身份证号来顺序存储每个雇员,但是在内存中实现呢?是不是要准备足够的内存来存储1000个雇员,然后再将这些雇员逐一插入?如果已经插入了500条记录,这时需要插入一个身份证号较低的新雇员,该怎么办呢?是在内存中将500条记录全部下移后,再从开头插入新的记录? 还是创建一个映射来记住每个对象的位置? 当决定如何存储对象的集合时,必须考虑如下问题。 对于对象集合,必须执行的操作主要以下三种: ◆添加新的对象 ◆删除对象 ◆查找对象 我们必须确定如何将新的对象添加到集合中。可以将对象添加到集合的末尾、开头或者中间的某个逻辑位置。 从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个“洞”。 在内存中建立对象集合后,必须确定如何定位特定对象。可建立一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的对象为止。 前面大家已经学习过了数组。数组的作用是可以存取一组数据。但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应用场景的要求。 1.首先,在很多数情况下面,我们需要能够存储一组数据的容 器,这一点虽然数组可以实现,但是如果我们需要存储的数据 的个数多少并不确定。比如说:我们需要在容器里面存储某个

Java集合框架总结

JA V A集合框架 一、集合框架 在实际开发中,需要将对象根据不同的需求而存储在特定的数据结构容器中。但是数组虽然是一种用来存储数据的数据结构,但是它的局限性很低,很难满足各种的需求,所以JDK出现了用来满足各种需求的框架——集合框架。 “集合框架”主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。 常见的集合类有:1)实现Collection接口的:List接口、Set接口。 2)实现Map接口的。 二、Collection接口 Collection接口表示了如何把一组对象作为它的元素。JDK没有直接提供Collection接口的实现,Collection接口的实现依赖于两个继承自自己的接口:Set和List。所有通过实现Collection接口的子接口的类应该提供两个标准的构造器:一个不需要参数的构造器,用来创建一个空的集合,另外一个需要一个类型作为参数的构造器,用来创建一个和参数的类型相同的元素的集合。 int size():返回这个集合中的元素的数量。 boolean isEmpty():返回集合是否包含元素,如果没有的话,返回true。 boolean contains(E e):如果这个集合包含某个指定的元素,返回true。 Iterator iterator():返回这个集合中的所有元素的迭代。 boolean add(E e):向集合中添加新的元素,如果添加成功,返回true。 boolean remove(E e):从集合中删除指定元素,如果删除成功,返回true。 boolean containsAll(Collection c):这个集合是否包含指定集合中的所有的元素。 boolean addAll(Collection c):添加指定的集合中的所有元素到这个集合中。 boolean removeAll(Collection c):删除当前集合中与给定集合相同的元素。在这个调用返回之后,这个集合将不包含和指定的集合一样的元素。 boolean retainAll(Collection c):从这个集合中删除所有不包含在指定的集合中的所有元素。 T[] toArray(T[] a):返回一个包含集合中所有的元素的数组。 void clear():从集合中删除所有的元素。 boolean equals(Object obj):比较这个集合和指定对象是否相等。 int hashCode():返回这个集合的哈希值。 三、List接口 List 接口继承了Collection 接口,用于定义一个允许重复项的有序集合。可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或者减少。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。 面向位置的操作包括插入某个元素或Collection 的功能,还包括获取、除去或更改元素的功能。在List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置: void add(int index, Object element): 在指定位置index上添加元素element。 boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index。 Object get(int index): 返回List中指定位置的元素。 int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1。 int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否则返回-1。 Object remove(int index):删除指定位置上的元素。

java 集合框架(习题与答案)解析

java 集合框架(习题) 集合框架 Key Point * Collection 接口、Set 接口、List 接口基本操作 * List 接口及其实现类 * Set 接口及其实现类 * 迭代遍历 * Hash 算法与hashCode 方法 * Comparable 接口 * Map 接口及其实现类 * 遍历Map * 泛型 练习 1. 填空 Collection 接口的特点是元素是对象; List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复; Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复;Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); } public static void printList(List list){ for(Object obj:list){ String str=(String)obj; System.out.println(obj); } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别?

使用 Java 集合框架

使用Java 集合框架 Sang Shin, sang.shin@https://www.wendangku.net/doc/8810121670.html,, Sun Microsystems, https://www.wendangku.net/doc/8810121670.html, 本动手实验室将介绍如何使用Java 集合框架(Java Collection Framework)开发Java 应用程序。 预计时间:75 分钟 软件需求 开始之前,需要在您的计算机中安装以下软件。 ?Java Standard Development Kit (JDK?)版本5.0(下载)。 o如果已经安装了JDK 5.0,那么可以跳过此步骤。 o安装文件的名称如下所示(针对JDK 5.0 更新版本x)。 ?jdk-1_5_0_xx-windows-i586-p.exe(Windows) ?jdk-1_5_0_xx-linux-i586.bin(Linux) ?jdk-1_5_0_xx-solaris-i586.sh(Solaris x86) ?NetBeans IDE 5.5(下载) o在安装NetBeans IDE 5.5 时,安装程序会询问使用哪个版本的JDK。 ?1016_javacollections.zip(下载) o其中含有本文档和实验室内容 o下载此压缩文件,并将它解压到任意目录中 变更记录 ?2007 年 2 月9 日:创建 ?2007 年 4 月12 日:课外练习由使用TreeSet 变更为HashSet 实验室练习 ?练习1:构建和运行使用"Set" 集合对象的应用程序(30 分钟) ?练习2:构建和运行使用"List" 集合对象的应用程序(30 分钟) ?练习3:构建和运行使用"Map" 集合对象的应用程序(30 分钟) ?练习4:Iterator(10 分钟) ?练习5:算法 ?课外练习(针对Sang Shin“Java EE 编程在线课程”的学习者)

JAVA 集合框架

集合框架 1. JAVA 集合框架的组成 三部分: 接口,接口的实现类,算法类(工具类) 接口如:Collection,List,Map 实现类:ArrayList,LinkedList,HashMap等 算法类:Collections,Arrays 如上图所示 接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。 实现类:8个实现类(实线表示),对接口的具体实现。 左下角即为算法类. 在JAVA 集合中又主要分为这三种类型 Set和List集合接口(两者同属 Collection 接口下的 )和Map接口 Set(集) 接口类型:集合中的对象没有特定的方式排序,没有重复对象,但它的某些实现类能对集合中的对象按特定方式排序。 List(列表) 接口类型:是有序的Collection,集合中的对象按照索引位置排序,可以有重复对象,可以按对象在集合中的索引位置检索对象,与数组类似。 Map(映射) 接口类型:集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能够对集合中的键对象进行排序。 有趣的是Collection接口不提供随机访问元素的get()方法。因为Collection 包括Set,而Set自己维护内部顺序。如果想检查Collection中的元素,那就必须使用迭代器。 而List接口中则出现了 get(int index)方法,其实现类 ArrayList和LinkedList也就实现了这个方法。 另外 Collection 接口的iterator() 和 toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组. Iterator接口隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。hasNext()判断是否遍历完毕,next()返回下一个元素等等。 除了 Collection接口必备 iterator()方法外,List还提供了一个

几种Java集合框架详解

几种Java集合框架详解 Java集合框架Koloboke详解作者:chszs,未经博主 允许不得转载。经许可的转载需注明作者和博客主页:https://www.wendangku.net/doc/8810121670.html,/chszsKoloboke的目标是替换标准的Java集合和流的API,提供更高效的实现。Koloboke目前 的版本主要是替换java.util.HashSet和java.util.HashMap。Koloboke提供了一套完整的集合原始类型的实现,可以避免开销很大的装箱/拆箱操作,节省了原始类型装箱消耗的内存。在Koloboke中,HashSet和HashMap比其它专门的实现(比如GS collections、fastutil、HTTP & Trove)要更快,这是因为:1)相比于其它库,Koloboke对每个entry 使用了更少的内存 2)Koloboke目标是把键和值存储在同一行高速缓存中 3)所有的方法都经过了实现优化,而不是像AbstractSet 类或AbstractMap类那样委托给框架类(Skeleton Class)Koloboke的官网: http://chronicle.software/products/koloboke-collections/Kol oboke的特征:1)极好的兼容Java集合框架(JCF,Java Collections Framework) 2)所有原始专门的集合类都继承了基本的接口(比如Collection、Set、Map)

3)可用于替换标准的JCF 4)Koloboke API for Java 6 and Java 7向前兼容Java 8的新方法 5)快速失败的语义 6)支持null键(可选的),就像java.util.HashMap中的Float.NaN和Double.NaN键的处理那样。什么时候使用Chronicle Map或Koloboke Map?使用Chronicle Map的场景: 1)存储的entry超过5亿条 2)在进程之间分布Map 3)使用堆外内存(Off-Heap Memory),因为键和值占用了太多的内存,JVM遭遇GC的痛苦当不想在进程间共享数据,且存储的entry在5亿条以内,那么Koloboke是更理想的选择。Koloboke目前的最新版本为0.6.8版。可以从Maven 仓库使用它:<dependency> <groupId>net.openhft</groupId> <artifactId>koloboke-api-jdk8</artifactId> <version>0.6.8</version> </dependency> <dependency> <groupId>net.openhft</groupId> <artifactId>koloboke-impl-jdk8</artifactId>

java集合框架练习题

java集合框架练习题 集合框架 Key Point * Collection 接口、Set 接口、List 接口基本操作 * List 接口及其实现类 * Set 接口及其实现类 * 迭代遍历 * Hash 算法与hashCode 方法 * Comparable 接口 * Map 接口及其实现类 * 遍历Map * 泛型 练习 1. 填空 Collection 接口的特点是元素是对象; List 接口的特点是元素有顺序,可以重复; Set 接口的特点是元素无顺序,不可以重复; Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。 2. 有如下代码 import java.util.*; public class TestList{

public static void main{ List list = new ArrayList; list.add; list.add; list.add; list.add; printList; } public static void printList{ for{ String str=obj; System.out.println; } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和 LinkedList 使用上有什么区别?实现上有什么区

别? 把实例化的语句改为new LinkedList; ArrayList数组实现查询快增删慢 LinkedList 链表实现查询慢增删快 4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使用上有什么区别?实现上有什么区别? ArrayList是线程不同步的,轻量级的,线程不安全,速度快 Vector是线程同步的,多线程访问比较安全,速度慢 3. 写出下面程序的运行结果 import java.util.*; public class TestList{ public static void main{ List list = new ArrayList; list.add; list.add; list.add; list.add; list.remove; list.remove; for; i++){

Java集合框架实验报告

浙江大学城市学院实验报告 课程名称 Java高级程序设计 实验项目名称 Java集合框架实验 学生姓名专业班级学号 一、实验目的 1.理解Java集合框架的特点、接口与类之间的关系 2.掌握Java集合框架的List接口,以及List接口的重要实现类 LinkedList、ArrayList 3.掌握Java集合框架的Set、SortedSet接口,以及重要实现类HashSet 与TreeSet 4.掌握Java集合框架的Map、SortedMap接口及其重要实现类HashMap、 TreeMap 5.掌握Java集合框架的Collection与Iterator接口的特点与使用方式 二、实验内容 1、使用List管理对象集合 2、使用Map管理对象集合 3、使用Set管理对象集合 4、设计一个自定义的集合类 三、实验步骤 1、在Eclipse中新建工程(即项目) 2、使用List管理对象集合 1)新建一个包listExample

2)在这个包中新建三个类:Student类,StudentList类, StudentListTest类。 参考代码: Student.java, StudentList.java,StudentListTest.java 3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改 源代码程序,给出具体的实现代码(不使用泛型类)。 void addStudent(Student student){//添加一个学生对象 boolean a=true; for(int i=0;i

实验三 Java集合框架

实验三Java集合框架 【实验目的】 一、掌握Collection中List的使用; 二、掌握Map的使用。 【实验内容】 一、用Collection中List实现一个简单的学生信息管理系统。学生信息有:学号、姓名、年龄、三门课成绩等。在其上实现增删改查的操作; 二、用Map 实现电话簿管理程序。根据姓名查询电话号码。 【实验结果】 一、学生信息管理系统 import java.util.ArrayList; import java.util.Scanner; import java.util.List; //三门课成绩类 class Score{ double Chinese; double English; double Math; } //学生信息类 class Student{ private String sID; private String sName; private String sAge; private Score sMark=new Score(); public Student(){ } public Student(String sID,String sName,String sAge,double Chinese,double English,double Math){ this.sID=sID; this.sName=sName; this.sAge=sAge; this.sMark.Chinese=Chinese; this.sMark.English=English; this.sMark.Math=Math; }

public String getID(){ return sID; } public String getName() { return sName; } public String getAge() { return sAge; } public double getChinese(){ return sMark.Chinese; } public double getEnglish() { return sMark.English; } public double getMath(){ return sMark.Math; }public void setID(String sID){ this.sID=sID; } public void setName(String sName) { this.sName=sName; } public void setAge(String sAge) { this.sAge=sAge; } public void setChinese(double Chinese){ this.sMark.Chinese=Chinese; } public void setEnglish(double English) { this.sMark.English=English; } public void setMath(double Math){ this.sMark.Math=Math; } public String toString(){ return"学号:"+sID+" 姓名:"+sName+" 年龄:"+sAge+" 语文成绩:"+sMark.Chinese +" 英语成绩:"+sMark.English+" 数学成绩:"+sMark.Math; } } //操作管理类 public class StudentSystem{

相关文档