集合与数组的区别:数组虽然也可以存储对象,但是数组的长度和类型是固定的,而集合的类型和长度都是可变的,一个集合既可以存储a类型的对象也可以存储b类型的对象。
每个容器对数据的存储方式不同,这中存储方式称为数据结构。
容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。使用泛型可以避免转换。
集合中可以对集合进行操作的四个函数:retainAll,removeAll,containAll,addAll四个函数的参数都是一个集合,是对两个集合的操作,其中retainAll是取两个集合的交集,coll1.removeAll(coll2)是指从coll1中删除coll1和coll2的交集部分,coll1containsAll(coll2)判断coll2是否是coll1的子集,是则返回true,coll1.addAll(coll2)是指将coll2中的所有元素添加到coll1中。
ArrayList集合采用数组结构形式存储,适合查找元素,不适合增删元素,LinkedList采用的是链表结构,前后链接,前一个元素指向后一个元素,vector底层是数组数据结构,是同步的,已被ArrayList替代,ArrayList通过index来确定元素位置的,我们可以通过index来对集合中的元素进行操作,例如
add(int index, E element)
remove(int index)
set(int index, E element)
也可以直接对对象进行操作
remove(Object o)
contains(Object o)
indexOf(Object o)
LinkedList类添加了一些处理列表两端元素的方法。
HashSet集合元素无序,不可以重复,hashset底层数据结构是哈希表,当像HashSet集合中添加对象时,首先调用该对象的hashCode方法,然后用该hashCode的值与集合中存在的hashCode值进行对比,如果该hashCode已经存在,那么会调用该对象的equals方法,如果返回true则不会再次存入该对象,若返回false,则会在该hashcode值得下面存储该对象,若返回true则不会存储该对象,equals方法是继承自Object中的方法,源码为
public boolean equals(Object obj) {
return (this == obj);
}
即比较的是两个对象的引用,因此如果想比较两个对象的内容需要覆盖Object中的equals方法。
TreeSet 的底层结构式二叉树,判断的准则是compareto方法,根据返回值的正负来决定该对象在二叉树中的位置,如果是0则认为元素相同,该对象不再保存,当删除对象或者调用contains函数时也会自动调用compareto函数,返回0则说明包含该元素。
TreeSet集合中元素自己的不具备比较性或者元素的比较性不是所需要的比较时,可以让集合自身具备比较性,即在集合一初始化时就有了比较方式,在集合的构造函数中,存在TreeSet(Comparator<? superE> comparator) 的构造函数,该函数提供了一个比较器对象,该对象的类是实现了Comparator接口的类,并重写了compare(para1,para2)函数。
hashset和treeset存储的元素都是不同的的,但是有着不同的判断准则,hashset需要对对该引用的hashcode值和旧的元素进行比较,相同时还要自动调用equals方法,如果返回true,则认为是相同元素。treeset的判断准则就是自动调用的compareto的返回值,返回0则认为是相同元素。
Map集合,与Collection不同的是,Map存储的是key和value一对值,Map集合共性的方法有:
添加元素 put(key,value) putAll(Map m)
删除元素:clear() remove(key)
判断元素:isEmpty() containsKey(key) containsValue(value)
获取元素:get(key) values() 返回键值集合 keySet()返回该Map集合中的所有键值并保存到一个set集合中,然后获取该set集合的迭代器,然后通过迭代器取出主键,通过主键取出键值,
entrySet集合取出的是主键与键值的映射关系存储到set集合中,其类型是<Map.Entry<k,v>>,通过迭代器取出set集合中存储的映射关系,并通过getKey和getValue获取主键及键值。