集合框架的层次结构:
这里只列出常用的
Collection
Set List
HashSet TreeSet ArrayList LinkedList Vector
集合和数组的区别:
数组长度一旦确定不可改变变。集合长度不固定,可以随意改变。
数组只能存放一种类型的数据,在声明数组是就确定类型了。集合可以存放多种类型的对象。
结合中存储的是对象的引用,即地址。
Collection容器的通用方法:
add()
将指定的元素添加到此列表的尾部。
ArrayList al = new ArrayList();
al.add("java");
al.add("c");
al.add("php");
al.add("asp");
addAll(Collection<? extends E> c)
按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
也就是把一个容器里面的所有元素加入到另一个容器中,参数就是一个容器名。
ArrayList al2 = new ArrayList();
al2.add("win");
al2.add("unix");
al2.add("linux");
al2.add("ios");
al.addAll(al2);
clear()
移除此列表中的所有元素。
清空列表内容。
al.clear();
boolean contains(Object o)
如果此列表中包含指定的元素,则返回 true。
在以往判断数组中是否有某个元素是,就是采用循环判断的方法。集合里面的contains()方法,也是使用迭代的方法从前向后依次判断。
isEmpty()
如果此列表中没有元素,则返回 true
remove(Object o)
移除此列表中首次出现的指定元素(如果存在)。
al.remove("unix");
removeAll(Collection<?> c)
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
Collection a ;
Collection b ;
a.removeAll(b);
把结合a和集合b的交集部分从集合a中删除。集合b不变。
由图可以看到,结合a被改变了,而集合b并没被改变。其实很容易理解,集合a对象调用了removeAll()方法进行操作,被操作的对象时a,集合b只是作为参数传递过去,所以结合b并没有被操作。
size()
返回此列表中的元素数。
Object toArray()
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
返回类型为Object。
retainAll(Collection<?> c)
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
就是取交集。
Collection a ;
Collection b ;
a.retainAll(b);
结果把集合a和b中相同的元素放在结合a中,如果交集为空,则结合a就为空。集合b不变。
以上是集合容器的共性方法,就是所以Collection接口下的子接口或实现类都有上面这些方法。
下面分别说说List和Set。
List:元素是有序的,元素可以重复,有索引。
Set:元素师无序的,元素不可以重复,无索引。
其实把Collection分为这两个不同的子体系的最主要原因就是List有索引,Set无索引。
有了索引自然对应着可以用索引进行的操作。
List特有的方法:
add(int index, E element)
将指定的元素插入此列表中的指定位置。
al.add(2,"database");
addAll(int index, Collection<? extends E> c)
从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
al.addAll(3,al2);
get(int index)
返回此列表中指定位置上的元素。
remove(int index)
移除此列表中指定位置上的元素。
set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
List下又分为:ArrayList,LinkedList,Vector,它们的存储结构不同,特点也不一样。
ArrayList:底层使用的是数组结构。特点:查询速度快,增删速度慢。线程不同步,速度快。
LinkedList:底层使用的是链表结构。特点:查询速度慢,增删速度快。
Vector:底层使用的是数组结构。线程同步,速度慢,被ArrayList替代了。
LinkedList特有的方法:
addFirst() 将指定元素插入此列表的开头。
addLast() 将指定元素添加到此列表的结尾。
由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:
offerFirst() 在此列表的开头插入指定的元素。
offerLast() 在此列表末尾插入指定的元素。
getFirst() 返回此列表的第一个元素。
getLast() 返回此列表的最后一个元素。
由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:
peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
removeFirst() 移除并返回此列表的第一个元素。
removeLast() 移除并返回此列表的最后一个元素。
由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:
pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
接下来说说集合中的Set。
常用的Set容器就是HashSet和TreeSet,其实大致是一样的,只是TreeSet提供了一种排序,并非按元素加入集合的顺序排序,而是按照元素的ASCii码表顺序进行排序。
Hashset
在学HashSet的时候要了解一下哈希表,这样对于理解HashSet有帮助。
Hash值:类名@对象存放的地址.
Hash表:存放HashCode值的表。Hash表存Hash值并不是按先后顺序排列,而是按照Hash值得大小排列的。
HashSet保证元素唯一性的原理:判断元素的HashCode值是否相同,如果相同,进一步判断两个元素的内容是否相同,如果内容不相同,则依然会存进HashSet中,如果内容相同,则不会存入。
TreeSet
看似也无序,但其实也是有序的。TreeSet排序是按照集合内元素的ASCii码表进行排序的。
最后看看Map<K,V>
Map虽然不继承Collection,但是和Collection中的方法大致一样。
通过前面Collection中List和Set的学习,再学Map,就相对容易。Map中特有的方法不多,也都好用。
HashMap和TreeMap的关系与HashSet和TreeSet的关系基本一样。
之前对java中集合的学习相对较少,通过今天的学习,掌握了很多集合框架的原理性东西。Collection下的具体集合虽然很多,但是其中的几个就可以解决问题,上面都列出来了。从顶层的Collection借口的特征学习,再到具体的集合容器的独有特点,这样的学习方法很有效,找到规律学习很重要。