Java范例大全
上QQ阅读APP看书,第一时间看更新

第2章 Java基础语法

Java基础语法包括基本数据类型和引用数据类型、Java的运算符和表达式、流程控制以及常量变量和注释等。为了更好地掌握这些语法,本章将运用实例来讲解它们的功能。

实例4 变量和常量

程序中需要大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别叫做变量和常量。变量代表程序的状态。程序通过改变变量的值来改变整个程序的状态,或者说是实现程序的功能逻辑。变量包括实例变量、类变量等。常量在程序运行过程中有两个作用:一是代表常数,便于程序的修改;二是增强程序的可读性。本实例介绍如何运用实例变量、类变量和常量。

技术要点

运用变量与常量的技术要点如下:

• 变量语法格式:

数据类型 变量名称;

数据类型和变量名称之间使用空格进行间隔,空格的个数不限,但是至少需要一个。语句使用“;”作为结束。也可以在声明变量的同时,设定该变量的值,语法为:

数据类型 变量名称=值;

• 常量的语法格式只需要在变量的语法格式前面添加关键字final即可。在Java编码规范中,要求常量名必须大写。格式为:

final数据类型 常量名称=值;

实现步骤

(1)新建一个类名为TextConstant.java。

(2)代码如下所示:

package com.zf.s2;                                            //创建一个包
class Sub {                                                   //内部类
    final String subName = "HelloWorld";                      //声明常量并赋值
    final double fPi = 3.14;                                  //声明常量并赋值
}
public class TextConstant {                                   //操作常量和变量的类
    int number =0;
    public void run(Object obj){                              //传入对象参数的方法
          System.out.println("是对象Object:"+obj);
    }
    public void run(Sub sub){                                 //传入类对象参数的方法
        System.out.println("是类Sub:"+sub);
    }
    private void showObject(){                                //显示实例化对象的信息
        Sub sub=new Sub();                                    //实例化对象
        System.out.println("Sub.subName= "+sub.subName);      //获得对象的属性
        System.out.println("Sub.fPi= "+sub.fPi);
    }
    public static void main(String[] args) {                  //Java程序主入口处
        TextConstant constant = new TextConstant();           //类对象
        constant.number = 5;                                  //常量赋值
        System.out.println("t.i " + constant.number);
        constant.showObject();                                //调用方法
        constant.run(null);                                   //调用方法
    }
}

(3)运行结果如下所示:

t.i 5
Sub.subName= HelloWorld
Sub.fPi= 3.14
是类Sub:null

源程序解读

(1)showObject()方法中实例化一个对象,可称为实例变量,显示对象中的常量信息。其中Sub类中的常量声明为final,则变量值不可修改。如果方法声明为final,则方法不可重写;如果类声明为final,则类不可继承,没有子类。

(2)类中的两个run()方法是多态的一种方式:重载。在Java中,同一个类中的两个或两个以上的方法可以有同一个名字,只要它们的参数不同即可,在这种情况下,该方法就被称为重载(overloaded)。在main()方法中调用run()方法并传入null作为参数。null作为关键字,用来标识一个不确定的对象。可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。在调用run()方法中,先考虑类对象,如果参数不是类对象才考虑Object对象。

实例5 基本数据类型转换

Java有8种基本数据类型。包括整数int(4个字节)、short(2个字节)、long(8个字节)、byte(一个字节);浮点数float(4个字节)、double(8个字节);字符类型char(2个字节);布尔类型boolean。这些类型之间可以相互转换,本实例将讲解基本类型的转换,以及转换要注意的几个规则。

技术要点

本实例运用两种转换基本类型的方法:自动提升和强制转换。技术要点如下:

• 类型的自动提升发生的条件是两种类型是兼容的,或者目标类型的范围比原类型的范围大。

• 如果要转换数据的类型,需要进行强制类型转换。强制类型转换的方法是在数据前放一对包括新的类型名的括号,如语句“int i=(int)55555L;”表示将long型的55555L转换成int型,然后赋值给变量i。

实现步骤

(1)新建一个类名为BasicTypeChange.java。

