您的位置:首页 > 编程语言 > Java开发

java笔记总结_06_集合泛型

2011-08-01 22:55 399 查看
第11章 Java集合框架和泛型机制

1、概念

JDK API在java.util包中设计了一组专门用来存储其它对象的类,这组类被称为对象容器类,简称容器类,这组类和接口的设计结构也被称为集合框架。

Collection接口有一个超级接口:Iterator(用于遍历);

Collection接口的子接口常用的有:List 和 Set;

List,有序有重复;Set,无序无重复。

元素:元素即对象(数据)的引用

重复:调用equals方法进行相等判断

有序:存放顺序即输出的顺序

Map接口,用于维护键/值对。

常用工具类:Collections

2、Iterator接口

所有实现了Collection接口的集合类都有一个 iterator()方法用以返回一人实现了Iterator接口的对象。

Iterator对象称作迭代器,用以方便的实现对集合内元素的遍历操作。

Iterator接口中定义的方法:

boolean hashNext();

Object next();

void remove();

3、Set接口(无序无重复)

Set接口没有提供Collection 接口额外的方法,但实现Set接口的集合类中的元素是不可重复的。

Set的实现类主要有:HashSet及其子类 LinkedHashSet

4、HashSet

特点:检索数据的效率比较高。

HashSet:不保存元素的加入顺序,它根据元素的哈希码进行存放,所以取出这个元素时也可以根据哈希码快速找到。

注意:在添加自定义类对象到HashSet时,自定义类必须重写hashCode和equals方法进行对象重复的判断。

HashSet通过hashCode()方法和equals()方法实现对数据相等的判断。

可以往HashSet中添加null值,也只能添加一次相同的null元素。

5、LinkedHashSet

特点:采用双向表链接的方式进行数据的存储。

因为此特点,LinkedHashSet对元素的插入和删除效率比较高,对于检索效率要较低。

LinkedHashSet在存放元素时,会记录每个元素的HashCode值,输出时会根据HashCode值的顺序(先进先出)进行输出,但是LinkedHashSet在底层对于数据的存放和HashSet原理一致。

6、List接口(有序有重复)

List的实现类主要有:Vector、 ArrayList、 LinkedList

实现List接口的集合类中的元素是有序的,且允许重复。

List集合中的元素都对应一个整数型的序号记载其在集合中的位置,可以根据序号存取集合中的元素。

7、ArrayList

ArrayList底层通过动态数组来实现对元素的存储,

ArrayList类能够自动增加或者减小其本身存储数据的大小,

当目前数据的大小超过了ArrayList目前存放的大小,这时ArrayList会自动进行大小的调整。

ArrayList 存储元素时会保存元素顺序。

优点:

对于使用索引取出元素有较好的效率

它使用索引来快速定位对象

缺点:

元素做删除或插入速度较慢

因为使用了数组,需要移动后面的元素以调整索引顺序。

8.LinkedList

LinkedList是使用双向链表实现的集合。

LinkedList新增了一些插入、删除的方法。

如:addFirst()、addLast()、

优点:

对频繁的插入或删除元素有较好的效率

9.Vector

vector和ArrayList大多数方法和功能都类似,实现原理基本一致

vector是线程安全的

特点:Vector对于检索效率也比较高,但由于线程问题,ArrayList检索的效率高于Vector

vector常用方法:addElement(Object obj)、 insertElementAt(Object obj, int index)、……

10、Map接口

Map常用实现类:HashMap及子类LinkedHashMap、Properties

Map实现类中存储的“键-值”映射对 通过键来唯一标识。Map底层的“键”是用Set来存放的,因此是无序无重复的。

11、HashMap

基于哈希表的Map接口的实现,它是使用频率最高的一个容器,提供所有可选的映射操作,它内部对“键”用Set进行散列存放。所以根据“键”去取“值”的效果很高。并且允许使用 null 值和null 键,但它不保证映射顺序。

1.HashMap底层通过Set对键进行散列存放。

2.对于HashMap中的键要求要重写hashCode和equals方法

3.HashMap中允许键值都为null

4.HashMap映射的顺序没有保证

5.常用String作为Map的“键”。

6.HashMap检索数据效率比较高

7.直接输出Map对象时,以大括号扩住,并且以键=值的形式输出

12.LinkedHashMap

LinkedHashMap是HashMap的子类

特点:对插入删除操作效率高

输出元素有一定的顺序(按照添加的顺序进行输出)

13.HashTable

HashTabel和HashMap区别:

1.HashTable是线程安全的

2.HashTable不允许给键值对添加null值

14.Properties

Properties类是HashTable的子类,表示了一个持久属性集。它可保存在流中或人流中加载,属性列表中每个键及其对应值都是一个字符串。

在属性文件中注释采用#

使用步骤:

1.获取文件流

InputStream iStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("名称.properties");

2.创建Properties对象

Properties pro=new Properties();

3.加载流对象到Properties对象中,调用load方法可能会发生IOException

pro.load(iStream);

4.通过调用getProperty("key") 获取数据.

15、集合类的选择

存放要求:

无序:Set 不能重复

有序:List 允许重复

“Key-value”对 Map

读写要求:

Hash* 两者都高 HashCode

Array* 读快写慢

Linked* 读慢改快

Tree* 加入元素可排序使用

16.Collections集合帮助类

java.util.Collections类是操作集合的工具类,提供了一些静态方法实现了基于集合的一些常用算法

void sort(List list) 根据元素的自然顺序 对指定List列表按升序进行排序。List列表中的所有元素都必须实现 Comparable 接口。

void shuffle(List list) 对List列表内的元素进行随机排列

void reverse(List list) 对List列表内的元素进行反转

void copy(List dest, List src) 将src列表内的元素复制到dest列表中

List synchronizedList(List list) 返回指定列表支持的同步(线程安全的)列表

17.泛型

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

声明泛型类对象语法:

类名<数据类型> 对象名称=new 类名<数据类型>();

泛型使用:

1:消除类型转换

2:自动解包装或包装

3:限制泛型中类型参数的范围

<?> 通用类型

<? extends Number> 只允许Number以及Number的子类来引用

<? super Number> 只允许Number以及Number的父类引用

4:泛型方法

<T>通用类型

<T extends Number> 只允许Number以及Number的子类来引用

<T super Number> 只允许Number以及Number的父类引用

<T super Number&Comparable> 只允许Number以及Number的父类且实现了Comparable接口的实现类引用

5.泛型类

在类的定义中添加一个泛型参数列表,可以将类泛型化

6.注意

静态方法中不能使用类的泛型,因为泛型类中的泛型在创建类的对象时被替换为确定类型。

在Java中没有类型的变量或对象是不允许直接访问的。

不要创建泛型类的对象,因为泛型类可能是一个接口或抽象类。

不能在catch 子句中使用泛型,因为若try子句抛出是已检查异常,编译器无法确定catch能否捕获。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: