在编程语言中,集合是指代表一组对象的对象。Java平台专门有一个集合框架(Collections Framework)。集合框架是指表示和操作集合的统一架构,隔离了集合的操作和实现细节。
集合框架中的集合接口主要分为两大部分,一部分继承自java.util.Collection
,另一部分继承自java.util.Map
(其实Map本质上并不是集合,只是看起来好像可以像集合一样操作)。一个有趣的事情是这些接口的实现不一定都需要实现这些接口中的修改方法(如add,remove等),可以给某些不想实现的修改方法抛出一个运行时异常(UnsupportedOperationException)。
List
List是Java中的一个接口,继承了Collection接口。它是一个有序集合,又称序列,允许存储重复元素。其实现类常用的有ArrayList、LinkedList等。ArrayList是实现了List接口的可变长数组。它的特点是add方法操作时间复杂度为分期常量时间(amortized constant time),意思即如果添加n个元素则耗时O(n),其它操作耗时则是线性时间。每个ArrayList都有个容量,即存放元素能力的大小。这个容量是list中元素个数。当添加新的元素时,这个容量也会自动添加,这需要消耗一定时间。如果要添加大量数据到ArrayList,可以先调用ensureCapacity
操作,从而减少每次添加新元素容量自动调整的时间。
需要注意的是ArrayList并不是线程同步的。如果多个线程同时访问一个ArrayList实例,至少一个线程修改了其结构(添加或删除元素,或显式的调整了其大小,仅仅设置元素值并不属于结构修改),则会使程序进入不确定的状态。解决方式之一就是使用一个线程同步的对象来封装该ArrayList。或者也可以用Collections.synchronizedList来封装。
List list = Collections.synchronizedList(new ArrayList(...));
实现原理就是Collections.synchronizedList返回的类的iterator做了特殊处理。如果iterator被创建后,除了自己的add和delete方法,有其他行为导致了List结构被修改,iterator将会抛出一个ConcurrentModificationException
异常。当然iterate这种处理方式并不能担保它能处理所有的异步并发修改,只能降低程序陷入不确定状态的概率。
LikedList是一个双重链表,它既实现了List接口,也实现了Deque接口。LikedList也不是线程安全的,解决方式与ArrrayList基本相同。
Set
Set也是Java中的一个接口,同样继承于Collection。与List不同的是,Set不允许放置重复元素,并且最多只能放置一个null元素。其实现类有HashSet、TreeSet等。
HashSet的实现其实是依托了一个HashMap的实例。HashSet并不保证元素的迭代顺序每次都是一致的。HashSet的基本操作(add,remove,contains及size)耗时都是常数时间,即迭代Set的耗时与Set的大小乘以HashMap实例的乘积成正比。HashSet也不是线程安全的。
Map
Map则是另一种重要的数据结构,是一组键值对的集合。Map不允许有重复的key存在。 它的实现中有HashTable和HashMap。两者非常相似,最大的不同是HashMap不是线程安全的,并且允许null值作为key或value,而HashTable则不允许。
HashMap的性能取决于两个因素:一个是初始容量,一个是负载因数。容量是哈希表中bucket的数量。初始容量则是HashMap被创建时容量。负载因数则是当容量需要自动增加的阀值。当HashMap中的元素超过了负载因数和当前容量的乘积,HashMap则会重新进行hash计算,以便bucket数量增加到以前的近似两倍。一般负载因子的默认值是0.75,这能达到时间和空间的一个平衡。负载因子过大,虽然会减少空间消耗,但是增加查找时间。
相关推荐
// java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
java集合类list-set-map.doc
本文将深入探讨如何使用Java来操作Redis,包括设置和获取String、List和Map类型的数据,并且会介绍如何进行封装和单元测试。 首先,要与Redis进行交互,我们需要引入Jedis库,这是Java最常用的Redis客户端。在你的...
### Java中List、Set和Map的区别 在Java编程语言中,`List`、`Set`和`Map`是集合框架中的三个核心接口,它们分别代表了不同类型的集合数据结构,各自有着独特的特性和应用场景。 #### List `List`接口是最常用的...
在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中最常用的是`Set`、`Map`和`List`。这三种集合类型各自具有独特的特性和用途,理解它们之间的区别与联系对于有效地使用Java进行数据管理至关重要...
自己写的例子,Java连接 redis 测试了string,list set ,map类型,以及中文测试,都正常,资源解释:http://www.cnblogs.com/aspirant/p/6816180.html
Java集合Collection、List、Set、Map使用详解
Java 集合框架中 List、Set、Map 的用法和区别 Java 集合框架(Java Collections Framework)是 Java 语言中的一个重要组件,提供了一些基本的数据结构和算法来操作和存储数据。其中,List、Set、Map 是三个非常...
在Java编程语言中,集合框架是处理对象组的重要工具,其中`List`、`Set`和`Map`是三大核心接口。本资料“Java list set map.zip”专注于讲解这些接口及其相关实现,帮助开发者深入理解Java集合类的使用。 首先,`...
在Java编程语言中,集合框架是处理对象组的重要工具,主要包括List、Set和Map三大接口。这些接口由Java Collection Framework提供,它是一个统一的架构,用于存储和操作各种类型的对象。接下来,我们将深入探讨这三...
在Java编程语言中,集合框架是处理对象集合的重要工具,主要包括了List、Set、Map以及Table等接口及其实现类。这些接口和类各有特点,适用于不同的数据存储和操作场景。 1. **List接口**: - List是Collection的一...
详细描述map、list、set的常用子类特性,各个场景的适用。
Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的介绍。 一、Array、Arrays 和 Collection...
详细介绍了java中的list、map、set的存储方式及使用方法,涵盖了多个java大侠的见解,让读者充分了解list、map、set的区别和使用
本文将深入解析Java集合中的Collection、List、Set和Map,包括它们的使用方法、实现原理以及如何进行排序。 ### 集合框架概述 1.1.1 容器简介 容器是Java集合框架的基础,它是一个可以存储多个对象的容器,提供了...
Java 中 List、Array、Map、Set 等集合相互转换 在 Java 中,集合类型的转换是非常常见的操作,例如将 List 转换为 Array、将 Array 转换为 List、将 Map 转换为 List 等等。今天,我们将详细介绍 Java 中 List、...
《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析 - java相关技术(partner4java专栏)
在某些情况下,我们需要对Map中的键进行排序,这时候就需要使用`Comparable`接口。该接口用于定义对象之间的自然排序规则。 ##### 4.3 实现原理 常见的Map实现包括: - **HashMap**:基于哈希表实现,提供了快速...
在Java编程语言中,数据结构之间转换是常见的需求,尤其是集合框架中的List、Set和Map以及数组。本文将深入探讨这些数据结构之间的转换方法,并提供相关的实例代码。 1. **List转Set** 要将一个List转换为Set,...
本文将深入探讨Java集合框架中的四个主要接口:Collection、List、Set和Map,以及它们的实现原理。 ### 集合框架概述 集合框架是Java API中用于存储和管理对象的统一框架。它为数据结构提供了抽象接口,使得程序员...