前几日把集合陆续又回顾了一番,现在便尝试总结一下,这种总结是对脑海中所有的关于集合的记忆及理解的组织、提取、凝练等;效果不用说自然是最好的;下面言归正传。
所谓集合,就像数组一样,是一类可以存储数据的容器,不同于数组的是,它可以存储的数据类型必须是引用数据类型,若是将基本数据类型添加进去,亦不会报错,因为这些基本数据类型会被自动装箱。
集合中的两大派系:单列集合的跟接口Collection;双列集合的跟接口Map 。实现了Collection接口的有分别有List接口、Set接口;二者又各有其特点。
List集合:有索引、存取顺序一致、可以存储重复元素;可以存储空字符串及null;它有ArrayList、LinkeLlist、Vector三个实现类。 其中ArrayList及Vector底层都是由数组实现的,也就是说集合中元素是被顺序存储的,所以它们的特点就是根据索引查询较快,而插入及删除数据较慢(因为无论是插入还是删除都要将该位置后的元素向后或向前移动);不同的是,Vector类是jdk1.0就出现的,而且是线程安全的,而ArrayList是jdk1.2出现的,它是线程不同步的,所以效率就要比Vector要高; Linkedlist底层是由链表实现的,也就是说集合中的元素是被链式存储的,这也就决定了它的特点是插入和删除元素较快,而查找元素较慢,且该类是线程不安全的。其特有的方法如xxFirst();xxLast()等。
Set集合:无索引、存取顺序不一致、不可存储重复元素;也可以存储空字符串及null;它有HashSet、LinkedHashSet、TreeSet三个实现类。这里 主要论述Set集合为何不能存储重复元素,也就是其唯一性的原理。 HashSet 能否实现元素唯一性取决于该类型元素是否重写了hashcode()方法及equals()方法;这两个方法均是Object类中的方法,对于基本数据类型包装类及String类均重写了两方法,但StringBuffer类并没有重写;HashSet对两方法的调用流程大概是这样:每当执行add()方法添加元素时,会首先将该对象的hashcode()方法返回值与集合中已有的所有对象的hashcode()方法返回值进行比较;若相同,则调用equals()方法,equals()方法返回false则认为集合中没有对象与要添加进去的对象相同,则存储进去;若equals()方法返回ture,则认为集合中已有对象与要添加进去的对象相同,则不进行存储;若hashcode值不同,则不调用equals()方法,直接 存储进去,也就是说在自己重写hashcode()方法时,同一类型的hashcode()方法返回值相同,且与其它类型不同,因为不同类型的对象根本没有比较是否相同的必要。所以对于自定义数据类型,如果想存储在HashSet集合中,则必须重写hashcode()、equals()两方法才可以保证存储该类型的对象不会重复。 LinkedHashSet是Set集合派系中唯一可以保证存取顺序一致的集合,它就相当于在HashSet基础上扩展了一个存取有序的功能; TreeSet底层是二叉树实现的,使用TreeSet集合存储的某类型必须实现Comparable接口或者Comparator接口,否则在添加该类型的元素add()时会报ClassCastException;类实现Conparable接口,要重写其compareTo(T t)方法;实现Comparator接口是作为实参传入到TreeSet的有参构造方法中的,要重写其compare(T t1,T t2)方法;该两方法的返回值均是int类型,若返回值为正数,则将该对象放在最后一个与该元素比较的元素右方;为负数则放在左方;为零则认为重复,不存储。取出时按照中序排序。当调用add()方法时,要添加的对象就会相应的调用compareTo()方法或compare()方法,进行筛选。
Map是双列结合的跟接口,它存储Key、Value一对元素,Key不能重复,且Key-Value要一一对应,它跟Set集合十分相似,就不在赘述;其常用的方法是put(K k, V v)添加元素,containsKey(K k);containsValue(V v);V get(K k)返回key对应的Value值;Map.EntrySet entrySet()得到一个键值对集合;Set keySet()得到主键的Set集合。

10-07 11:29