Java中常用的集合类详解

原文:http://wenku.baidu.com/link?url=P7XJEOg5Jrf8UbVqVe6PAXnxxRJTVKQsGGE65pIB31t9UjeQ5vKSaQ6P9u4EoOOu7xsQpHXDywZ19RAtbrUPyJljW9yee3hUnMTSisk9D67

Collection
|_____Set(HashSet)

|          |_____SortedSet(TreeSet)

|_____List(LinkedList,ArrayList)

Collection:集合层次中的根接口,JDK没有提供这个接口的实现类。

Set:不能包含重复的元素,子接口SortedSet是一个按照升序排列的元素的Set。

List:可以包含重复的元素,是一个有序的集合,提供了按索引访问的方式,有次序,位置不改变。

 

集合框架中的实现类

ArrayList:
本质:我们可以将其看作是能够自动增长容量的数组,实际是采用对象数组实现的。
自动增长容量就是当数组不够的时候,再定义更大的数组,然后将数组元素拷贝到新的数组.

利用ArrayList的toArray()返回一个对象的数组也可以利用Arrays.asList()方法返回一个列表。返回固定尺寸的列表,当返回以后就不能修改列表的大小了,可以修改列表中元素的值,但不能增加容量,可以用set()方法对值进行修改。

Arrays.asList()和Collection.toArray()是作为数组和集合类的一个桥
如果想从集合类中获得一个数组可以使用toArray()方法;如果想从数组中获得一个列表可以使用asList()方法

importjava.util.*;
classPoint{
int x,y; Point(intx,inty){
this.x=x;
this.y=y;
} public String toString(){
return"x="+x+",y="+y;
}
} publicclassArrayListToArrayTest{ publicstaticvoidmain(String[]args){   ArrayList a1
=newArrayList();
  a1.add(newPoint(3,3));
  a1.add(newPoint(4,4));
  a1.add(newPoint(5,5));   for(int i=0;i<a1.size();i++){
    System.out.println(a1.get(i));
  }   System.out.println(a1);   Object[]objs
=a1.toArray();//利用ArrayList的toArray()返回一个对象的数组.   for(int i=0;i<objs.length;i++){
    System.out.println(objs[i]);
  }   System.out.println(objs);
//   Listl=Arrays.asList(objs);//Arrays.asList()返回一个列表.System.out.println(l);}}

结果

x=3,y=3
x=4,y=4
x=5,y=5 [x=3,y=3,x=4,y=4,x=5,y=5]

  x=3,y=3

  x=4,y=4

  x=5,y=5
  [Ljava.lang.Object;@1fc4bec

  [x=3,y=3,x=4,y=4,x=5,y=5

LinkedList类
LinkedList是采用双向循环链表实现的.利用LinkedList实现栈(stack),队列(queue),双向队列(double-endedqueue)

void addFirst(Object o)
void addLast(Object o)
Object getFirst() 
Object getLast()
Object remove(int index)
boolean remove(Objecto)
Object removeFirst()
Object removeLast()

判断是否为空
LinkedList继承了一个方法isEmpty()
如果没有包含任何元素返回true,有包含任何元素返回false,ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。

如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速.
因为插入和删除都要移动数组中的元素.
只是访问就用ArrayList,提供了按索引访问的机制.

HashSet
HashSet实现了Set接口的hashtable(哈希表),依靠HashMap来实现.应该为要存放到散列表的各个对象定义hashCode()和equals().因为实现了set接口所以不能有重复的元素.散列表:
散列表又称为哈希表.散列表算法的基本思想:
以结点的关键字为自变量,通过一定的函数关系(散列函数)
计算出对应的函数值,以这个值作为该结点存储在散列表中的地址.
当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除.
在java语言中,通过负载因子(loadfactor)来决定何时对散列表进行再散列.例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行散列.

负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.HashSet类的缺省负载因子是0.75.

HashSet在java.util包当中.需要导入.常用方法
booleanadd(Objecto)需要使用迭代器
HashSet类实现了Set接口,所以不能有重复的元素

TreeSet:
TreeSet是依靠TreeMap来实现的.
TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然排序进行排列,意味着TreeSet中元素要实现Comparable接口.
我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象.

**
HashSet是基于Hash算法实现的,其性能通常优于TreeSet.

通常都应该使用HashSet,在需要排序的功能时,才使用TreeSet.

**

迭代器:
Collection提供了一个iterator()方法,可以返回一个迭代器,迭代器是指向两个元素之间的指针。凡是继承自Collection的接口或间接的实现类都有这个方法.
其中有3个方法

1.hasNext()

2.next()

3.remove()
hasNext()判断是否有更多的元素,如果有返回true

remove()方法remove()方法需要删除上一个返回的元素,需要先调用next()方法后在用remove(),返回的列表有时不一定真正实现remove()方法,根据需要决定是否实现.

public static void printElements(Collectionc){
Iterator it=c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}

Map(HashMap)
|_____SortedMap(TreeMap)
Map:存储的是key-value对,不能包含重复的key,可以有重复的value。子接口SortedMap是一个按升序排列key的Map。

Map接口实现类:HashMap:

HashMap是实现了Map接口的Hash表.
实现了所有hashmap操作,允许空值和空键

map接口没有add()方法.要放置元素通过put()方法.
Objectput(Objectkey,Objectvalue)获取元素的时候
Objectget(Objectkey)通过键获取值
Hash表,通过键计算出相对应的存储位置的值,并输出.

常用的方法SetkeySet()
返回一个键的视图类型是Set.Collectionvalues()
返回一个值的视图类型是Collection.SetentrySet()
返回一个键值对视图类型是Set

返回的Set集合当中每一个对象都是一个Map.Entry对象.

Map.Entry是一个静态的接口.

接口中提供了常用方法ObjectgetKey()ObjectgetValue()

importjava.util.*;
public class HashMapTest{
public static void printElements(Collectionc){
Iterator it=c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
public static void main(String[]args){
HashMap hm=new HashMap();
hm.put("1","zhang3");
hm.put("2","li4");
hm.put("3","wang5");
System.out.println(hm.get("1"));
System.out.println(hm.get("2"));
System.out.println(hm.get("3"));
Set keys=hm.keySet();
System.out.println("-----------keys---------");
printElements(keys);
Collection values=hm.values();
System.out.println("-----------values-------");
printElements(values);
Set entrySets=hm.entrySet();
System.out.println("------------entrySets-----------");
printElements(entrySets);
Iterator it=entrySets.iterator();
while(it.hasNext()){
Map.Entryme=(Map.Entry)it.next();
System.out.println(me.getKey()+"="+me.getValue());
}
}
}

**
TreeMap是实现了sortedMap接口的类TreeMap按照key进行排序.类似HashMap用法
**********************

HashMap和TreeMap比较
和Set类似,HashMap的速度通常都比TreeMap快,

只有在需要排序的功能的时候,才使用TreeMap

 

posted @ 2017-02-21 18:25  Timer©jiao  阅读(215)  评论(0)    收藏  举报