java_集合

来源:互联网 发布:js显示当前系统时间 编辑:程序博客网 时间:2024/05/17 00:07

简要说明

java中的集合所在包为java.util.*。

集合相当于一个容器,常见的数组,它是存储相同数据类型的,长度固定,而集合存储的是对象的引用,长度是可变的。

常见的集合类有:list集合,set集合,map集合。可以看下图的关系图

list集合和set集合实现了collection接口。而map集合时单独的。

collection接口

collection表示一组对象(或者成为元素),一些collection中可以有重复元素,另一些是不能的,一些事有序的,一些事无序的。

jdk中规定,不能直接实现此接口,可以使用它的子接口去实现,比如,list和set子接口。下面是一段简单的实例,其中的arraylist实现list接口,后面会讲到,而iterator是专门对collection进行迭代的迭带器。

(copy code)

public static void main (string [] args)

{

collection listcollection = new arraylist();

listcollection.add("1");

listcollection.add("2");

listcollection.add("3");

iterator it = listcollection.iterator();// 创建迭代器

while (it.hasnext())

{

system.out.println((string)it.next());

}

}

list集合

list集合包含list接口以及list接口的所有实现类,list集合中的元素允许有重复,各元素的顺序就是按对象插入的顺序。像数组一样,可以使用索引号访问元素。

list接口

list接口实现了collection接口,拥有collection的所有方法。此外还添加了2个很重要的方法:

get(int index) :获取指定索引处的元素

set(int index,object obj) :将集合中指定索引位置的元素更改为指定的对象

list接口的实现类

常用的有arraylist和linkedlist

arraylist类:实现了可变的数组,允许所有类型元素,包括null值。根据索引位置对集合中的元素进行快速的随机访问,缺点是根据索引位置进行插入和删除的效率慢。

linkedlist类 :使用链表结构保存对象,此结构使它的优点就是arraylist的缺点,它的缺点就是arraylist的优点,两者互补的,所以根据实际情况,选择合适的来实现list集合。

下面是一个简单的实例

list接口实现类(copy code)

public static void main (string [] args)

{

// arraylist

list list = new arraylist();//用arraylist类实现list接口

list.add(1);//添加元素

list.add(2);

list.add(3);

system.out.println("list集合中的元素为:");

for (int i = 0 ; i size(); i++)

{

system.out.println(list.get(i));//通过list集合新增的方法get(int index)获取指定索引处的元素

}

list.set(2 , 4);//通过list集合新增的方法set(int index,object obj) 更改索引处的元素为指定的object

system.out.println("更改后的list集合中的元素为:");

for (int i = 0 ; i size() ; i++)

{

system.out.println(list.get(i));// 通过list集合新增的方法get(int index)获取指定索引处的元素

}

// linkedlist

list list2 = new linkedlist();

list2.add(4);

list2.add(5);

list2.add(6);

system.out.println("list集合中的元素为:");

for (int i = 0 ; i size() ; i++)

{

system.out.println(list2.get(i));

}

list2.set(2 , 7);// 通过list集合新增的方法set(int index,object obj) 更改索引处的元素为指定的object

system.out.println("更改后的list集合中的元素为:");

for (int i = 0 ; i size() ; i++)

{

system.out.println(list2.get(i));// 通过list集合新增的方法get(int index)获取指定索引处的元素

}

}

list集合的索引号和数组一样,从0开始的。

set集合

set集合中的对象是不按特定方式排序的。set集合不能有重复对象。

set集合有set接口和set接口的实现类组成。

和list集合同样实现collection接口。

set接口的实现类有hashset类和treeset类

hashset类,实现set接口,由哈希表(实际为一个hashmap实例)支持。它不保证set的迭代顺序,特别是它不保证该顺序恒久不变,它允许使用null元素,当然不能有重复对象。

treeset类,不仅实现了set接口,还实现了java.lang.sortedset接口,所以在遍历集合时会按照自然顺序递增排序,当然可以根据指定比较器自定义排序。

treeset中新增的某个方法就是comparator(),返回对此set元素进行排序的比较器。如果使用默认的自然排序,则返回null。

下面是实例

treeset类实现set集合(copy code)

//comparable此接口强行对实现它的每个类的对象进行 整体排序。这种排序被称为类的自然排序,类的 compareto 方法被称为它的自然比较方法。

public class treesetdemo implements comparableobject>

