Mr-sniper


======================================================
注:本文源代码点此下载
======================================================

一、集合的概念

集合是源于数学中的术语,集合的一些原理和算法来自于数学中的理论。在java中,集合类是用来存放对象的。对于集合的使用是通过实例化集合类得到集合对 象。而集合对象则代表以某种方式组合到一起的一组对象,对于这组对象的使用是通过引用集合对象来进行的。

通过班级的例子来给集合举例:(示意代码如下)

班级集合 班级a = new 班级集合()// 班级a代表班级对象引用

// 在班级里添加学生

班级a.加入学生方法(学生对象a) ;

班级a.加入学生方法(学生对象b) ;

// 使用集合内对象

学生 学生对象1 = (学生)班级a.取得一个对象();

学生对象1 . 学生对象自己的方法();

。。。。。

。。and so on。。。

通过例子,我们看看是否有共性的部分可以提取出来呢?经分析,我们发现:

(1)、集合的操作都是相似的,向集合内添加元素(存储),从集合中取得元素(检索),从集合中删除元素,修改集合的某个元素(注意,不是修改元 素本身属性),还有其他操作(元素排序等)

(2)、集合都是用来存储对象的(集合内存储的每个对象我们称为元素或者元素对象)

(3)、集合要有一定的容量,能过存放多个元素。

数组就可以实现上面的需求,但java里面还有一些重要的api来实现集合类也能实现,这时候,你就会问了,既然数组能实现容纳对象的容器功能, 为什么还要设计这些集合类呢?

下面就看看集合和数组的区别:(写一个程序例子)

import java.util.arraylist;

public class studentdemo {

//学生类

private string name;

private int age;

public studentdemo(string name, int age){

this.name = name;

this.age = age;

}

public static void main(string[] args) {

// todo auto-generated method stub

//先写一个数组的例子

studentdemo[] sarray = new studentdemo[3];

sarray[0]=new studentdemo("jack",20);

sarray[1]=new studentdemo("marry",18);

sarray[2]=new studentdemo("terry",22);

studentdemo stu1 = sarray[0];

system.out.println("this is array="+stu1.name+"this age="+stu1.age);

//在写一个集合的例子

arraylist coll = new arraylist();

coll.add(new studentdemo("marryone",18));

coll.add(new studentdemo("jackone",22));

coll.add(new studentdemo("terryone",23));

studentdemo stu2 = (studentdemo)coll.get(0);

system.out.println("this is coll= "+stu2.name+"this is age"+stu2.age);

}

}

从例子中来比较一下数组和集合的区别:

(1).数组的长度是固定的,在定义数组的时候,就要确定数组长度大小。而集合类在定义的时候不需要确认集合所能容纳对象的数量,也就是说集合的 大小是动态调整的。在实际应用中我们不能确认的需要存放元素数量的时候,采用集合是比较好的。容量可变是集合相对于数组的最大区别之一。

(2)数组既可以容纳基本数据类型,也可以容纳对象。而集合只能容纳对象,不容纳基本数据类型。另外,需要强调一点的是,无论是数组还是容器,当其容纳对 象的时候,存放的都是对象的引用。而数组在容纳基本数据类型的时候,持有的则是数值。

(3) 如果想在集合中容纳基本数据类型,该怎么做呢?

当我们把一个对象放到集合中,该对象好像“失去”了它的型别特征,以后在使用的时候,除非使用者知道存入对象的类型,否则无法正确使用该对象。所以要像上 面的例子一样,要进行一次强制类型的转化

studentdemo stu2 = (studentdemo)coll.get(0);将其转化为原来存储时的对象。

二,在谈谈数组

在数组的处理上,除了数组本身提供的特性外,java还实现了一个工具类arrays,提供了部分公用的static方法增强数组的处理功能。

介绍下arrays工具类的公用方法

fill()-------将某个数值填入到数组内

sort()-------对数组内的元素进行排序

