`

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics