java集合框架

来源:互联网 发布:属下知罪by枯目结局 编辑:程序博客网 时间:2024/05/16 09:21

java集合框架

集合框架中分为两大类:装载数据的集合类和操作数据的工具类.

集合类:是基于Collction接口,再根据不同需求分类为Set/List和Map三大接口。

Java集合就像一种容器,可以通过相应的方法将多个对象的引用放在容器中。

容器中的元素(对象的引用)类型都为Object类型,所以可以存放通过向上转型存放任意类型的对象引用,但从容器中取出元素时必须向下转型(强制)为原来的类型。

  值得注意的是,集合容器中的元素不存放基本数据类型,可以存放包装类类型。

 

Java集合框架在实际应用开发中使用非常广泛,属于java程序员重点掌握的内容。

 

装载数据的集合类:集合类是通过Collection接口定义了集合类共有的一些基本方法,这些方法分为基本操作(添加、删除、修改和查找容器中的元素)、批量操作(批量添加、删除容器元素)和数组操作(集合与数组转换)

 

Set、List和Map接口

1、List接口:它继承于Collection接口,是一个允许存在重复元素的有序集合。

List接口的实现类(具体类)常用的有ArrayList(顺序表集合)和LinkedList(链表集合)。

 

ArrayList(顺序表集合):ArrayList类扩展AbstactList并实现List接口。

ArrayList类提供了一个随需要而增长的动态数组。在java中,标准数组是固定长度的,在数组创建之后,他们不能被加长或缩短,这也就意味我们必须事先知道数组可以容纳多少元素。但是,知道运行时才能知道需要多大的数组。ArrayList类就是为了解决这个问题。

特点:对于使用索引查询元素效率较高,它可以使用索引快速定位元素位置,但是删除或插入元素效率较低,因为使用了数组,需要移动后面的元素以调整索引的顺序。它的使用最广泛,可在集合元素增加或删除操作不频繁时使用,最适合做查询操作

 

Java泛型

由于集合中保存的元素都是Object类型,当一个元素从集合中取出来后都是Object类型的对象引用,所以我们必须对其进行向下强制转型,为了解决这种麻烦,JDK1.5中支持一项新特性—java泛型。

所谓泛型是指在定义(类的定义、方法的定义、形式参数的定义、成员变量的定义等)的时候,指定它为通用类型,也就是数据类型可以具有任意的类型,具体调用的时候要将通过类型转换成指定的类型使用。

泛型是对java语言的类型系统的一种扩张,以支持创建可以按类型进行参数化的类可以把类型参数看作是使用参数化类型的指定的类型的一个占位符,就像方法的形式参数是运行时传递的值占位符一样。

泛型的优点:java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的向下强制转型都是自动和隐式的提高代码的重复率

注意:在静态方法、静态初始化块、静态成员变量里面不允许使用泛型。

  

LinkedList(链表集合):LinkedList类扩展AbstractSquentiaList并实现了List接口。它提供了一个链表的数据结构。

特点:因为LinkedList是使用双向链表,所以针对频繁的插入和删除元素,使用LinkedList类效率较高。它的使用适合实现栈(数据结构)和队列(数据结构),当需要在集合的中间位置需要频繁删除和增加元素时,建议使用LinkedList类。

 

集合的工具类(Collections)

Iterator接口(迭代器)是一种用于遍历集合。所谓遍历,是指从集合中取出每个元素的过程。

Boolean hasNext();//判断游标右边是否有元素

Object next();//返回游标右边的元素,并将游标移动到下一个位置

Void remove();//删除游标左边的元素

 

Vector(向量表集合):Vector类扩展AbstractSquentiaList并实现list接口。与Arraylist的用法几乎完全相同,二者之间最大的区别在于Vector类是线层安全(线程同步),所以性能要稍低于ArrayList类。该实现类已过时,实际应用开发时,尽量少用。

Stack(栈集合):Stack类扩展Vector类,它提供了一个栈的数据结构。数据结构中的栈在解决很多问题都是有用的(比如括号匹配、迷宫求解、表达式求值等),该实现类也已经过时了,实际应用开发中尽量少用。

 

Set接口:它继承于Collection接口,是一个不允许存在重复元素的有序集合。Set接口添加、查找、和删除元素都有很高的效率。Set接口的实现类(具体类)常用的有HashSet(哈希集合)、LinkedHashSet(链表哈希集合)和TreeSet(有序树集合)。

 

