再学习Java——一些我们可能忽略的东西(1)

来源:互联网 发布:php手机板块 编辑:程序博客网 时间:2024/05/21 02:51

一、枚举类型

        为了实现对某一些变量的取值只能局限一有限集合内,java中设计了枚举这一类型。举例而言,例如在代码中要模拟商场购物这一场景,我们创建一个变量用来保存用户已购买的商品(buy),而商场中只有面条(NOODLE)、饼干(BISCUITS)和茶(TEE)这三种商品。为了防止buy这个变量里储存有超出这三种商品的值,可以使用枚举这一类型来限制用户的选取:       

enum Shop{NOODLE, BISCUITS, TEE};

然后,声明这个变量:

Shop buy=Shop.NOODLE;

这样,在buy这个变量中,只会出现NOODLE、BISCUITS、TEE和null这四个值,而不会出现其他的非法值。

        下面,我们来详细讨论一下枚举类型。实际上,定义枚举类型实际上定义的是一个类,而NOODLE、BISCUITS、TEE就是这个类的三个实例。

Shop buy=Shop.NOODLE;

这行代码就是将NOODLE这个实例赋给buy这个变量。因此,比较两个枚举变量时候相等,只需用“==”,而不需要调用equals。
下面是一个定义枚举类的一个示例:
enum Shop{NOODLE("n","n"), BISCUITS("b","b"), TEE("t","t");private String a;private String b;private Shop(String a,String b){this.a=a;this.b=b;}public void sa(){System.out.println(a+b);}}
如上所示,枚举类与普通类一样,可以有自己的域,构造器和一些方法,需要注意的是,枚举类的构造方法需定义为private,从而避免错误的在其他地方构造新对象。
        所有的枚举类都是enum的子类,它们可以继承enum的一些方法,其中有几个是十分有用的:
buy.toString()//返回字符串NOODLEShop buy=Enum.valueOf(Shop.class,"NOODLE");//toString的逆方法,将buy这个变量设置为Shop.NOODLEShop[] values=Shop.values();//返回一个包含Shop所有实例的数组Shop.NOODLE.ordinal();//该方法返回该枚举常量在枚举类中的位置,如本行代码将返回0Shop.NOODLE.compareTo(Shop.BISCUITS);//该方法将Shop.NOODLE与Shop.BISCUITS在枚举类中的位置相比较,如本行代码将返回-1

二、大数值

        我们知道,java中基本的整数和浮点数的精度是有限的,如果我们所要处理的数据超出了它们的范围,我们可以使用java.math包中两个处理大数值的类:BigInteger和BigDecimal,这两个类可以处理任意精度的值。我们可以用其中的valueOf()将普通的数值转化为大数值。例如:

BigInteger a=BigIneger.valueOf(100);
下面是这两个类中的基本方法:

//以下是对大整数的加减乘除以及余数的运算BigInteger add(BigInteger other);BigInteger subtract(BigInteger other);BigInteger multiply(BigInteger other);BigInteger divide(BigInteger other);BigInteger mod(BigInteger other);
int compareTo(BigInteger other);//比较两个大整数,若相等则返回0,若other大,则返回负数,若other小,这返回正数
//以下是对大实数的加减乘除的运算BigDecimal add(BigDecimal other);BigDecimal subtract(BigDecimal other);BigDecimal multiply(BigDecimal other);BigDecimal divide(BigDecimal other,RoundingMode mode);//计算除法时,第一个参数是除数,第二个参数是舍入的方式,如RondingMode.HELF_UP是传统的四舍五入方式

int compareTo(BigDecimal other);//比较两个大实数,若相等则返回0,若other大,则返回负数,若other小,这返回正数static BigDecimal valueOf(long x,int scale);//返回一个x/10^scale的大实数


三、for each 循环(增强的for循环)

        我们通常使用循环来遍历某一个集合。例如,有一个数组a,其中有100个元素,一般的做法是写一个for循环遍历数组中的每一个元素:

