Java实用类库提供了一套相当完整的容器类,其中基本的类型是List,Set,Queue和Map。这些对象也被称作集合类,其提供了完善的方法来保存对象。
(1)泛型和类型安全的容器
一个类如果没有显式的声明继承与哪个类,那么它自动继承自Object类。因此假如有一个ArrayList,因为ArrayList保存的是Object类,因此你可以将Apple(自定义的类)放进这个容器中,还可以添加Orange对象,而且无论编译器还是运行期都不会有问题。当你在使用ArrayList的get()方法取出你认为是Apple的对象时,你得到的只是Object的引用,必须将其转型为Apple。因此引入泛型避免了这个麻烦。
(2)基本概念
Collection
java.util下的接口,是各种集合结构的父接口
有时为了通用性,会向上转型为Collection接口。
一些常用的方法:
add(Object obj):将指定对象添加到集合中
remove(Object obj):将指定对象从集合中移除
remove(int index):将指定位置对象从集合中移除
isEmpty():返回boolean值,用于判断集合是否为空
iterator():返回迭代器,用于遍历
size():返回int型值,即元素个数
contains(Object obj):判断是否包含此对象
List
由于List继承了Collection接口,因此Collection接口的方法仍试用
有两种类型的List:
一、ArrayList 比较常用与随机的访问元素,但在插入和删除操作时,工作效率比较慢。
二、LinkList 相对于ArrayList来说正好解决了他的问题,代价较低(比较廉价)的进行插入和删除工作,但随机访问的效率又会变低。
总之,他们是互补的,List在被创建之后仍可以添加,删除元素,可以自我调整尺寸,这正是他最大的魅力所在:一种可修改的序列。
一些常用的方法:
get(int index):获得指定索引位置的元素
set(int index ,Object obj):将指定位置的对象修改为指定的对象
Set
Set不保存重复的元素,如果你试图将一个类的多个实例添加到Set中的话,他会阻止你这样做。Set最常用的属性就是测试归属性,你可以很容易的判断一个对象是否在Set中,查询就成为了Set中最重要的操作,因此你通常都会选择HashSet来对查询进行优化。
出于对查询速度的原因,HashSet中的对象没有顺序可言,HashSet使用了散列。
一些常用方法:
first():返回Set中当前第一个元素
last():返回Set中当前最后一个元素
subSet(E fromElement,E fromElement):返回一个新的集合(左开右闭)
Map
将对象映射到其他对象的能力是解决问题的杀手锏。Map就是我们强大的编程工具,他有一组“键值对”的对象组成,允许你使用键来查找值。
import java.util.*;
5
6 public class PrintingContainers {
7 public static Collection fill(Collection<String> collection){
8 collection.add("张三");
9 collection.add("李四");
10 collection.add("王二");
11 collection.add("麻子");
12 return collection;
13 }
14 public static Map fill(Map<String, String> map){
15 map.put("张", "张三");
16 map.put("李", "李四");
17 map.put("王", "王二");
18 map.put("麻", "麻子");
19 return map;
20 }
21 public static void main(String[] args) {
22 System.out.println(fill(new ArrayList<String>()));
23 System.out.println(fill(new LinkedList<String>()));
24 System.out.println(fill(new HashSet<String>()));
25 System.out.println(fill(new TreeSet<String>()));
26 System.out.println(fill(new LinkedHashSet<String>()));
27 System.out.println(fill(new HashMap<String, String>()));
28 System.out.println(fill(new TreeSet<String>()));
29 System.out.println(fill(new LinkedHashMap<String, String>()));
30 }
31
32 }
通俗的说吧,java容器类库有两种主要类型Collection和map,区别在于容器中的每个“槽”保存的元素个数:
collection和旗下的list,Set,Queue都是每个槽一个元素;
map和旗下的各种HashMap,TreeMap等都是一个槽两个元素(一个是key,一个是value),两者对应起来,像个简单的数据库;
其中collection接口继承自Iterable接口
public interface Collectionextends Iterable
而这个Iterable接口有一个方法,iterator iterator(),以匿名内部类的方式实现这个方法并返回一个继承了iterator接口的的子对象;
一些常用方法:
put(K key,V value):向集合中添加指定的映射关系
containsKey(Object key):如果集合包含指定key的映射关系,则返回true
containsValue(Object value):如果映射将一个或多个key映射到这个指定值,返回true
get(Object key):如果存在指定的key对象,返回该key对应的值,否则返回null
values():返回该集合中所有对象形成的Collection集合
Map与数组和其他Collection一样,可以扩展到多维,例如Map