binarysearch() ------在已排序的数组中查找

aslist() ------把数组转换为list

等等还有一些其他的方法,这里就先介绍下sort()和binarysearch()的用法吧,一样也是要用例子来说明的:

1,先说说sort()吧,排序需要对数组内元素进行比较,基本数据类型(比如数字、字符串)等是比较简单的。

但是,对于对象的比较,还是需要进行一些额外的处理的。比如,对于一份学生的考试成绩单来说,成绩单包含的信息如学生的学号,姓名,成绩等。我们 要排序的时候,就要确定要按照成绩单的那个属性进行排序的。

对于对象的比较,有两种方法来实现。

第一种方法:欲比较的类实现comparable接口,该类就具有了比较的能力。而实现该类接口的时候,只有一个方法compareto() 需要实现,该方法接受另外一个对象作为比较参数,两个对象相等时返回0,该对象小于参数对象的时候,就返回正值,大于返回负值。类实现 comparable接口后,可以调用arrays.sort()方法对数组内的类对象进行排序。

如:

import java.util.arrays;

import java.util.collections;

public class testresult implements comparable {

int point;

int no;

string name;

public testresult(int point,int no,string name){

this.point = point;

this.no = no;

this.name = name;

}

public int compareto(object o) {

int point_cp = ((testresult)o).point;

return (point

}

public static void main(string[] args) {

testresult[] tra = { new testresult(90,2,"ahang"),newtestresult(80,3,"wang"),new testresult(100,1,"zhao")};

arrays.sort(tra);

/*使用arrays.sort()默认的排序是升序的,那我们想要降序排列的话就使用下面的一句话就可以了*/

//arrays.sort(tra,collections.reverseorder());

for(int i = 0, trsleng = tra.length; i

system.out.println(tra[i].name + ","+tra[i].point);

}

}

}

执行结果如下:

wang,80

ahang,90

zhao,100

第二种方法:如果我们拿到一个类,但是这个类没有实现comparable接口,或者我们不想使用该类默认实现的comparable接口的比较 方法,我们想采用自己的思路来排序。变通的做法就是新创建一个比较算法类,该类实现的是comparator接口(不是comparable接口了),实 现的时候,比较方法参数的2个对象。该比较类不是具体的比较参与对象,知识算法提供者(comparator),在需要使用排序的时候,该算法作为参数传 递给排序方法。(红色字部分说的不是很简单命了,其实我理解就是,自己写了一个排序的方法,然后把要排序的对象做为参数传递进去,排序后在有该方法返回一 个排序完的结果)

例子如下:

import java.util.arrays;

import java.util.comparator;

/**

* 功能:由自己创建一个类并实现comparator接口,来完成数组对对象的排序

* 作者:jackrui

* 时间:2009.3.27

*/

class comresult implements comparator{

public int compare(object o1, object o2) {

int no1 = ((testresultcomparator)o1).no;

int no2 = ((testresultcomparator)o2).no;

return (no1size())

nosuchelementexception linkedlist中getlast,getfirst等方法取元素的时候list为空。

以上异常都是runtimeexception的子类,在编程的时候可以不处理该异常,如果出现问题,在程序运行期间由jvm抛出。

下面写一个关于concurrentmodificationexception异常的小例子

import java.util.collection;

import java.util.iterator;

import java.util.linkedlist;

/**

* @功能:一个关于concurrentmodificationexception异常的小例子

* @author jackrui

* @时间:2009.03.31

*/

public class collexceptiondemo {

public static void main(string[] args) {

collection coll = new linkedlist();

iterator iter = coll.iterator();

coll.add("a");

string s = (string)iter.next();

}

}

执行结果如下:

java.util.concurrentmodificationexception

。。。

1.5 .1 泛型

java1.5 中增加了泛型的概念,可以更方便的定义集合的数据类型和对集合中的数据进行访问,关于泛型的概念需要单独讲解,就不在这里说了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值