for(int i=0;i<100;i++){System.out.println(a[i]);}
这样做的缺点是,我们必须控制好循环的次数,稍不注意就会造成下标越界这一错误。在java中,提供了一种增强的for循环,可以更加简便的遍历集合而不必考虑集合的界限.例如有一个储存int类型的数组a,我们可以如下进行遍历:

for(int i:a){System.out.println(a);}
我们定义了一个变量i用来储存集合中的每一个元素,并将它们输出出来,需要注意的是,变量i的类型需要和集合中储存的类型相同。当然,这种循环方式只适用于遍历集合中的所有元素,若只希望得到其中的某几个元素,这种方式则不适用。

        除此之外,还有一种更加简便的方法可以得到集合中的每一个元素,那就是Array类中的toString()方法。例如Array.toString(a);可以返回一个以[]为边界,数组每一个元素以逗号隔开的字符串。

四、命令行参数

        我们知道,在java中必然带有一个带String args[]参数的main方法。这个参数表明main方法将接收一个字符串数组,即命令行参数。

例如有下面一个程序:

import java.util.Arrays;public class HelpText {public static void main(String args[]){for(String a:args){System.out.println(a);}}}
我们在cmd中用如下方法运行.class文件:java HelpText 123,则程序输出的就是123。

五、Array类中对于数组的一些操作

        当我们需要对数组里的元素进行排序,或需要查找某一个元素是否在数组里的时候,我们通常会采用一个循环来遍历数组,以此达到目的。而Array类中提供了一些方法也能使我们快速的完成这些工作:

static String toString(type[] a)//返回一个包含数组a各个元素的字符串,以[]为边界,各个元素以逗号隔开static type[] copyOf(type[] a,int length)//返回一个类型与a相同的数组,其中的元素为数组a中,从第一个元素开始至length-1个元素为止static type[] copyOfRange(type[] a,int start,int end)//返回一个类型与a相同的数组,其中的元素为数组a中,下标为start至end的元素static void sort(type[] a)//采用优化的快速排序算法对数组进行排序static int binarySearch(type[] a,type v)//采用二分法查找v,若成功,则返回元素v的下标,否则返回一个负值static int binarySearch(type[] a,int start,int end,type v)//采用二分法查找v,start与end分别为起始下标和终止下标static void fill(type[] a.type v)//将数组中的所有元素设置为vstatic boolean equals(type[] a,type[] b)//比较两个数组,若它们大小相同,其中的元素一一对应相等,则返回true,否则则返回false

六、不规则数组

        从表面上看,java的多维数组与其他的语言没有太大区别,但是事实上,java中并不存在多维数组这一数据类型,所谓的二维,三维数组等,被解释为“数组的数组”。也就是说,实际上二维数组只是一个一维数组,而这个一维数组里的每一个元素,都是一个新的数组。在这个基础上,我们就可以实现一个不规则的二维数组,其中数组的每一行都有不同的长度,如:

1

1 2

1 2 3

1 2 3 4

1 2 3 4 5

具体而言,我们可以这样去创建一个不规则数组:

<pre name="code" class="java">public class newArray{public static void main(String args[]){int [][] a=new int [5][];//确定数组有几行//遍历一维数组,在数组的每一个元素中存入不同长度的新数组for(int i=0;i<a.length;i++){a[i]=new int[i+1];}//给一维数组中的新数组赋值for(int i=0;i<a.length;i++){for(int x=0;x<a[i].length;x++){a[i][x]=x+1;}}//输出这个不规则数组for(int[] i:a){for(int x:i){System.out.print(x);}System.out.println();}}}

如此,我们的不规则数组便创建完成,达到了上文给出例子中的效果。需要注意的是,不规则数组需要单独的创建行数组,而不能直接用int[][] a=new int[10][6]这样的语句声明。

1 0
原创粉丝点击