HashSet(哈希集合):HashSet类是Set接口的实现类之一,使用较广泛,它不保存元素的加入顺序,HashSet类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速找到。

注意:因为Set接口中不能加入重复的元素,所以对于自定义类,需要提供判断重复元素的方法,即需要重写hashCord()和equals()方法

hashCord()方法:如果一个结合中有一百个元素再添加一个新元素时,是不是需要执行一百次equals()方法呢?如果每增加一个元素就遍历一次集合,那么当元素很多时,后添加到集合中的元素比较的次数就会非常多。这样显然会大大降低效率。于是,java采用了哈希表(数据结构)的原理,使用哈希算法(也称为散列算法)将元素直接指定到一个地址上。我们可以将hashCord()方法方法返回值看做是对象存储的物理地址的一个索引。添加新元素时,先通过索引查看这个位置是否存在元素,如果不存在,则可以直接将元素存储于此,不需要再调用equals()方法;如果已经存在元素,则再调用equals方法与新元素进行比较,相同则不存放,不同就再索引其他地址。这样就使用实际调用equals方法的次数大大减低,提高了运算效率。

equals()方法和hashCord()方法的说明:

如果两个对象相同,那么他们的哈希码一定要相同。

如果两个对象的哈希码相同,这两个对象并不一定相同。

注意事项:java规范中要求,如果程序员重写了equals方法就一定要重写hashCord方法。当两个对象调用equals方法比较是,如果返回true,那么他们的哈希码值要求返回相等的值。

LinkedHashSet(链表哈希集合):它的使用和HashSet几乎相同,并使用链表记录元素的加入顺序。

TreeSet(有序树集合):TreeSet(有序树集合)类使用红黑树(数据结构)对加入的元素进行排序存放,如果加入TreeSet(有序树集合)类中的元素是自定义的,则需要实现比较器Comparable接口并重写compareTo方法,用于元素之间的排序比较。

整型包装类:安装数字大小排序

Chatacter:按Unicode值的数字大小排序

String:按字符串的字符的Uincode值大小排序

 

3、Map接口:它不是继承于Collection接口,用于维护键值对。Map中的键值可以使任意类的实例化对象。在Map中不允许出现重复的键,所以存入Map中的键对应的类必须重写hashcord和equals方法。Map接口实现的具体类常用的有HashMap、TreeMap、和Properties。

HashMap(哈希映射集合):HashMap类是基于哈希表的Map接口实现,提供所有可选的映射操作,效率高,所以在实际应用开发中使用很广泛。由于HashMap的键要求不重复,所以建议尽量使用标准库类,避免自定义类重写equals和hashcode方法。

TreeMap(有序数映射集合):TreeMap的内部使用红黑树(数据结构)对“键”进行排序存放。所以放入TreeMap中的键值对必须是可以排序的,入股自定义类作为键,那么就需要同TreeSet相似,实现Compareable接口并重写compareTo方法。

Properties(属性集合):Properties类是表示一个持久的属性集,它可保存在流中加载。属性列表中每个键及其对应值都是一个字符串,Properties类继承于HashTable,自java2平台以来,HashTable已改进为可以实现Map接口,所以Properties类也具有Map特性。但是Properties类存放的键值对都是字符串,在存放数据时不建议使用put方法和putAll方法,应该使用setProerty(Stringkey,String value)方法和getProerty(String key,String value)方法。

集合类性能效率总结

集合框架在项目开放过程中的注意事项:

1)如果涉及到堆栈、队列等操作,应该考虑使用list接口的实现类;

2)如果要进行大量的随机访问,应该使用ArrayList;

3)如果经常进行插入和删除操作,应该使用LinkedList

4)总是使用类型安全的泛型,避免在运行时出现ClassCastException的异常;

5)尽量使用JDK的标准类作为Map的键(如整型、字符串等),可以避免自己实现比较器或equals和hashCord方法

6)尽量使用Collections和Arrays工具类,而非编辑自己的实现类。他将提高代码的重用性,他有更好的稳定性和可维护性。

7)应用开发尽

8)量不要使用过时的Vector、HashTable和Stack。

1 0
原创粉丝点击