Java集合详解

通常,程序总是根据运行时才知道的某些条件去创建新的对象。在此之前,无法知道所需对象的数量甚至确切类型。为了解决这个普遍的编程问题,需要在任一时刻和任意位置创建任意数量的对象。因此,不能依靠创建命名的引用来持有每一个对象:MyType aReference ,因为从来不会知道实际需要多少个这样的引用。Java 中有多种方式保存对象(准确来说是对象的引用)。数据是 Java 中保存一组对象最有效的方式,如果想要保存一组基本类型数据,也推荐使用数组。但是数组具有固定的大小尺寸,而且在更一般的情况下,在写程序的时候并不知道需要多少个对象,或者是否需要更复杂的方式来存储对象,因此数组尺寸固定这一限制就显得太过受限了。

*java.util * 库提供了一套相对完整的集合类(collection classes)来解决这个问题,其中基本类型有 List、Set、Queue 和 Map。这些类型也被称作容器类(container classes)。Set 对于每个值都只保存一个对象,Map 是一个关联数组,允许将某些对象和其他对象关联起来。Java 集合类都可以自动调整自己的大小。

基本概念

Java集合分类体系图(包括抽象类和遗留构件,不包括Queue):

截屏2019-10-24下午4.06.49

Java集合类库采用“持有对象”(holding objects)的思想,并将其分为两个不同的概念,表示为类库的基本接口:

  1. 集合(Collection):一个独立元素的序列,这些元素都服从一条或多条规则。List 必须以插入的顺序保存元素,Set 不能包含重复元素,Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
  2. 映射(Map):一组成对的“键值对”对象,允许使用键来查找值。ArrayList 使用数字来查找对象,因此在某种意义上讲,它是将数字和对象关联在一起。 map 允许我们使用一个对戏那个来查找另一个对象,它也被称作关联数组(associative array),因为它将对象和其它对象关联在一起;或者称作字典(dictionary),因此可以使用一个键对象来查找值对象,就像在字典中使用单词查找定义一样。Map 是强大的编程工具。

Collection&Map区别

Collection 和 Map 接口之间的主要区别在于:Collection中存储了一组对象,而 Map 中存储关键字键/值对。Collection 接口,包含 list 和 set 子接口;继承 Map 的类有HashMap,HashTable。Map 中每一个关键字最多有一个关联的值。不能包括两个相同的键,一个键最多能绑定一个值。null可以作为键,这样的键值可以有一个。当get()方法返回null值时,即可以表示Map中没有该键,也可以表示该键对应的值为null。所以不可以通过get()方法判断Map中的某个键是否存在,而应该通过containsKey()方法来判断。Map中提供三种集合的视图,Map的内容可以被当作一组key集合,一组value集合和一组key-value的映射。

浅拷贝&深拷贝

浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

深拷贝的实现方式:使用JSON拷贝、序列化或者重写clone方法并遍历。

# List, Map, Set
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×