您的位置:首页 > 职场人生

黑马程序员----------java基础知识加强之集合总概述

2014-05-19 00:53 363 查看
----------------------android培训java培训、期待与您交流!
----------------------

简单总结一下Collection集合体系,包括他的两个大子接口List、Set以及他们的实现类。

1)集合概述

首先要知道集合是一种工具类,可以用于存储数量不等的多个对象。

然后就是集合体系:java集合大致可以分为Set,List,Map3中体系。

(其实集合框架下还有很多集合但现在不需要掌握太多,以后慢慢学)

Collection|----Set 代表无序,不可重复的集合

|----List 代表有序,重复的集合

|----Queue 代表一种队列集合体现

Map 代表有映射关系的集合

2)用Iterator接口实现遍历集合元素

Iterator接口与其他集合框架成员不一样,它主要用于遍历Collection集合中的元素,

Iterator对象被称为迭代器。

代码如下:

class IteratorTest

{

public static void main(String[] args)

{

Collection c = new HashSet();

c.add("黑马Android");

c.add("黑马云计算");

c.add("黑马.Net");

Iterator it = c.Iterator();

while(it.hasNext())

{

String course = (String)it.next();

System.out.println(course);

}

if(course.equals("黑马.Net"))

{

it.remove();

}

course = "黑马ios";

}

System.out.println(c);

}

当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量

,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何

影响。

3)Set集合

注意:Set判断两个对象相同不是用 == 运算符,而是根据equals方法。

1.HashSet类

主要是两个方法hashcode方法和equals方法

实际上当程序向HashSet集合中添加元素时,HashSet会根据该元素的hashCode值来计算他的存储位置,

也就是说,每个元素的hashCode值就可以决定他的存储“索引”

一个特别好的例子:

import java.util.*;

//类A的equals方法总是返回true,但没有重写其hashCode()方法

class A

{

public boolean equals(Object obj)

{

return true;

}

}

//类B的hashCode()方法总是返回1,但没有重写其equals()方法

class B

{

public int hashCode()

{

return 1;

}

}

//类C的hashCode()方法总是返回2,且有重写其equals()方法

class C

{

public int hashCode()

{

return 2;

}

public boolean equals(Object obj)

{

return true;

}

}

public class HashSetTest

{

public static void main(String[] args)

{

HashSet books = new HashSet();

//分别向books集合中添加两个A对象,两个B对象,两个C对象

books.add(new A());

books.add(new A());

books.add(new B());

books.add(new B());

books.add(new C());

books.add(new C());

System.out.println(books);

}

}

2.LinkedHashSet类

LinkedHashSet集合也是根据元素的hashcode值来决定元素存储位置的,但它同时使用

链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说遍历LinkedHashSet

集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。

注意:虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是

HashSet,因此他依然不允许集合元素重复。

3.TreeSet类

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。它是根据元素实际值大小

排序的。TreeSet是采用二叉树来进行存储集合元素的。

TreeSet支持两种排序方法:自然排序和定制排序(默认下是自然排序)

自然排序(实现Comparable):

TreeSet会调用集合元素的compareTo()方法来比较元素之间的大小关系,然后按升序排列。

(集合里的元素总是引用,但我们习惯上把被引用的的对象称为集合元素)

定制排序(提供一个Comparator对象与该集合关联(匿名内部类)):

通过Comparator接口帮助,该接口里包含了int compare(T o1,T o2)方法。

4.EnumSet类(这个现在了解就好)

4)List集合

1.List接口和ListIterator接口

首先我觉得学每个集合最重要的就是学他有什么方法,这就需要勤查API帮助文档。

ListIterator接口增加了向前迭代的功能,而且还能通过add方法向List集合中添加元素。

2.ArrayList和Vector实现类

他们是基于数组实现的List类,所以ArrayList和Vector实现类封装了一个动态的,允许再分配的

Object[]数组。

5)Queue集合

Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。队列的头部保存在队列中

存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。

1.PriorityQueue实现类

是一个比较标准的队列实现,PriorityQueue类保存队列的元素的顺序并不是按加入队列的顺序,

而是按队列元素的大小进行重新排序。

6)Map<key,value>集合

发现一个学习Map集合的方法就是把Map中的key当做Set来看。

对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同,因为他们的实现机制几乎完全

一样;但HashMap通常比Hashtable要快一点,因为后者需要额外的线程同步控制。TreeMap通常比

他们两个都慢(尤其在插入,删除key-value对时更慢)。

使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作

7)操作集合的工具类:Collections

该工具类提供了大量方法对集合元素进行排序,查询和修改等操作,还提供了将集合对象设置为

不可变,对集合对象实现同步控制等方法。

同步控制:Collections中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步

的集合,从而可以解决多线程并发访问集合时的线程安全问题。

----------------------android培训java培训、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: