基本数据类型的对象包装类
-
基本数据类型包装类的作用
基本数据类型 |
包装类 |
boolean |
Boolean |
byte |
Byte |
char |
Character |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
-
基本数据不具有对象的特性,不能满足某些特殊的需求
-
基本数据类型包装类具有对象的特性
实例,编写一个程序,通过在运行类时输入的参数来确定输出的*矩形:
(如“java TestInteger 5 3”回车后输出5列3行的*)
public class TestInteger
{
public static void main(String[] args)
{
int w=new Integer(args[0]).intValue();
int h=Integer.parseInt(args[1]);
//int h=Integer.parseInt(args[1]).intValue() //以上3种方法都可以将main函数的
//字符串参数args中的数字转换为int型
for(int i=0;i<h;i++)
{
StringBuffer sb=new StringBuffer();//新建一个StringBuffer对象sb
for(int j=0;j<w;j++)
{
sb.append('*'); //追加"*"到sb对象
}
System.out.println(sb.toString()); //把sb对象转换为String对象并输出
}
}
}
集合类
集合类是用于存储一组对象的集合类和接口,其中存储的每个对象称之为集合类中的元素,经常会用到的有Vector类、Enumeration接口、ArrayList类、Collection接口、Iterator接口、Set接口、List接口等集合类和接口。
Vector类与Enumeration接口
Vector类是Java语言提供的一种高级数据结构,可用于保存一系列对象,Java不支持动态数组,Vector类提供了一种与“动态数组”相近的功能。如果我们不能预先确定要保存的对象的数目,或是需要方便获得某个对象的存放位置时,Vector类都是一种不错的选择。
下面的程序实现了在键盘上输入一个数字序列并存储在某种数据结构中,最后在屏幕上打印出每位数字相加的结果。如输入123,输出结果为6
import java.util.*;//Vector类与Enumerator都在这个包中
public class TestVector
{
public static void main(String args[])
{
//Vector类在java中可以实现自动增长的对象数组;
Vector v = new Vector();//Vector可以存储各种类型的对象
System.out.print("请输入数字:");
while(true)
{
int b=0;
try{b=System.in.read();}catch(Exception e){e.printStackTrace();}
if(b=='\r'||b=='\n')
break;
else
{
b=b-'0'; //read方法从键盘读取进来的为输入的字符的ACCII码,如读取进来一个字符0,
//实际上保存的是ACCII码:48,数字1为49,数字2为50
//所以一个数字的ACCII码与0的ACCII码相减刚好等于它所代表的数字
v.addElement(new Integer(b));//这里的参数要求为对象类型,所以把int型转为Integer
}
}
int sum=0;
Enumeration e=v.elements();//elements方法返回一个实现了Enumeration接口的对象
//取出V的所有元素赋值给Enumeration对象e
while(e.hasMoreElements())
{
//e.nextElement()方法可以逐个返回Enumeration对象e中的元素
Integer intObj=(Integer)e.nextElement();//nextElement返回Enumeration指示器
//所指示的元素的位置的元素(这个元素的类型为Object类型)
//并将指示器指向下一个元素的位置
sum+=intObj.intValue();
}
System.out.println(sum);
}
}
在上面的例子中,因为不能预先确定输入数字序列的位数,所以不能使用数组来存储每一个数值。正因为如此,我们选择了Vector 类来保存数据。Vector.addElement只能接受对象类型的数据,因此先用Integer类包装了整数后,再用Vector.addElements方法向Vector对象中加入这个整数对象。最后,我们要取出保存在Vector对象中的所有整数进行相加,首先必须通过Vector.elements方法返回一个Enumeration接口对象,再用Enumeration.nextElement方法逐一取出保存的每个整数对象,Enumeration 对象内部有一个指示器指向调用nextElement方法时要返回的对象的位置。
不能从字面上去理解nextElement方法,该方法不是返回下一个对象,而是返回指示器正指向的那个对象,并将指示器指向下一个对象。当指示器指向了一个空对象(表示没有对象可以返回)时,Enumeration.hasMoreElement方法将返回false,,否则返回true,调用nextElement方法之前,指示器指向第一个对象或空对象(Enumeration中没有一个对象存在时)。nextElement方法返回的是Object类型,需要对其进行类型转换,转换成Integer。
Enumeration是一个接口类,它提供了一种访问各种数据结构(Vector类只是众多数据结构中的一种)中的所有数据的抽象机制,就是我们要访问各种数据结构对象中的所有元素时,都可以使用同样的方式,调用同样的方法,有了这样的数据结构接口,就很容易学一通百,以不变应万变了。
Collection接口与Iterator接口
java2平台发布后,java设计者又推出了一套综合的数据结构,这些数据结构的基本接口是Collection,它的使用非常类似上面的Vector类,只是方法名不同。我们要取出保存在实现了Collection接口对象中的所有对象,也必须通过Collection.iterator方法返回一个Iterator接口对象,Iterator接口的功能与使用Enumeration接口非常相似。Java 2平台的数据结构类设计人员本可以扩展Enumeration接口,但是他们不喜欢Enumeration接口方法冗长的名字,因而创建了Iterator这个新接口,并缩短了方法名长度。
按照Java的语法,不能直接用Collection接口类创建对象,而必须用实现了Collection接口的类来创建对象,ArrayList类就是一个实现了Collection接口的类。
将上面使用Vector和Enumeration的例子改为用ArrayList和Iterator编写:
import java.util.*;//ArrayList、Iterator接口在此包中
public class TestCollection
{
public static void main(String args[])
{
//ArrayList是一个实现了Collection接口的类,它的功能和Vector类类似
ArrayList v = new ArrayList();
System.out.print("请输入数字:");
while(true)
{
int b=0;
try{b=System.in.read();}catch(Exception e){e.printStackTrace();}
if(b=='\r'||b=='\n')
break;
else
{
b=b-'0'; //read方法从键盘读取进来的为输入的字符的ACCII码,如读取进来一个字符0,
//实际上保存的是ACCII码:48,数字1为49,数字2为50
//所以一个数字的ACCII码与0的ACCII码相减刚好等于它所代表的数字
v.add(new Integer(b));//这里的的add方法相当Vector类的addElement()方法
}
}
int sum=0;
Iterator e=v.iterator();//这里的iterator方法的功能与Vector类的elements方法功能类似,这个方法
//是返回一个Iterator类型的的对象
while(e.hasNext()) //hasNext 相当于Enumeration的hasMoreElements方法
{
Integer intObj=(Integer)e.next();//next方法相当于Enumeration的nextElement方法
sum+=intObj.intValue();
}
System.out.println(sum);
}
}
什么时候用Vector,什么时候用ArrayList呢?
Vector类中的所有方法都是线程同步的,两个线程并发访问对象将是安全的,但是只有一个线程访问Vector对象时,因为源程序仍调用了同步方法,需要额外的监视器检查,运行效率要低一些。
ArrayList类中的所有方法是非同步的,所以在没有多线程安全问题时,最好用ArrayList,程序的效率会高些。在有线程安全问题,且我们的程序又没有自己处理(对调用ArrayList的代码或方法加上同步代码同步处理)时,只能用Vector。
集合类接口的比较
-
Set、List接口是Collection接口的子类,ArrayList也是一个实现了List接口的类。
-
Collection:对象之间没有指定的顺序,允许重复元素
-
Set:对象之间没有指定的顺序,不允许重复元素
-
List:对象之间有指定的顺序,允许重复元素
由于在List接口中,对象之间有指定的顺序,因此我们可以对List接口的对象进行排序。ArrayList也可以进行排序,如:
import java.util.*;
public class TestSort {
public static void main(String[] args)
{
ArrayList a1=new ArrayList();
a1.add(new Integer(1));
a1.add(new Integer(3));
a1.add(new Integer(2));
System.out.println(a1.toString());
Collections.sort(a1);
System.out.println(a1.toString());
}
}
//上面程序向实现了List接口的ArrayList类对象中添加了3个成员。然后用Collections类的sort静态方法对其进行排序。
Collections类中的所有方法都是静态的,其中的sort()方法可以用于对实现了List接口的对象中的元素进行排序。