-------android培训,java培训、期待与您交流! ----------
java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。而跟接口下又分为:set、list、map、queue四大体系。其中set代表无序、不可重复的集合;list代表有序、可重复的集合。map代表具有映射关系的集合;queue代表队列集合,这些集合都实现了Iterable接口,所有都有Iteraotr()方法迭代遍历元素,唯一有点不同的是Map需要获得内部接口Entry的实现类后再调用此方法。下面我们就以一一介绍下这些集合。
首先,Set集合:Set集合本身也是一个Collection的实现接口,并且是根据equals去判断保证集合内是一个不重复的无序集合,在这个集合接口下,又派生出HashSet,和TreeSet等。
1.HashSet:HashSet是在Set集合上的一个细化,就是除了equals方法判断为true,并且hashcode值也要一样的值才算是重复的值,所以在往HashSet中保存值时,需要注意重写对象类的hashCode和equal方法。便于确定所传值是否相同,因为HashSet底层是HashMap实现,讲传入的值和初始化的一个Object对象存入HashMap,所以HashSet实际就是HashMap的key的集合。这也就是HashSet的数据唯一性,和无序性。
2.TreeSet:该集合是以二叉树形式保存数据,所以会对传入数据进行自然排序,所以我们在传入值的时候,最好根据我们自己对集合输出顺序的需要,将对象实现Comparable接口,或者实现一个Comparetor 的CompareTo方法。Comparetor 传入TreeSet的构造方法中,Comparable在传入的对象的类的中实现即可,由于TreeSet底层也使用Map实现,所以TreeSet的值也是唯一的。
两者的不同点在于 TreeSet需要进行排序并且只能传同一类型数据并且不能为null,这是因为TreeSet需要进调用方法进行比较,所以为null会报错误空指针,HashSet是无序的,可以允许一个null,这是因为HashMap的key是唯一的,并且可以为null。
其次,List集合:List集合的主要特点是根据索引操作集合,它分为 ArrayList,linkedList,Vector等。
1.Vector:内部实现是一个Object类型数组,实现了List的方法,并且方法都进行了同步处理,并且可以有null值。
2.ArrayList:和Vector基本没有区别,唯一不同的是没有同步处理方法,所以效率更高,但是相比于Vector安全性稍低。
3.LinkedList:是以链表的形式存储,底层使用一个内部类Entry存储,而且没有同步,相比于其他两个集合,更方便对集合的增删改操作。查询效率稍低。因为每个元素除了包含自己的值,还包含前后元素的引用,并且可以有null值。
接着是,Map:Map集合是以键值对形式保存数据的,其内部定义了一个Entry的静态内部接口。主要有,HashTable,HashMap等。
HashTable,HashMap基本相同,不一样的是,HashTable不能有null值,null key,而HashTable可以允许有一个。而且HashTable方法是同步的,但是HashMap不是,所以除非考虑到多线程的安全性问题,否则不用HashTable,因为效率过低,推荐使用HashMap。
最后,Queue,该接口是Collection的是子接口,内部是Object数组实现,并且没有容量限制,存储和输出形式使用队列的方式。即先进先出。实现类有,ArrayDeque,linkedList。
ArrayDeque:底层也是一个Object数组,不允许有null,并且插入元素时从最后插入。
当然说到了集合,就得再提下java为我们封装好的操作集合和数组的类。Collections Arrays
这里面封装了很多的方法,如返回一个数组,向一个集合中插入另一个集合,还有很多操作集合的方法,对应的Arrays里也有很多操作数组的方法,使用这两个类,操作集合和数组,为我们省去了不少自己再编写代码去操作的麻烦。
除了工具类,还有就是泛型在集合上使用,提高了程序的可读性,以及效率。比方说
List<Stirng> list = new ArrayList<String>();
这样就定义了一个list集合,并且此集合只能保存String字符串。当然泛型的运行不止在集合。还有很多的地方,
比如:Class<?> clazz = Class.forName(className);
public <T> T getObj(T t){
return t;
}
只是<?>和<T>略有不同而已,虽然都是泛型,但是<T>定义了后,后面的类型就只能用T了,不过<?>略有不同,它代表这Object及其子类,也就是所有java对象,只是定义时候使用,后面就不再使用了。