java中集合类的关系图:
要求:理解并会画(其中虚线框中的代表是接口)
Collection
|--List:有序集合,这里的有序是指存取顺序是一致的,和堆栈一样,元素都有索引。元素可以重复。
|--Set:无序集合,存入的数据和取出的数据可能不一致。集合内没有重复的元素
两者皆有的方法:
①添加
add(Object):添加一个元素
addAll(Colletction);条件一个集合中的所有元素
②删除:
remove(obj):删除集合中的一个数,删除后集合的长度会改变
remove(Collection):删除集合中和Collection相同的部分元素
clear();清空集合
③获取:
size():集合中元素的个数
Iterator iterator():迭代器,用来取出集合中的所有元素
④判断:
boolean contains(obj):判断集合中是否有obj元素
boolean containsAll(Collection);集合中是否包含指定的多个元素,
boolean isEmpty():集合中是否有元素
⑤取交集
boolean retainAll(Collection ):取出当前集合和传入集合的相同部分,如果两个元素相等,返回flase,如果当前集合被改变,返回true
⑥改变:
toArray();将集合改变成为数组
List属于Collection接口的子接口,所以List具备了Collection集合的所有属性,查询API文档可以看出一个特点,那就是List特有的方法都有使用到索引
List
|--ArrayList :底层是一个数组,线程不同步。但是此数组的长度是可变的,也就是说数组的长度会随元素的添加和删除而发生改变,元素查询速度快
|--LinkedList:底层是一个链表,线程不同步,增删元素快
|--Vector: 底层是一个数组结构。线程同步,查询与增删都很慢
List特有的方法:
①,添加:
add(index,element);在指定位置加入一个元素
add(index,Collection):在指定位置家收入一个集合
②删除:
remove(index):删除指定位置的元素
③获取:
Object get(index):获取指定索引出的值
int IndexOf(obj): 获取元素第一次出现的位置,如果该元素不存在,返回-1,可以通过此方法判断集合中是否有某个元素
int LastIndexOf(obj):获取该元素最后一次出现的位置
List subList(start,end);获取从start到end的子列表。
ListIterator listIterator():获取所有元素,list集合特有的迭代器。
④,修改;
Object set(Index,element):对指定位置元素进行修改
List集合可以使用期索引对集合中的元素进行操作,但是在对集合进行修改的时候,会发生异常(ConcurrentModeficationException),产生这中异常的原因是在操作集合应用的时候,同时也在操作迭代器应用,这样以来,在对集合应用进行修改,迭代器并不知道,所以会产生异常。
在Interator迭代器中就只有hasNext,next,remove方法,但是他的子接口可以实现对元素的增删改查,(listIterator),该迭代器也是List特有的。
Set
Set接口中的方法和Collection中的方法时一致的,Set接口取出的方式只有一种,迭代器。
|--HashSet:底层数据结构是哈希表,线程不同步,无序,高效。
HashSet集合保证了集合中的元素的唯一性,通过元素的hashCode和equals方法,可以得出元素相对应的hash值,先进行hashcode 的计算,如果相同,再判断元素是否相同,相同,不存,不同,存储,如果hashCode计算不相同,不判断equals方法。
|--LinkedHashSet:有序,hashcode的子类
|--TreeSet:对Set集合中的元素进行指定的顺序排序,不同步,TreeSet集合底层数据结构是二叉树
TreeSet
用于对set集合中的元素按指定顺序排序的集合,前提是集合中的元素自身要具备比较性
想要使用TreeSet集合对所有元素进行比较排序,那么集合中的元素必须要实现Comparable接口,复写compareTo方法,依据compareTo的返回值(1,0,-1),确定元素在TreeSet中的哪一个位置.返回-1,当前对象比下一对象”小“,为1,则“大”,为0,则说明这两个对象相等,不存。
TreeSet集合排序有两种方法:Comparable和Comparator:
①:让元素自身剧本比较性,需要元素事项Comparable接口,覆盖compareTo方法
②:让集合自身具备比较性,构造一个比较器,实现Comparator接口,覆盖comparable方法,一般使用第二种方法
Map集合
|--Hashtable:底层是hash表数据结构,是线程同步的,键不可以为null,值也不可以为null;
|--HashMap:底层是hash表数据结构,线程不同步,键可以为null,值也可以为null。
|--TreeMap:底层是二叉树数据结构,线程不同步,可以对Map集合中的键进行排序操作。
Map集合和Collection集合的不同:
Map集合存储的是一个键值对,也就是说一次存储两个元素,Collection一次只能存储一个集合,Collection是单列集合,Map是双列集合。
Map集合的特点:
①:添加:
put(key,vaule);当存储的键是相同的时候,新的值会替换老的值,并返回老值,如果不键没有相同的,返回null
putAll(Map):向Map集合中添加一个集合。
②删除
void clear();清空集合
value remove(key),删除指定键的值,并返回该值
③判断
boolean isEmpty();判断集合是否有元素
boolean containsKey(key);判断集合中是否有key
boolean containsVaule(value):判断是否包含value
④取出
int size();得到集合中元素的个数
getKey();通过指定的键获取对应的值,返回null,该键不存在
Collection vaules():获取Map集合中的所有的值
想要获取Map集合中所有元素:
Map集合中时没有迭代器的,只有Collection具备了迭代器,我们想通过迭代器迭代出Map集合中的所有元素,就必须将Map集合向Collection集合转换,由于Map集合中的key值也是不可重复地,因此可以将Map集合向Set集合转换,将Map集合向Set集合转化的方法:
Set KeySet():取得集合中包含键的映射关系
Set entrySet():取得是键和值的映射关系
Entry就是Map接口中的内部接口;
定义在map内部的原因:entry是访问键值关系的入口,是map的入口,访问的是map中的键值对,取出map集合中所有元素的方式之一:keySet方法。
可以同过map集合中的键全部取出存放在Set集合中,通过迭代出每一个key值,再是map的get(key)得到对应的vaule值。
方法一:
Set set = map.keySet();
Iterator i = set.iterator();
while(i.hasnext()){
Object key = i.next();
Object vaule= map.get(key);
sop(key+"="+vaule);
}
方法二
Set entry = map.entrySet();
Iterator i = entry.iterator();
while(i.hasNext()){
Map.Entry me = (Map.Entry)i.next();
sop(me+"="+map.geVaulet(me));
}
使用集合的技巧:
需要查询快:ArrayList
需要增删快:LinkedList
需要唯一性且效率高:HashSet
如果要唯一且要排序,使用Tree系列,记得比较就要覆盖hashCode和equals方法。
LinkedHashSet和LinkHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序,
当存储的是一个元素的时候使用collection,是映射之间的关系时候使用Map
保证唯一性使用Set,保证不唯一使用List
集合工具类:
Collections是一个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,他实现对集合的查找,排序,替换,线程安全化(将非同步的集合转换成为同步的)等操作;
Collection是java.util下的一个接口,他是各种集合结构的父接口,继承于他的接口主要有Set和List,提供了关于集合的一些操作,如插入,删除,判断一元素是否是其成员,遍历等。
Arrays:
用于对数组对象的操作的工具类,里面都是静态方法。
asList方法:将数组转换成为list集合
将数组转换成为集合,可以通过list集合中的方法来操作数组中的元素,但是值得注意的是,数组的长度是固定的,不可以对数组转化而来的集合进行长度的改变,也就是增加和删除。
如果数组中存储的是对象,asList会将数组的元素直接存储在集合中,并可以直接操作,如果存储的是基本数据类型,则asList会吧整个数组作为一个整体存入集合当中(因为集合只接受对象做为其元素)。
集合变为数组:
想要将集合变为数组:使用Collection接口中的方法toArray();
如果给toArray传递的指定的类型的数据小于了集合的size,那么toArray方法和自动地创建一个该类的数据类型,长度为集合的size。如果传递的指定的类型的数组长度小于了集合的size。那么toArray方法,就不会创建新数组,直接使用该数组即可,只是存储完集合中的数据余下的那些位置的数据为null;
所以在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。
将集合变成数组后会有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。