Java集合Set List Map

yanaoyong 2011-03-18

Set,List,Map的区别和功能到底是怎样的?其实它是与数组区分开来的。

数组:java数组的长度是固定的,在同一个数组中只能存放相同类型的数据,可以是基本数据类型,也可

以存放引用类型的数据。

java集合:存入于java.util包中,它不能存放基本类型数据,而只能存放对象的引用。

Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按

特定方式排序。与数学中的集合最接近,两者都不包含重复元素。

List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检

索对象。List与数组有些相似。

Map(映射):集合中的第一个元素包含一对键对象和值对象,集合中没有重复的键对象,值可以重复。

它的有些实现类能对集合中的键对象进行排序。切记在用到MAP时一定需要传入两个参数

键和值。

例:

importjava.util.*;

publicstaticvoidprint(Collection<?extendsObject>c){

Iterator<?extendsObject>it=c.iterator();

//遍历集合中的所有元素

while(it.hasNext()){

Objectelement=it.next();

System.out.println(element);

}

}

publicstaticvoidmain(Stringargs[]){

Set<String>set=newHashSet<String>();//<String>指定集合中元素的类型。

set.add("Tom");

set.add("Mary");

set.add("Jack");

print(set);

List<String>list=newArrayList<String>();

list.add("Linda");

lis.add("Mary");

list.add("Rose");

print(list);

Map<String,String>map=newHashMap<String,String>();//两个参数,键和值

map.put("M","男");

map.put("F","女");//与实现了Collection接口的set,list加入元素的方法不一样。

print(map.entrySet());//entrySet()返回SET视图

}

}

要知道两个异常:ConcurrentModificatiojException和ClassCastException

1、对一个集合不能够一边修改一边操作(除了用Iterator进行修改)不然将抛出ConcurrentModificatiojException异常。

2、当试图将对象强制转换为不是实例的时,抛出ClassCastException异常。

Set类

由上图中可知实现Set接口的两个类有HashSet(无序)和TreeSet(实现了SortedSet接口、有序)

1)TreeSet支持两种排序:自然排序(默认)和客户排序

自然排序:实现了Comparable接口,通过compareTo(Objecto)方法比较。只能向TreeSet集合中加入同类

型的对象,并且这些对象要实现Comparable接口。

例1:

Set<Object>set=newTreeSet<Object>();

set.add(newInteger(8);

set.add(newString("9");//抛出ClassCastException异常

例2:

Test类没有实现了Comparable接口,带有一个String和int的成员变量。

Set<Object>set=newTreeSet<Object>();

set.add(newTest("A",5);

set.add(newTest("B",6);//抛出ClassCastException异常

这也是用TreeSet时要注意的地方

2)HashSet:按照哈希算法来存取集合中的对象,具有很好的查找性能。当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法来获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。跟数据结构中的散列存储概念一样。

要明白一点的就是:当用户覆盖了object类的equals()方法,一定也要重写hashCode方法,而且TreetSet还要增加一个compareTo方法。

例:

importjava.util.*;

publicclassDemo2implementsComparable{

privateStringname;

privateintage;

publicDemo2(Stringa,intb){

name=a;

age=b;

}

publicintgetAge(){

returnage;

}

publicvoidsetAge(intage){

this.age=age;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicintcompareTo(Objecto){

Demo2other=(Demo2)o;

//先按照name属性排序

if(this.name.compareTo(other.getName())>0){System.out.println("1");return1;}

if(this.name.compareTo(other.getName())<0){System.out.println("2");return-1;}

//再按照age属性排序

if(this.age>other.getAge()){System.out.println("3");return1;}

if(this.age<other.getAge()){System.out.println("4");return-1;}

return0;

}

publicbooleanequals(Objecto){

if(this==o)returntrue;

if(!(oinstanceofDemo2))returnfalse;

finalDemo2other=(Demo2)o;

if(this.name.equals(other.getName())&&this.age==other.getAge())

returntrue;

else

returnfalse;

}

publicinthashCode(){

intresult;

result=(name==null?0:name.hashCode());

result=29*result+age;

returnresult;

}

publicstaticvoidmain(Stringagrs[]){

Set<Demo2>set=newTreeSet<Demo2>();

Demo2a=newDemo2("Tom",15);

Demo2b=newDemo2("Apple",16);

set.add(a);

set.add(b);

Iterator<Demo2>it=set.iterator();

while(it.hasNext()){

Demo2Demo2=it.next();

System.out.println(Demo2.getName()+""+Demo2.getAge());

}

}

}

以上三个方法的重写必须理解。

List类:主要特征是其元素以线性方式存储,集合中允许存放重复对象。

ArrayList可以说是线性表,LinkedList可以说是链表。并不是自动排序的而是要通过Collection接口中sort()方法

例:

importjava.util.*;

publicclassDemo1{

publicstaticvoidinsert(List<Integer>list,intdata){

ListIterator<Integer>it=list.listIterator();

while(it.hasNext()){

Integerin=it.next();

if(data<=in.intValue()){

it.previous();

it.add(newInteger(data));

break;

}

}

}

publicstaticvoidmain(String[]args){

List<Integer>list=newLinkedList<Integer>();

list.add(newInteger(3));

list.add(newInteger(2));

list.add(newInteger(5));

list.add(newInteger(9));

Collections.sort(list);

insert(list,6);

System.out.println(Arrays.toString(list.toArray()));//toArray()返回一数组,Arrays.toString()输出数组。

inta[]=newint[]{1,2,3};

System.out.print(Arrays.toString(a));

}

}

Map类:对容量,初始容量,大小,负载因子要知道这些知识点。

Mapmap=newHashMap();

for(inti=0;i<args.length;i++){

map.put(newInteger(i),args[i]);

}

System.out.println("HashMap的容量:"+map.size());

System.out.println(map);

相关推荐