(2)代码如下所示:

package com.zf.s2;                                     //创建一个包
public class BasicTypeChange {                         //修饰基本数据类型转换的类
    private void typeAutoUpgrade() {                   //基本类型的自动提升
          byte b = 44;
          char c = 'b';
          short s = 1024;
          int i = 40000;
          long l = 12463l;
          float f = 35.67f;
          double d = 3.1234d;
          //result声明为其他类型会出错,除非进行类型转换
          double result = (f * b) + +(l * f) + (i / c) - (d * s);
          System.out.print(" 结果 :" + result+" = ");
          System.out.println((f * b) + " + " + (l * f) + " + " + (i / c) + " - "
                      + (d * s));                      //输入经过运算获得的结果
    }
    private void autoChange() {                        //基本类型的自动转换
          char c = 'a';
          byte b = 44;
          short s0 = b;
          int i0 = s0;
          int i1 = c;
          long l = i0;
          float f = l;
          double d = f;
          float fl = 1.7f;
          double dou = fl;
          System.out.println("fl = " + fl + "; dou = " + dou);
          //一个数从一种类型转换成另外一种类型,再转换回来时,值还是一样的
          fl = (float)dou;
          System.out.println("fl = " + fl + "; dou = " + dou);
    }
    private void forceChange() {                        //强制类型转换
          double d = 123.456d;
          float f = (float) d;                          //将double类型强制转换成float
          long l = (long) d;                            //将double类型强制转换成long
          int i = (int) d;                              //将double类型强制转换成int
          short s = (short) d;                          //将double类型强制转换成short
          byte b = (byte) d;                            //将double类型强制转换成byte
          System.out.print("d = " + d + "; f = " + f + "; l = " + l);
          System.out.println("; i = " + i + "; s = " + s + "; b = " + b);
          d = 567.89d;
          //下面的转换首先进行截断操作,将d的值变为567,因为567比byte的范围256还大,
          //于是进行取模操作,567对256取模后的值为55
          b = (byte) d;
          System.out.println("d = " + d + "; b = " + b);
      }
      public static void main(String[] args) {            //Java程序主入口方法
          BasicTypeChange change = new BasicTypeChange(); //实例化对象
          change.typeAutoUpgrade();                       //调用基本类型的自动提升方法
          change.autoChange();                            //调用基本类型的自动转换方法
          change.forceChange();                           //调用强制类型转换方法
      }
}

(3)运行结果如下所示:

结果:443334.29465 = 1569.48 + 444555.2 + 408 - 3198.3616
fl = 1.7; dou = 1.7000000476837158
fl = 1.7; dou = 1.7000000476837158
d = 123.456; f = 123.456; l = 123; i = 123; s = 123; b = 123

源程序解读

(1)typeAutoUpgrade方法演示了基本数据类型的数据在进行运算时,其类型会自动进行提升,并对自动提升规则进行了说明。

(2)autoChange方法演示了基本数据类型的自动转换,以及自动转换发生的条件。当某些float类型的数据自动转换成double类型时,会出现前后不相等的情况,这是由该数不能够用有限的二进制位精确表示造成的。

(3)forceChange方法演示了何时进行强制类型转换,以及如何进行强制类型转换。在强制类型转换过程中会损失一定的精度。

实例6 操作多种运算符

Java运算符包括算术运算符(+、-、*、/)、比较运算符(==、<、>、<=、>=)、赋值运算符(=、+=、-=、*=、/=)、布尔运算符(&&、||、!、&、|、^)和位运算符(>>、>>>、<<)以及其他运算符(?:、++、--)。

技术要点

本实例讲述使用运算符的规则和注意事项。技术要点如下:

• 算术运算符应用。涉及数字精度问题,数字精度就是不同类型的数据之间进行运算,为了使结果更加精确,则由系统自动转化为精度更高的数据类型。

• 比较运算符应用。关系运算符的结果是布尔型数据。

• 赋值运算符应用。赋值就是将数值赋给变量,最简单的运算符为“=”。

• 位运算符应用。位运算符主要针对二进制。主要包括左移、右移、带符号的右移位运算符。

