数据量大用对象存储,对象量大用容器(集合)/数组存储。然而,数组是定长的,并且要求是同一类型的。
存储方式的不同,称为数据结构。正因为数据结构不一样,所以有这么多集合类型。
====================具体方法查API====================
容器(集合)地图:
Collection【interface】
Set【interface】(无序,不可重复)
HashSet
TreeSet
List【interface】(有序,可重复)
LinkedList
ArrayList
Vector
Map【interface】(键值对)
HashMap
TreeMap
HashTable
====================具体方法查API====================
Collection
有增(add、addAll)、删(remove、removeAll)、查(contains)、取(iterator)、取交集(retainAll)、hashCode、equals、size等常用方法。
iterator详解:
迭代器接口,调用此方法后,返回一个内部类对象(因为iterator是接口),这个内部类对象是所有集合类型的内部类,对外暴露有三个方法:hasNext、next、remove。
注意:无论使用何种迭代器,都可以迭代器和集合并发操作(迭代器是集合的引用,对迭代器的操作就是对集合的操作),否则抛出异常。
List
与拥有Collection的全部方法,另外特有的方法如下:
增:add(index,element); addAll(index,collection);
删:remove(index);
改:set(index,element);
查:get(index); subList(start,end); listIterator();
listIterator迭代器功能比Collection强大,除了包含Collection的方法,还可以set、previous、hasPrevious等等。
ArrayList
数组结构存储的List,增、删较慢,查较快。初始长度为10,超出后new一个新数组(长度为50%原长,Vector为100%),copy原数组过去。
LinkedList
链表结构存储的List,增、删较快,查较慢。
Vector(已抛弃)
数组结构存储的List,增、删、改、查都慢,jdk1.0出现的(当时集合还没出现),jdk1.2后基本被ArrayList代替,唯一区别是Vector是线程同步的,ArrayList线程不同步。具有特有的遍历方法——枚举(已被迭代器取代,不建议使用)。
Set
和Collection方法一样。
HashSet
hash表结构存储的Set,线程非同步。
添加元素时,先对比hashCode值,再equals判断(ArrayList是只经equals判断),查、删同理。遍历可知无序。
TreeSet
Tree结构存储的Set,会对集合中的元素进行排序(默认是ASCII码表)。添加的元素具备比较性或者Tree集合具备。
1、元素比较性:添加元素(类)时,此元素(类)必须实现Comparable接口,实现compareTo方法(即定义排序规则)。采用二叉树判断法(比如左小右大)排序(元素边多会自动折中判断)。顺序遍历,从下到上,从左到右;逆序遍历,从右到左,从下到上。
2、Tree集合一初始化时就具备比较性(参照TreeSet的构造函数):自己写一个类实现Comparator接口,实现compare方法,然后再构造Tree时传入该类的实例。【常用】
当元素(1)和容器(2)都具备比较性,以容器(2)为主。
Map
存储键值对,增 (put注意返回值、putAll),删(clear、remove)、判(containsValue、containsKey、isEmpty)、获(get、size、values取所有的值返回到一个Collection)、entrySet、keySet。【Set的底层就是使用了Map的方法】
Hashtable
jdk1.0时代,键/值不能为空,线程同步。
HashMap
jdk1.2出现,键/值可以为空,线程不同步,代替了Hashtable的存在。【注意:null可以作为键】
TreeMap
可以给Map中的键排序。