`

Java容器

 
阅读更多

Java集合类就像容器。把多个对象的引用放进容器中。即集合类主要负责保存,盛装其他数据。因此集合类也被称为容器类。所有集合类都位于java.util包下。

 

集合类不同于数组,数组元素既可以是基本数据类型也可以是对象。而集合里只能保存对象(实际是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)

集合必须只有对象,集合中的元素不能是基本数据类型。

 

Java集合类分为两种

Collection : 一组分立的元素。

Map : 一组“key-value”对。

 

Java集合类可以用来实现常见的数据结构。

Java集合类大致上可分为Set,List,Map。

Set表示无序,不可重复的集合。

List表示有序,可重复的集合。

Map表示有影射关系的集合。

 

JDK1.5后引入QueueQueue代表队列集合的实现。

 

 

 

Collection 接口

Collection接口用于表示任何对象组,该接口定义了作为集合所应该拥有的一些方法。

Collection接口是ListSetQueue接口的父接口。若要尽可能以常规方式处理一组元素,即使用该接口。

 

Collection接口里定义了如下操作集合方法

1. 添加和移除

boolean add(Object o) :该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了则返回true

remove(Object o) :删除集合中指定元素o,当集合中包含了一个或多个元素o时,这些元素将被删除,该方法将返回true

 

2. 查询操作

isEmpty() :返回集合是否为空。当集合长度为0时返回true,否则返回false

iterator() :返回一个Iterator对象,用于遍历集合里的元素。

int size() :该方法返回集合里元素的个数。

boolean contains(Object o) :返回集合里是否包含指定元素。

 

3. 组操作

boolean addAlI(Collection c) :该方法把集合C里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true

void clear() :清除集合里的所有元素,将集合长度变为0

boolean containsAlI(Collection c) :返回集合里是否包含集合C里的所有元素。

boolean removeAlI(Collection c) :从集合中删除集合C里包含的所有元素(相当于用调用该方法的集合减集合C),如果删除了一个或一个以上的元素,该方法返回true

boolean retainAll(Collection c)  :从集合中删除集合C里不包含的元素(相当于取得把调用该方法的集合变成该集合和集合C的交集),如果该操作改变了调用该方法的集合,该方法返回true

 

4. 转换数组

Object[] toArray()

Object[] toArray(Object[] a)

该方法把集合转换成一个数组,所有集合元素变成对应的数组元素。

其中第二个方法Object[] toArray(Object[] a) 的参数 a 是集合中所有存放的对象的类的父类。

 

 

List接口及其实现类

List接口中方法清单

void add(int index,E element) : 在列表的指定位置插入指定元素。

boolean addAll(int index,Collection<? extends E> c) : 将指定集合中的所有元素插入到集合中的指定位置。

E get(int index) : 返回集合中指定位置的元素。

int indexOf(Object o) : 返回指定对象在集合中第一次出现的索引,从0位置开始,返回-1为不存在该元素。

int lastIndexOf(Object O) : 返回指定对象在集合中最后一次出现的索引位置,返回-1为不存在。

ListIterator<E> listIterator() : 以正确的顺序返回集合中元素的列表迭代器。

ListIterator<E> listIterator(int index) : 以正确的顺序返回集合中元素的列表迭代器,从集合中指定的位置开始。

E remove(int index) : 移除集合中指定位置的元素。

E set(int index,E element) : 用指定元素替换集合中指定位置的元素。

List<E> subList(int fromIndex,int toIndex) : 返回集合中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。

List接口提供了名称为ListIterator的特殊迭代器。

List在数据结构中分别表现为数组、向量、链表、堆栈、队列等形式。

 

 

 

ArrayList

ArrayList基于数组实现的List

按元素位置进行索引,查找和修改速度较快,缺点是插入或者删除速度较慢。

在执行插入删除时调用的是System.arraycopy方法,是一个native方法。

 

 

Vector的特点、实现机制及使用方法

Vector的特点

Vector基于数组实现的List。线程安全。Vector中的所有方法前面都有一个synchronized关键字做修饰。

 

Stack的特点、实现机制及使用方法

a) Stack的特点

 

Stack : (后进先出),继承Vector类。主要操作有判空、压栈、退栈、取栈顶元素等。

b) Stack的实现机制

Stack继承自Vector,同样使用数组保存数据,根据该数据结构的特点进行了限制性操作。JDK中共提供了6个方法用于实现特定要求的操作

Stack() : 构造一个空的栈

empty() : 判断栈是否为空

peek() : 查看栈顶元素并返回栈顶对象

pop() : 删除栈顶元素并返回栈顶对象

push(E element) : 将一个元素压入当前栈中

search(Object o) : 查看指定对象是否在当前栈中

 

 

Queue

队列

 

 

 

LinkedList

使用双向链表实现的List。链表操作的优点就是插入删除比较快,但是不能按索引直接存取,所以执行更新操作比较快,执行查询操作比较慢。

 

通常只需知道LinkedList提供了双向队列、栈的功能。

这个类定义的链表也可以像栈或队列一样被使用。

 

LinkedList实现了许多对firstlast元素进行操作的方法,比如setgetremove等。

虽然LinkedList获取指定位置的元素时较ArrayList按索引获取较慢,但是JDK中对get方法做了优化

使用size>>1 == size/2,移位运算要比除法运算效率高的多。

 

LinkedListArrayList的使用方法类似,只是看自己的需要进行选择了。除此之外LinkedList还实现了栈操作的所有方法。

 

 

 

Set接口及其实现类

Set集合中不能添加相同元素。与数学的集合概念类似。若相同则add方法返回false,且新元素不会被加入。

Set判断两个对象是否相同,使用equals方法。

也就是说,如果只要两个对象的equals方法比较返回trueSet就认为两个对象相同。不会接受这两个对象。反之,只要返回false Set认为这两个对象不同。把它们当成两个对象处理。

 

 

 

HashSet

Set接口的实现类。HashSetHash算法来存储集合中的元素。因此具有很好的存储查找性能。

HashSet具有以下的特点

不能保证元素的排列顺序,顺序有可能发生变化。

HashSet不是线程同步的。

HashSet的元素值可以是null

 

HashSet中判断两个对象是否重复。是通过比较hashCode()方法得到hashCode来进行比较的。这与set接口定义的规则有所不同。

 

 

 

LinkedHashSet

继承HashSet类,没有新增实现方法。LinkedHashSet集合根据hashCode值来决定元素的存储。同时使用链表维护元素的顺序(按照元素插入set的顺序保存)。当遍历LinkedHashSet时,访问set的顺序是set中添加元素的顺序。

 

 

TreeSet

TreeSetSortedSet接口的唯一实现。TreeSet中的元素是有序的,并且元素是不能重复的。

TreeSet中的顺序是根据元素实际值来排序的。

如果使用TreeSet类,则类中的对象必须实现Comparable接口,否则将会出现ClassCastException异常。compareTo(Object obj)方法是Comparable接口定义的方法。大部分Java类实现Comparable接口。

 

TreeSet会调用元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。

 

 

EnumSet

枚举集合类。EnumSet中所欲的值都必须指定枚举类型的枚举值。

EnumSet的元素是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

EnumSet在内部以向量的形式存储。这种存储形式高效,占用内存小,批量操作效率高。

 

EnumSet集合不允许加入null元素。如果试图插入null,将抛NullPointerException异常。

 

 

说明:

HashSet性能好于TreeSet。当Set需要保存顺序时,使用TreeSet,否则使用HashSet。

HashSet的子类LinkedHashSet,对普通插入,删除操作比HashSet要略慢。遍历比HashSet快。

EnumSet是所有Set实现类中,性能最好。但只能保持同一个枚举类的枚举值作为集合元素。

 

没有线程安全的Set实现类。

 

 

Map接口

Map也被称为字典,或关联数组。Map由一组” key-value”构成。key中包含的对象不能重复。Map像一个小型数据库,通过“key”找到该键对应的“value”。

 

Map接口的子接口以及主要实现类有:

子接口:BindingsConcurrentMapConcurrentNavigableMapMessageContextLogicMessageContextNavigableMapSOAPMessageMapSortedMap

实现类:AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, EnumMap,ConcurrentSkipListMap,HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons,Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport,TreeMap, UIDefaults,WeakHashMap

 

Map接口中定义的通用方法:

1. 添加和删除Map中的某个元素

put(K, V) 将给定的“键-值”对放入到给定的Map当中。

putAll(Map<? extends K, ? extends V) : 将指定的Map中的“键-值”对放入到给定的Map当中。

remove(Object key) : 从该集合中移除指定的对象,并返回对应的value

clear() : 清空Map中的所有对象。

 

2. 查询与Map有关的数据

int size() : 返回此Map中“键-值”对的个数。

boolean isEmpty() : 判断此Map中“键-值”对的个数是否为0

boolean containsKey(Object key) : 测试此Map中是否有该key

boolean containsValue(Object value) : 测试此Map中是否包含该value

V get(Object key) : 通过指定的key查询Map中对应的value

Collection<Object value> values() : 取得Map中所有的value

Set<Object key> keySet() : 取得当前Mapkey的集合。

Set<Entry<K, V>> entrySet() : 取得当前Mapentry的集合。

 

 

HashMap

HashMap实现了MapCloneMapSerializable三个接口,并且继承自AbstractMap类。

 

HashMap的实现机制

HashMap基于hash数组实现,若keyhash值相同则使用链表方式进行保存,详见HashSet中的说明。我引用网上一个名词叫“链表散列”来形容这样的数据结构。

Hashtable允许使用null作为keyvaluekey最多一个为null

 

Hashtable

Hashtable是线程安全的Map实现。性能比HashMap低。Hashtable不允许使用null作为keyvalue。如果试图把null值放进NullPointerException异常。

 

 说明:

HashMap与Hashtable与ArrayList与Vector类似。

 

SorterMap接口

 

 

TreeMap实现类

基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有key-value对处于有序状态。

TreeMap的所有key必须实现Comparable接口。

 

 

WeakHashMap

使用方法与HashMap类似。该类中的每个key对象保存了实际对象的弱引用。即当垃圾回收了key所对应的实际对象之后,WeakHashMap会自动删除该key对key-value对。

HashMap的key保存了十几对象的强引用。即只要该HashMap对象不被销毁,该HashMap对象所有key所引用的对象不会被当即回收。

 

IdentityHashMap实现类

该类通过两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等。

 

HashMap的key通过key之间的对象的equals比较范围true,且hashCode值相等。

 

允许null作为key和value。不保证key-value对之间的顺序。其顺序可能随时间变化。

 

 

EnumMap实现类

该类中所有key都必须是单个枚举类的枚举值。

EnumMap内部已数组形式保存。

EnumMap根据key的自然顺序(枚举值在枚举类中定义顺序)来维护key-value对的顺序。通过遍历keySet,entrySet(),values()等方法来遍历EnumMap时即可看到这种顺序。

 

EnumMap不允许null作为key值,但允许null作为value。若干使用null作为key将抛出NullPointerException异常。

 

创建EnumMap时,必须指定一个枚举类。从而将该EnumMap和指导枚举类关联起来。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 71.5 KB
分享到:
评论

相关推荐

    java容器详细解析

    Java容器详细解析 Java容器是一种基本的数据结构,用于存储和管理对象。Java容器主要分为两大类:Collection和Map。 Collection Collection是一个独立元素的序列,这些元素都服从一条或多条规则。Collection接口...

    Java容器总结

    在IT领域,Java容器是一个非常重要的概念,尤其对于软件开发者来说,它们是理解和构建高效、可扩展的应用程序的关键。本文将深入探讨Java容器,并结合标签“源码”和“工具”,从源码层面和实用工具角度来分析这些...

    java容器学习心得

    ### Java容器学习心得详解 在Java编程中,容器(Containers)是存储和操作对象集合的重要工具,主要包括集合(Collections)和映射(Maps)。本文将深入解析Java容器的关键概念、特性以及不同容器类型的应用场景。 ...

    JAVA容器对象整理

    这篇博客"JAVA容器对象整理"可能涵盖了关于Java中的不同容器类、接口以及它们的使用方式。在这里,我们将深入探讨一些核心的Java容器知识点。 1. **ArrayList与LinkedList** - `ArrayList`是一个基于数组实现的...

    Java 容器.pdf_电子版pdf版

    Java 容器详解 Java 容器是 Java 语言中的一种集合类库,主要包括 Collection 和 Map 两种类型。Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection Collection 是一种集合接口...

    java容器类 是初学者很好的学习材料

    Java容器类是Java编程语言中不可或缺的一部分,它们主要用于存储和管理对象。这些类和接口位于`java.util`包中,为开发者提供了灵活的数据结构和数据操作方式。在Java中,容器类主要分为两大类:Collection和Map。 ...

    JAVA容器效率深度分析List

    在Java编程中,容器是用于...总之,理解并掌握这些Java容器的特性和效率差异,能够帮助我们在实际开发中做出更合适的选择,提高程序的性能和可维护性。在具体应用时,还需要结合业务需求和性能测试,才能做出最佳决策。

    Java容器有两种基本类型Collection 和 Map

    Java 容器的两种基本类型:Collection 和 Map Collection 和 Map 是 Java 中的两种基本容器类型,它们都可以用来存储和管理对象,但它们有着不同的特点和用途。 Collection 是一种聚集对象的容器,每个位置只能...

    JAVA容器讲解.pdf

    Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)

    JAVA容器知识积累

    Java容器是Java编程中至关重要的一个部分,它们用于存储、管理和操作对象集合。在这个主题下,我们将深入探讨Java中的核心容器类,包括数组、List、Set和Map,以及它们各自的特点和使用场景。 1. **数组**:数组是...

    Java容器实现图书管理

    题目摘要:考虑下列的信息系统。出版社需要记录下列书籍和作者的信息: P1: 每一本书有一个title,一个description和一个ISBN number 还有 出版的日期(包括年/月) P2: 每一本书有1个或多个作者。...

    Java容器起源

    ### Java容器起源与JSP容器背景解析 #### 容器技术概述 容器技术在现代IT领域扮演着极其重要的角色,特别是在云计算和微服务架构中。本文将深入探讨容器技术的起源,尤其是针对Java环境中JSP容器的发展历程及其...

    JAVA容器归纳总结_01版.mmap

    对于java容器的一些归纳整理,顺着思维导图能方便自己的理解,提高运用能力

    JAVA 容器用法详解

    JAVA 容器用法详解,关于JAVA容器的详细讲解

    Java容器简要介绍

    Java容器是Java编程中不可或缺的一部分,它们主要用于存储和管理对象,提供了一种高效且灵活的方式来组织和操作数据。本文将简要介绍Java容器的主要概念、API以及常用的容器类。 首先,Java容器分为两大主要类别:...

    JAVA 容器类应用

    Java容器类是Java集合框架的重要组成部分,它们提供了一种存储、管理和操作对象的方式。在Java中,容器类包括数组、列表、队列、集、映射等数据结构,它们为开发者提供了灵活的数据处理能力。本篇文章将深入探讨Java...

    java容器

    Java容器是Java编程中一个非常重要的概念,它主要用于管理和组织对象。在Java中,容器可以是集合、框架或服务提供者等,它们为其他对象提供存储、管理以及生命周期控制等功能。容器广泛应用于企业级开发,尤其是在...

    JAVA容器总结

    后缀为.mmap的思维导图,总结了JAVA容器的常见类

    java容器介绍及应用

    Java容器是Java编程中至关重要的部分,它们是用于存储、管理和操作对象的工具。Java集合框架,包括List、Set、Map、ArrayList、LinkedList等,构成了Java容器的主要元素。以下是对这些概念的详细解释: 1. **集合...

    Java容器学习笔记:容器概览,容器中的设计模式,容器源码分析 - List,容器源码分析 - Map,容器源码分析 - 并发容

    Java容器学习笔记: 容器概览, 容器中的设计模式, 容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...

Global site tag (gtag.js) - Google Analytics