{

string namestring;

long id;

public treesetdemo (string name , long id)

{

super();

this.id = id;

this.namestring = name;

}

public string getnamestring ()

{

return this.namestring;

}

public void setnamestring (string namestring)

{

this.namestring = namestring;

}

public long getid ()

{

return this.id;

}

public void setid (long id)

{

this.id = id;

}

/**

* @param args

*/

public static void main (string [] args)

{

treesetdemo treesetdemo = new treesetdemo("张三" , 12);

treesetdemo treesetdemo1 = new treesetdemo("张三55" , 13);

treesetdemo treesetdemo2 = new treesetdemo("张三44" , 19099);

treesetdemo treesetdemo3 = new treesetdemo("张三33" , 90);

treesetobject> treeset = new treesetobject>();

treeset.add(treesetdemo);

treeset.add(treesetdemo1);

treeset.add(treesetdemo2);

treeset.add(treesetdemo3);

// treeset.comparator();

iteratorobject> iterator = treeset.iterator(); // 创建set集合的迭代器

system.out.println("set集合中的所有元素是");

while (iterator.hasnext())

{

treesetdemo tr = (treesetdemo) iterator.next();

system.out.println(tr.namestring + "" + tr.id);

}

// headset截取排在treesetdemo2前面的对象

iterator = treeset.headset(treesetdemo2).iterator();

system.out.println("截取前面部分的集合");

while (iterator.hasnext())

{

treesetdemo tree = (treesetdemo) iterator.next();

system.out.println(tree.id + "" + tree.namestring);

}

// subset 截取排在treesetdemo2 和 treesetdemo3 之间的对象

iterator = treeset.subset(treesetdemo1 , treesetdemo3).iterator();

system.out.println("截取前面部分的集合");

while (iterator.hasnext())

{

treesetdemo tree = (treesetdemo) iterator.next();

system.out.println(tree.id + "" + tree.namestring);

}

}

@override

public int compareto (object o)

{

treesetdemo treesetdemo = (treesetdemo) o;

int result = id > treesetdemo.id1 : (id == treesetdemo.id0 : -1);

return result;

}

}

存入treeset类实现set集合的类必需实现comparable接口。重写的compareto方法,指定了对象与指定对象的排序顺序。

map集合

map没有实现collection接口,它提供的是一种键(key)值(value)对的映射,一个key对应一个value,不能有相同的key。

key还决定了存储对象在映射中的存储位置,注意的是不是根据key本身去实现,而是根据散列技术进行处理的,产生一个散列码的整数值,相当于一个偏移量,对应分配给映射的内存区域的起始位置,以此来决定存储在映射中的存储位置。

map集合有map接口和实现它的类组成。

map接口中有几个常用的方法

put(key k,value v):向集合中添加指定键值对

get(object key):根据指定的key获取对应的value

keyset();返回集合中所有key对象形成的set集合

values();返回集合中所有value对象形成的collection对象

下面是一个实例

hashmap类实现map集合(copy code)

public static void main (string [] args)

{

mapstring, string> map = new hashmapstring, string>();

map.put("李" , "19");

map.put("张" , "26");

map.put("黄" , "23");

setstring> set = map.keyset(); // 返回map中所有键对象形成的set集合

iteratorstring> iterator = set.iterator();// 创建迭代器

system.out.println("key 中的集合元素:");

while (iterator.hasnext())

{

system.out.println(iterator.next());

}

collectionstring> coll = map.values(); // 返回map中所有值对象形成的collection集合

iterator = coll.iterator();

system.out.println("values中的元素:");

while (iterator.hasnext())

{

system.out.println(iterator.next());

}

}

map集合允许value为null,而且么有个数限制,如:map.put("a" , null);

map接口的实现类

可分为hashmap类和treemap类。hashmap对添加和删除映射关系的效率比treemap高(通过哈希码对其内部进行映射关系查找),但treemap中的对象是存在一定顺序的。、

hashmap类:基于哈希表的map接口实现,允许使用null键和null值,但必需唯一。

treemap类:不仅实现了map接口,还实现了java.util.sortedmap接口,因此集合中的元素是存在一定顺序的。在添加和删除映射关系上的性能没有hashmap好。由于它是根据键对象按照一定顺序排列的,所以不允许key为null

下面是一个实例

map实例(copy code)

public class mapdemo2

{

public mapdemo2 (string e_id , string e_name)

{

this.e_idstring = e_id;

this.e_namestring = e_name;

}

string e_idstring;

string e_namestring;

public string gete_idstring ()

{

return this.e_idstring;

}

public void sete_idstring (string eidstring)

{

this.e_idstring = eidstring;

}

public string gete_namestring ()

{

return this.e_namestring;

}

public void sete_namestring (string enamestring)

{

this.e_namestring = enamestring;

}

public static void main (string [] args)

{

mapstring, string> map = new hashmapstring, string>();// hashmap实现map接口

mapdemo2 demo = new mapdemo2("001" , "张三");

mapdemo2 demo1 = new mapdemo2("004" , "张si");

mapdemo2 demo2 = new mapdemo2("003" , "张wu");

// 添加键值对

map.put(demo.gete_idstring() , demo.gete_namestring());

map.put(demo1.gete_idstring() , demo1.gete_namestring());

map.put(demo2.gete_idstring() , demo2.gete_namestring());

// 获取map集合种哦所有key的set集合

setstring> set = map.keyset();

iteratorstring> iterator = set.iterator();

system.out.println("hashmap类实现的map集合,无序");

while (iterator.hasnext())

{

// 获取key

string str = (string) iterator.next();

// 根据key获取对应的value

string namestring = (string) map.get(str);

system.out.println(str + " " + namestring);

}

// treemap

treemapstring, string> treemap = new treemapstring, string>();

// .将指定映射中的所有映射关系复制到treemap中。

treemap.putall(map);

iteratorstring> iterator2 = treemap.keyset().iterator();

system.out.println("treemap类实现的map集合,键对象升序");

while (iterator2.hasnext())

{

string str = (string) iterator2.next();// 获取key

string namestring = (string) map.get(str); // 根据key获取对应的value

system.out.println(str + " " + namestring);

}

}

}

转载请注明本文链接。版权所有?2010李佳龙专栏,保留所有权利。

绿色通道:好文要顶关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击