使用泛型和并发改善集合

自从最初的 Java 2 platform, Version 1.2 发布以后,Java Collections Framework 一直在不断发展。在 Java SE 5 中,泛型的引入增强了框架, java.util.concurrent 的引入添加了对并发的直接支持(请参阅 参考资料)。 在 Java SE 6 中,框架中添加了更好的双向集合访问特性。本文将向您介绍集 合库的所有这些方面,并帮助您利用与并发相关的流行功能。

本文的高级任务是创建一个 Web crawler:给定一个网站的基 URL,从该网 站收集可以用作某种用途的元素。您将从单个网页收集一系列链接,然后蔓延到 整个网站。把高级任务分解为子任务,这些子任务可以转化为自己的作业。您将 了解并使用泛型和线程池。为了使任务更加简单,我们将任务作为独立的客户端 应用程序实现。(解释如何部署 Web 应用程序并不是本文的中心目的。但是可 以随意创建一个 Web 应用程序,将任务作为附加的练习在此应用程序中启动。 )

您应该熟悉 Java 平台上的程序开发。本文假设您熟悉连网和 I/O 库,这两 方面知识将分别用于 socket 连接和读取流。您需要安装一个开发人员版本的 Java SE 6 平台。它至少应该是来自 Sun Microsystems 的 Update 5 of JDK 6 或来自 IBM 的 最新的 SDK for Java, Version 6。

了解泛型

从 Java SE 5 版本开始,泛型的概念就成为了 Java 平台的一部分(请参阅 参考资料)。简单来说,泛型为集合提供了编译时类型安全。在早期的 Java 平 台版本中,您创建一个集合,并向其中添加项,如清单 1 所示:

清单 1. 向集合添加项 — 旧方法

List buttonList = new LinkedList();
buttonList.add(new JButton("One"));
buttonList.add(new JButton("Two"));
buttonList.add(new JButton("Three"));
buttonList.add(new JButton("Four"));

要从集合中提取元素,您必须知道集合中对象的类型,以将其强制转换为合 适的局部变量:

JButton first = (JButton)buttonList.get(0);

您并不需要 将其强制转换为正确的类型,但是如果您想要对某个特定类类型 进行操作,则需要这么做。这种方法运行得很好,除非您不小心向集合中添加了 错误的类型对象:

buttonList.add(new JLabel("Five"));

现在,如果您尝试将最后一个元素作为 JButton 来提取,则在运行时会出现 一个类转换异常:

Line 13: JButton last = (JButton)buttonList.get(4);
>java GetIt
Exception in thread "main" java.lang.ClassCastException:
  javax.swing.JLabel cannot be cast to javax.swing.JButton
     at GetIt.main(GetIt.java:13)

在本质上,将 JLabel 放入集合并没有任何问题,但是如果提取代码希望集 合中的所有元素都是同一类型(这里为 JButton),那么从集合中提取一个 JLabel 就会生成 ClassCastException。这个异常只会在运行时出现;如果没有 进行足够的测试,那么也许直到部署之后才会出现该异常。

时间: 2024-11-03 21:08:33

使用泛型和并发改善集合的相关文章

WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

在.NET中,所有的集合都实现了IEnumerable接口,比如Array.Hashtable.ArrayList.Stack.Queue等.有的集合要求元素具有相同的类型,这种集合一般通过泛型的方式定义,它们实现另一个接口IEnumerable<T>(IEnumerable<T>本身继承自IEnumerable),这样的集合有List<T>.Dictionary<TKey,TValue>.Stack<T>.Queue<T>等.基于集

将json字符串中数组节点转换为泛型list集合(gson)

开发中需要将json中节点单独取出某个节点,解析获取数据,此处对json字符串节点中数组节点,转换为泛型list集合,使用gson. google的gson的pom文件和jar:gson 代码如下: package my.demo.java.z.generic; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.google.gson

C#并行编程-并发集合

原文:C#并行编程-并发集合 菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 背景 基于任务的程序设计.命令式数据并行和任务并行都要求能够支持并发更新的数组.列表和集合. 在.NET Framework 4 以前,为了让共享的数组.列表和集合能够被多个线程更新,需要添加复杂的代码来同步这些更新操作. 如您需要编写一个并行循环,这个循环以无序的方式向一个共享集合中添加元素,那么必须加入一个同步机制来保证这是一个线程安全的集合. System.Collenctions

关于Java集合框架面试题(含答案)上_java

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类. (2)随着使用经过严格测试的集合框架类,代

集合框架

集合框架 简介 集合的由来 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 定义: java提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛.这种数据结构成为集合:Collection. Collection是一个接口,其定义了集合的相关功能方法. 数组和集合的区别 区别1 : 数组既可以存储基本数据类型,又可以存储引用

C#2.0的泛型代理和事件 :以一当百的快感

今天用C#2.0的泛型改写了我的一个系统的消息实现,感觉非常不错,很简洁而且速度快了(MSDN上那么说的,暗示诱导使我也有此感觉,呵呵). 我们唠会儿嗑,回顾一下经典内容:.NET框架的消息模型,构建于一个连接事件句柄的代理(delegate),要想触发某个事件,两个基本元素是必须考虑的: 1.事件的源头触发者,它定义了一个事件:public class EventSender{     ...     //声明一个代理类型,本例中,它指向一个无返回值的方法,并有两个参数     public

我为什么喜欢用C#来做并发编程

题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家门)昨天发了一篇文章<为什么用 Java -- 关于并发编程>,让大家学习了Java中如何进行并发编程的一些基本知识.作为一个将近15年的.NET程序员,我觉得有必要给大家补充介绍一下C#进行并发编程的知识(当然不会太深入讲解).这篇文章无意进行技术比较,毕竟技术只是工具(大同小异,各有千秋),主要还是看用工具的人. 并发(英文Concurrency),其实是一个很泛的概念,字面意思就是"同时

黑马程序员 十五、内省:JavaBean、 Beanutils、注解、泛型

Java帮帮-IT资源分享网 内省:JavaBean. Beanutils.注解.泛型  1.内省了解 JavaBean JavaBean 是一种特殊的 Java 类,主要用于传递数据信息,这种 java 类中的方法主要 用于访问私有的字段,且方法名符合某种命名规则. 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之为值对象(Value Object,简称 VO).这些信息在类中用私有 字段来存储,如果读取或设置这些字段

Fork and Join: Java也可以轻松地编写并发程序

原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) 如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑.这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行.在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多个可以并行执行的块,以便可以最大化利用计算能力. 处理并发(并行)程序,一向都是比较困难的,因为你必须处理线程同步和共享数据