• 三元运算符表现形式:布尔表达式?值0:值1。

实现步骤

(1)创建一个类名为TextOperator.java。

(2)代码如下所示:

package com.zf.s2;                       //创建一个包
public class TextOperator {              //操作运算符应用的类
    int a=6,b=5;
    byte c=23,d=24;
    boolean e=true,f=false;
    private void calculateOperator(){    //算术运算符应用
          int divideA=a/b;               //根据基本类型自动转换规则,除数与被除数都是整数,
                                         //得到的结果也是整数。a/b结果是1,而不是1.2
          float divideB=a/b;
          float divideC=a/(b*2.0f);      //对于声明为float类型的数字,数字后加f
          double divideD=a/(b*2.0d);     //对于声明为double类型的数字,数字后加d
          System.out.println("(divideA=a/b),divideA="+divideA);
          System.out.println("(divideB=a/b),divideB="+divideB);
          System.out.println("(divideC=a/(b*2.0f)),divideC="+divideC);
          System.out.println("(divideD=a/(b*2.0d)),divideD="+divideD);
    }
    private void compareOperator(){      //比较运算符应用
          System.out.println("(a==b) = "+ (a==b));
          System.out.println("(a>b) = "+ (a>b));
          System.out.println("(a<b) = "+ (a<b));
          System.out.println("(a!=b) = "+ (a!=b));
          System.out.println("(a>=b) = "+ (a>=b));
          System.out.println("(a<=b) = "+ (a<=b));
          System.out.println("(a=b) = "+ (a=b));
    }
    private void evaluateOperator(){      //赋值运算符应用
          //+=运算符是先将运算符左边的操作符的值加上右边的操作数的值,
                                          //将结果再赋给运算符左边的操作符
          a +=1;                          //等价于a=a+1;
          System.out.println("a+=1的值为:"+a);
          a -=1;                          //等价于a=a-1;
          System.out.println("a-=1的值为:"+a);
          a /=2;                          //等价于a=a/2;
          System.out.println("a/=2的值为:"+a);
          a *=2;//                        等价于a=a*2;
          System.out.println("a*=2的值为:"+a);
          a &=2;                          //等价于a=a&1;
          System.out.println("a &=2的值为:"+a);
          a |=2;                          //等价于a=a|2;
          System.out.println("a |=2的值为:"+a);
          a ^=2;                          //等价于a=a^2;
          System.out.println("a ^=2的值为:"+a);
    }
    private void bitOperator(){           //位运算符应用
          int bitA=a & b;                 //按位与,两个运算数都为1时,结果为1,其余结果为0
          int bitB=a | b;                 //按位或,两个运算数都为0时,结果为0,其余结果为1
          int bitC=a ^ b;                 //按位异或,两个运算数相同时结果为0,不同时结果为1
          int bitD=~a;                    //按位非,0变成1,1变成0
          int a=6;                        //重新赋值
          int bitE = a >> 1;              //右移,左边空出位以0填充
          int bitF = a >>> 1;             //右移,左边空出位以0填充
          int bitG = a << 1;              //左移,右边空出位以0填充
          System.out.println("(bitA=a & b), bitA="+bitA);
          System.out.println("(bitB=a | b), bitB="+bitB);
          System.out.println("(bitC=a ^ b), bitC="+bitC);
          System.out.println("(bitD=~a), bitD="+bitD);
System.out.println("(bitE = a >> 1), bitE="+bitE); System.out.println("(bitF = a >>> 1), bitF="+bitF); System.out.println("(bitG = a << 1), bitG="+bitG); } private void booleanOperator(){ //布尔运算符应用 boolean booA=e && f; //与,当所有操作数都为true时,结果返回true, //否则为false boolean booB=e || f; //或,当一方操作数为true时,就返回true, boolean booC=e && (a==b); //所有操作数都为false时,返回false boolean booD=e || ((a==b)==f); System.out.println("(booA=e && f),booA="+booA); System.out.println("(booB=e || f),booB="+booB); System.out.println("(booC=e && (a==b)),booC="+booC); System.out.println("(booD=e || ((a==b)==f)),booD="+booD); //注意&&是短路与,意思是:当对操作数的表达式进行从左到右运算时, //若遇到有操作数的值为false,则结束运算,将结果置为false if(e && (a=b)==10) System.out.println("a="+a); if(f || (a=b)==10) System.out.println("a="+a); //||运算符:对操作数进行或运算,当所有操作数都为false时,结果为false, //否则结果为true if(f || (b==a-1)) System.out.println("a="+a); if(e || ((b--)==++b)) System.out.println("b="+b); //对操作数的值进行取反运算,操作数为true,取反为false if(!f) System.out.println("布尔变量f为false,取反后值为"+!f); else System.out.println("布尔变量f为true,取反后值为"+!f); //|运算符,和||一样,对操作数进行或操作,但它不是短路的 if(e | (a=b)==10) System.out.println("a="+a); if(f |(a=b)==10) System.out.println("a="+a); //&运算符,和&&一样,对操作数做与操作,不同的是它不是短路的, //它会运算完所有的操作数表达式 if(e & (a=b)==10){ System.out.println("a="+a); } if(f &(a=b)==10) System.out.println("a="+a); //^运算符,对操作数做异或操作,相同为false,不同为true if(e ^ (b==a-1)) System.out.println("布尔变量e值与(b==a-1)的值不同!"); else{ System.out.println("布尔变量e值与(b==a-1)的值相同!"); } } private void otherOperator(){ //其他运算符应用 int oA=(a>=b) ? 1:0; //可以用三元运算符替代简单的if语句 //格式x=a?b:c System.out.println("(oA=(a>=b) ? 1:0),oA的值为"+oA); if(b++ ==a) //b++表示先进行运算,再将b的值加1 System.out.println("表达式(b++==a)的值为true!"); else System.out.println("表达式(b++==a)的值为false!"); if(++b ==a) //++b表示先将b的值加1,再进行运算 System.out.println("表达式(++b==a)的值为true!"); else System.out.println("表达式(++b==a)的值为false!"); a--; //a--表示先进行运算,再将a的值减1 --a; //--a表示先将a的值减1,再进行运算 System.out.println("a的值为:"+a); } public static void main(String[] args) { //Java程序的主入口处 TextOperator operator=new TextOperator(); //实例化一个对象 System.out.println("1.算术运算符应用方法:"); operator.calculateOperator(); //调用算术运算符应用方法 System.out.println("2.比较运算符应用方法:"); operator.compareOperator(); //调用比较运算符应用方法 System.out.println("3.赋值运算符应用方法:"); operator.evaluateOperator(); //调用赋值运算符应用方法 System.out.println("4.位运算符应用方法:"); operator.bitOperator(); //调用位运算符应用方法 System.out.println("5.布尔运算符应用方法:"); operator.booleanOperator(); //调用布尔运算符应用方法 System.out.println("6.其他运算符应用方法:"); operator.otherOperator(); //调用其他运算符应用方法 } }

(3)运行结果如下所示:

1.算术运算符应用方法:
(divideA=a/b),divideA=1
(divideB=a/b),divideB=1.0
(divideC=a/(b*2.0f)),divideC=0.6
(divideD=a/(b*2.0d)),divideD=0.6
2.比较运算符应用方法:
(a==b) = false
(a>b) = true
(a<b) = false
(a!=b) = true
(a>=b) = true
(a<=b) = false
(a=b) = 5
3.赋值运算符应用方法:
a+=1的值为:6
a-=1的值为:5
a/=2的值为:2
a*=2的值为:4
a &=2的值为:0
a |=2的值为:2
a ^=2的值为:0
4.位运算符应用方法:
(bitA=a & b), bitA=0
(bitB=a | b), bitB=5
(bitC=a ^ b), bitC=5
(bitD=~a), bitD=-1
(bitE = a >> 1), bitE=3
(bitF = a >>> 1), bitF=3
(bitG = a << 1), bitG=12
5.布尔运算符应用方法:
(booA=e && f),booA=false
(booB=e || f),booB=true
(booC=e && (a==b)),booC=false
(booD=e || ((a==b)==f)),booD=true
b=5
布尔变量f为false,取反后值为true
a=5
布尔变量e值与(b==a-1)的值不同!
6.其他运算符应用方法:
(oA=(a>=b) ? 1:0),oA的值为1
表达式(b++==a)的值为true!
表达式(++b==a)的值为false!
a的值为:3

源程序解读

(1)在calculateOperator()方法中,对于除法运算,当除数和被除数都是整型时,若除不尽结果取整数部分。当除数和被除数不全是整型时,结果要声明为浮点型,否则要进行强制转换。

(2)在compareOperator()方法中,比较两个数是否相等用双等号,而不是等号。等号代表对变量进行赋值。

(3)evaluateOperator ()方法是讲解赋值运算符的运用。

(4)在bitOperator()方法中,“>>”是将数字按二进制位右移,左边空出位以0填充;“<<”是将数字按二进制位左移,右边空出位以0填充;“>>”与“>>>”对于正数操作没有什么区别,对于负数差别就大了。

(5)在booleanOperator()方法中,当“&&”左边的表达式值为false时,右边的表达式就不用计算了,整个表达式的值为false;当“&&”左边的表达式值为true时,就要计算右边的表达式,右边表达式的结果关系到整个表达式的结果。而“&”运算符不同,无论它左边连接的表达式的值是什么,都会计算右边的表达式的值,整个表达式最后得到的结果与“&&”得到的一样。“||”与“|”的区别和“&&”与“&”的区别一样。

(6)在otherOperator()方法中,a++与++a的区别:a++是先进行运算,再将a的值加1,++a是先将a的值加1,再进行运算。

实例7 不同数制间的转换

在使用计算机时,显示在计算机中的数值、图像等信息都是以二进制的形式存储和识别的,计算机底层硬件只能识别0、1,这种只有0、1两个数字符号的组合称为二进制。实际开发中使用最多的是十进制,但也会遇见八进制以及十六进制。为了读取数据方便,下面讲解不同数制间的转换。

技术要点

本实例根据数制表现形式的不同进行讲解。技术要点如下:

• 二进制有两个数字:0、1,运算时逢2进1,如100。

• 八进制有0~7八个数字,运算时逢8进1。八进制的数据有一个0的前缀,如012。

• 十六进制有16个数字,包括0~9和A、B、C、D、E、F,运算时逢16进1。十六进制的数据有一个0X的前缀,如0X1。

• 十进制有0~9十个数字,运算时逢10进1,如24。

实现步骤

(1)创建一个类名为TextNumberConversion.java。

(2)代码如下所示:

package com.zf.s2;                                              //创建一个包
import java.util.Scanner;
public class TextNumberConversion {                             //操作数制转换的类
    public static int NumberToTen(int beforeConversion, String number) {
                                                                //其他进制转成十进制
          double result = 0;                                    //声明转换后的数值
          String subString;
          //根据字符串的长度循环获得单个元素
          for (int i = 0; i < number.length(); i++) {
              subString = number.substring(i, i + 1);           //将字符串按循环截取
              if (beforeConversion == 16) {                     //判断是否是十六进制
                    subString = sixteenCharToNumber(subString); //将字母转换成数字
              }
              result += Integer.parseInt(subString)             //返回转换的结果
                      * Math.pow(beforeConversion, number.length() - i - 1);
          }
          return (int) result;
    }
    public static String TenToNumber(int afterConversion,String number) {
                                                                //十进制转成其他进制
          int current = Integer.parseInt(number);               //将字符转换成整数
          String opResult = "";
          //判断转换后的数制是否是十六进制
          if(afterConversion==16){
          //判断传入的数是否大于16,大于则逢16进1
              while(current>=afterConversion){
              opResult+=sixteenNumberToChar(current%afterConversion);
                                                                //将数字转换成字母
              current/=afterConversion;
          }
          if(current!=0)opResult+=sixteenNumberToChar(current); //最终余数
          }else{
          //判断传入的值是否大于转换后的数制
          while(current>=afterConversion){
              opResult+=current%afterConversion;
              current/=afterConversion;
          }
          if(current!=0)opResult+=current;                      //最终余数
          }
          String riResult = "";                                 //倒序二进制字符串
          //根据二进制的转换方式进行循环输出
          for(int i=opResult.length()-1;i>=0;i--){
              riResult = riResult + opResult.substring(i,i+1);
          }
          return riResult;
      }
      public static String sixteenCharToNumber(String s){   //十六进制字母对应数字
          String num="";
          if(s.equals("A") || s.equals("a"))
              num="10";
          else if(s.equals("B") || s.equals("b"))
              num="11";
          else if(s.equals("C") || s.equals("c"))
              num="12";
          else if(s.equals("D") || s.equals("d"))
              num="13";
          else if(s.equals("E") || s.equals("E"))
              num="14";
          else if(s.equals("F") || s.equals("f"))
              num="15";
          else
              num=s;
          return num;
      }
      public static String sixteenNumberToChar(int num){    //十六进制数字对应字母
          String c="";
          if(num==10) c="A";
          else if(num==11) c="B";
          else if(num==12) c="C";
          else if(num==13) c="D";
          else if(num==14) c="E";
          else if(num==15) c="F";
          else c=String.valueOf(num);
          return c;
      }
      public static void main(String []args){             //Java程序的主入口处
          String number;                                  //要转换的数
          int beforeConversion,afterConversion;           //转换前的数制,转换后的数制
          String result="";                               //经过数制转换后的结果
          String stop="";
          Scanner read=new Scanner(System.in);            //得到用户输入的值
          do{
              System.out.println("请输入三个参数(整数):
                                    待转换的数据 转换前的数制 转换后的数制");
              number=read.next();
              beforeConversion=read.nextInt();
              afterConversion=read.nextInt();
              stop="Q";
          }while(stop!="Q");                               //跳出循环
          try {
              if(beforeConversion!=10){    //判断转换前的数制是否是十进制
                    String temp=String.valueOf(
                        NumberToTen(beforeConversion,number)); //转换成十进制的数
                    result=String.valueOf(
                        TenToNumber(afterConversion, temp));   //十进制转换成其他进制
              }else{
                    result=String.valueOf(
                        TenToNumber(afterConversion, number)); //十进制转换成其他进制
              }
              System.out.println(beforeConversion+"进制的数:"+number+",转换成"
                                                  +afterConversion+"进制的数为:"+result);
          } catch (Exception e) {
              System.out.print("转换失败,请输入合法数据!");
              //所有程序(方法,类等)停止,系统停止运行
              System.exit(-1);    }
      }
}

(3)运行结果如下所示:

请输入三个参数(整数):待转换的数据   转换前的数制 转换后的数制
12
10
8
十进制的数:12,转换成八进制的数为:14

源程序解读

(1)NumberToTen()方法根据传入的数制转换成十进制,用循环遍历字符串获得字符串中的单个字符,然后对每个字符进行判断。传入的如果是十六进制的数,则调用sixteenCharToNumber()方法将字符转换成数字。并运用Math.pow()返回底数的指定次幂的功能对数据进行计算。Math.pow(x,y)相当于计算xy。

(2)TenToNumber()方法首先将要转换的字符转为整型,并根据转换后的数制获得相应的结果。十进制转换为二进制时,需要将十进制的数依次除2取余,获得的余数需要进行倒序整理。

(3)由于十六进制的数据中含有字母和数字,在进行数制转换时需要进行相应的字母数字转换。

(4)在程序主方法main()中,笔者运用运行程序获取用户输入的方式获得数据,具有很好的灵活性和可操作性。

实例8 多种方式实现阶乘的算法

本节将用四种算法实现计算阶乘,包括运用递归算法、运用简单的循环相乘的算法、数组添加的算法、利用BigInteger类实现。

技术要点

本实例主要根据处理阶乘的算法不同进行讲解。技术要点如下:

• 递归主要就是处理好入口和出口,入口是最初始的外部对函数调用,出口是对于继续递归也就是继续调用自身的限制条件,内容是对整个过程中单个步骤的一般化的抽象。简单地说就是在一个函数内部调用自身。

• 利用BigInteger类,可以计算更大的阶乘。

实现步骤

(1)创建一个类名为TextFactorial.java。

(2)代码如下所示:

package com.zf.s2;                                         //创建一个包
import java.math.BigInteger;                               //导入类
import java.util.ArrayList;
import java.util.List;
public class TextFactorial {                               //操作计算阶乘的类
    public static int simpleCircle(int num){               //简单的循环计算的阶乘
          int sum=1;
          if(num<0){                                       //判断传入数是否为负数
              throw new IllegalArgumentException("必须为正整数!"); //抛出不合理参数异常
          }
          for(int i=1;i<=num;i++){                          //循环num
          sum *= i;                                         //每循环一次进行乘法运算
          }
          return sum;                                       //返回阶乘的值
    }
    public static int recursion(int num){                   //利用递归计算阶乘
          int sum=1;
          if(num < 0)
              throw new IllegalArgumentException("必须为正整数!");//抛出不合理参数异常
          if(num==1){
              return 1;                                     //根据条件,跳出循环
          }else{
              sum=num * recursion(num-1);                   //运用递归计算
              return sum;
          }
    }
    public static long addArray(int num){                   //数组添加计算阶乘
          long[]arr=new long[21];                           //创建数组
          arr[0]=1;
          int last=0;
          if(num>=arr.length){
              throw new IllegalArgumentException("传入的值太大");//抛出传入的数太大异常
          }
          if(num < 0)
              throw new IllegalArgumentException("必须为正整数!");//抛出不合理参数异常
          //建立满足小于传入数的while循环
          while(last<num){
              arr[last+1]=arr[last]*(last+1);                //进行运算
              //last先进行运算,再将last的值加1
              last++;
          }
          return arr[num];
    }
    public static synchronized BigInteger bigNumber(int num){
                                                   //利用BigInteger类计算阶乘
              ArrayList list = new ArrayList();              //创建集合数组
              list.add(BigInteger.valueOf(1));               //往数组里添加一个数值
              for (int i = list.size(); i <= num; i++) {
                  BigInteger lastfact = (BigInteger) list.get(i - 1);//获得第一个元素
                  BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(i));
                                                             //获得下一个数组
                  list.add(nextfact);
              }
              return (BigInteger) list.get(num);             //返回数组中下标为num的值
    }
    public static void main(String []args){                  //Java程序的主入口处
          int num=5;
          int num1=23;
          System.out.println("简单的循环计算"+num+"的阶乘为"   //调用simpleCircle
                  +simpleCircle(num));
          System.out.println("利用递归计算"+num+"的阶乘为"     //调用recursion
                  +recursion(num));
          System.out.println("数组添加计算"+num+"的阶乘为"     //调用addArray
                  +addArray(num));
          System.out.println("利用BigInteger类计算"+num1+"的阶乘为"
                  +bigNumber(num1));                         //调用bigNumber
    }
}

(3)运行结果如下所示:

简单的循环计算5的阶乘为120
利用递归计算5的阶乘为120
数组添加计算5的阶乘为120
利用BigInteger类计算23的阶乘为25852016738884976640000

源程序解读

(1)本实例程序创建两个ArrayList类实例,第一个ArrayList类实例使用默认无参数的构造函数创建,通过调用Add方法初始化数据;第二个ArrayList类实例使用一个指定元素的数组创建,在创建的同时初始化数据。这两种方法所创建ArrayList类的初始容量是不同的。

(2)本实例程序所创建的第一个ArrayList类实例,所有的元素都是string数据类型,在遍历该集合的元素时,可以指定遍历对象的数据类型为string,第二个ArrayList类实例的元素不止一种数据类型,此时应指定遍历对象的数据类型为object。

(3)为说明两种初始化方式的区别,本实例程序未压缩ArrayList类实例的容量,在实际编程中可以使用TrimToSize方法压缩ArrayList类实例的容量。