Java是一种面向对象语言,但在Java中不能定义基本数据类型的对象,为了能将基本数据类型视为对象进行处理,Java提出了包装类的概念,它主要是将基本数据类型封装在包装类中,如int型的包装类Integer,boolean型的包装类Boolean等,这样可以把这些基本数据类型转换为对象进行处理。Java中的包装类及其对应的基本数据类型如下表。
Integer类
java.lang包中的Integer类,Byte,类,Short类和Long类,分别将基本数据类型int,byte,short和long封装成一个类,由于这些类都是Number类的子类,区别就是封装不同的数据类型,其包含的方法基本相同,所以本节以Integer类为例讲解整数包装类。
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段。此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。Integer类的常用方法如下表
Integer类的常用方法
package 第十一章常用类库;
public class IntegerDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int num=Integer.parseInt("456"); //将字符串转换为int类型
Integer iNum=Integer.valueOf("456"); //创建一个Integer对象
System.out.println("int 数据与Integer对象的比较:"+iNum.equals(num));
String str2=Integer.toBinaryString(num); //获取数字的二进制表示
String str3=Integer.toHexString(num); //获取数字的十六进制表示
String str4=Integer.toOctalString(num); //获取数字的八进制表示
String str5=Integer.toString(num,15); //获取数字的十五进制表示
System.out.println("456的二进制表示为:"+str2);
System.out.println("456的十六进制表示为:"+str3);
System.out.println("456的八进制表示为:"+str4);
System.out.println("456的十五进制表示为:"+str5);
}
}
Integer类提供了以下4个常量:
MAX_VALUE:表示int类型可取的最大值,即2的31次方-1
MIN_VALUE: 表示int类型可取的最小值,即-2的31次方。
SIZE:用来以二进制补码形式表示int值的位数。
TYPE:表示基本类型int的Class实例。
查看Integer类的常量值
package 第十一章常用类库;
public class GetCon {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int maxint=Integer.MAX_VALUE; //获取Integer类的常量值
int minint=Integer.MIN_VALUE;
int intsize=Integer.SIZE;
System.out.println("int类型可取的最大值是:"+maxint); //将常量值输出
System.out.println("int类型可取的最小值是:"+minint);
System.out.println("int类型的二进制位数是:"+intsize);
}
}
Double类和Float类是对double,float基本类型的封装,它们都是Number类的子类,都是对浮点数进行操作,所以常用方法基本相同,本节将对Double类进行讲解。对于Float类,可以参考Double类的相关内容。
Double类在对象中包装一个基本类型为double的值,每个Double类的对象都包含一个double类型的字段。此外,该类还提供多个方法,可以将double类型转换为String类型,将String类型转换为double类型,也提供了其他一些处理double类型时有用的常量和方法。Double类的常用方法如下表
方法 | 功能描述 |
booleanValue() | 将Boolean对象的值以对相应的boolean值返回 |
equals(Object obj) | 判断调用该方法的对象与obj是否相等,当且仅当参数不是null;而且与调用该方法的对象一样都表示同一个boolean值得Boolean对象时才返回true |
parseBoolean(String s) | 将字符串参数解析为boolean值 |
toString() | 返回表示参数该boolean值为String对象 |
valueOf() | 返回一个用指定得字符串表示的boolean值 |
Double类的常用方法的使用
package 第十一章常用类库;
public class DoubleDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Double dNum=Double.valueOf("3.14"); //创建一个Double对象
//判断是否为非数字值
System.out.println("3.14是否为非数字值:"+Double.isNaN(dNum.doubleValue()));
System.out.println("3.14转换为int值为:"+dNum.intValue());
//判断大小
System.out.println("值为3.14的Double对象与3.14的比较结果:"+dNum.equals(3.14));
//转换为十六进制
System.out.println("3.14的十六进制表示为:"+Double.toHexString(dNum));
}
}
Double类主要提供了以下常量
MAX_EXPONENT: 返回int值,表示有限double变量可能具有的最大指数。
MIN_EXPONENT: 返回int值,表示标准化double变量可能具有的最小指数
MEGATIVE_INFINITY: 返回double值,表示保存double类型的负无穷大的值的常量
POSITIVE_INFINITF:返回double值,表示保存double类型的正无穷大的值的常量
11.1.3Double类
Boolean类将基本类型为boolean的值包装在一个对象中,一个Boolean类型的对象只包含一个类型为boolean的字段。此外此类还为了boolean类型和String类型的相互转换提供了许多方法,并提供了处理boolean类型时非常有用的其他一些常量和方法。Boolean类的常用方法如表所示
package 第十一章常用类库;
public class BooleanDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Boolean b1=Boolean.valueOf("true"); //创建Boolean对象
Boolean b2=Boolean.valueOf("ok");
System.out.println("b1:"+b1.booleanValue());
System.out.println("b2:"+b2.booleanValue());
}
}
Boolemn 提供了以下3个常量:
TRUE:对应基值 true的 Boolean 对象
.FALSE:对应基值 flse的 Boolean 对象
MTYPE:基本类型boolean的Class 对象 。
11.1.4character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字符的类别(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。Character类提供了很多方法来完成对字符的操作,常用的方法如表11.5所示。
方法 | 功能描述 |
valueOf(char a) | 返回保存指定 char 值的 Character 对象 |
compareTo(Character anotherCharacter) | 根据数字比较两个Character 对象,若这两个对象相等则返回0 |
equals(Object obj) | 将调用该方法的对象与指定的对象相比较 |
toUpperCase(char ch) | 将字符参数转换为大写 |
toLowerCase(char ch) | 将字符参数转换为小写 |
toString() | 返回一个表示指定char值的 String对象 |
charValue() | 返回此 Charact ter 对象的值 |
isUpperCase(char ch) | 判断指定字符是否为大写字符 |
isLowerCase(char ch) | 判断指定字符是否为小写字符 |
isLetter(char ch) | 判断指定字符是否为字母 |
isDigit(char ch) | 判断指定字符是否为数字 |
package 第十一章常用类库;
public class UpperOrLower {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Character mychar1=Character.valueOf('A');
Character mychar2=Character.valueOf('A');
if(Character.isUpperCase(mychar1)) { //判断是否为大字母
System.out.println(mychar1+"是大写字母");
//转换为小写并输出
System.out.println("转换为小写字母的结果:"+Character.toLowerCase(mychar1));
}
if(Character.isLowerCase(mychar2)) { //判断是否为小写字母
System.out.println(mychar2+"是小写字母");
//转换为大写并输出
System.out.println("转换为大写字母的结果:"+Character.toUpperCase(mychar2));
}
}
}
Character类提供了大量表示特定字符的常量,例如:
ONNECTOR_PUNCTUATION:返回 byte 型值,表示Unicode规范中的常规类别“Pc”。 UNASSIGNED:返回byte 型值,表示 Unicode 规范中的常规类别“Cn”。
TITLECASE_LETTER:返回 byte型值,表示Unicode规范中的常规类别“Lt”。
11.1.5Number类
11.1.5 Number类
前面介绍了Java包装,对包装类,它们有一个共同的父类--Number类,该半是一个抽象类,它是Byte、Integer、Short、Long、Float和Double类的父类,其子类必须提供将示的数值转换为byte、int、short、long、float 和 double的方法。例如,doubleValueO方法返回双精度点值,floatValueO方法返回单精度浮点值,这些方法如表 11.6 所示。
方法 | 功能描述 |
byteValue() | 以byte形式返回指定的数值 |
intValue() | 以int形式返回指定的数值 |
floatValue() | 以float形式返回指定的数值 |
shortValue() | 以short形式返回指定的数值 |
longValue() | 以long形式返回指定的数值 |
doubleValue() | 以double形式返回指定的数值 |
11.2数字处理
在Jav数基本算的Math,该类包括常用的数运算方法,如三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数方法。除此之提供了一些常用的数学常量,如PI、E。将讲解Math一常用法。
在实际开发中,随机数的使用是很普遍的,所要掌握生成随机数的操作。在 Java中主要提供了两种生成随机数的方式,分别为调用Mathrandom法成随机数和调用Random类生成各种据类型的随机数。
在Java 字操,即javamathBigInteger 类与java.math.BigDecimal 类。这个类用于高精度计算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。
11.2.1数字格式化
11.2.1数字格式化
数字格式化在解决实际问题时应用非常普遍,如表示某超市的商品价格,需要保留两位有效数字数字格式化操作主要针对的是浮点型数据,包括double 型和float型数据。在Java 中使用java.te DecimalFormat格式化数字,本节将着重讲解DecimalFormat类。
在Java中,没有格式化的数据遵循以下原则:
如果数据绝对值大于0.001并且小于100000,使以常规小数形式表示。 如果数据绝对值小于0.001或者大于1000,使用科学记数法表示。
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在 Java中,可以使用DecimalFormat类进行格式化操作。
DecimalFormat 类是 NumberFormat的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般情况下,可以在实例化DecimalFormat对象时传递数字格式,也可以通过DecimalFormat类中的 applyPattern()方法来实现数字格式化。
当格式化数字时,可在DecimalFormat类中使用一些特殊字符构成一个格式化模板,使数字按照一定的特殊字符规则进行匹配。表11.7列举了格式化模板中的特殊字符及其所代表的含义。
字符 | 说 明 |
0 | 代表阿拉伯数字,使用特殊字符“0”表示数字的一位阿拍拉伯数字,如果该位不存在数字,则显示0 |
# | 代表阿拉伯数字,使用特殊字符“#”表示数字的一位阿拉位伯数字,如果该位存在数字,则显示字符;如果该位不存在数字,则不显示 |
. | 小数分隔符或货币小数分隔符 |
- | 负号 |
, | 分组分隔符 |
E | 分隔科学记数法中的尾数和指数 |
% | 放置在数字的前缀或后缀,将数字乘以 100 显示为百分数 |
\u2030 | 放置在数字的前缀或后缀,将数字乘以 1000 显示为千分数 |
\u00A4 | 放置在数字的前缀或后缀,作为货币记号 |
' | 单引号,当上述特殊字符出现在数字中时,应立为特殊符号添加单引号,系统会将此符号视为普通符号处理 |
上述代码中setGroupingSize()方法甚至格式化数字的分组大小 setGroupingSize()方法设置时否可以对数字进行分组操作,为了使读者更好地理解这两个方法地使用来看下面的实例
package 第十一章常用类库;
import java.text.DecimalFormat;
public class DecimalFormatSimpleDemo {
//使用实例化对象时设置格式化模式
static public void SimgleFormat(String pattern,double value) {
DecimalFormat myFormat=new DecimalFormat(pattern);//实例化DecimalFormat对象
String output=myFormat.format(value); //将数字进行格式化
System.out.println(value+""+pattern+""+output);
}
//使用applyPattern()方法对数字进行格式化
static public void UseApplyPatternMethodFormat(String pattern,double value) {
DecimalFormat myFormat=new DecimalFormat();//实例化DecimalFormat对象
myFormat.applyPattern(pattern); //调用使用applyPattern()方法设置格式化模板
System.out.println(value+""+pattern+""+myFormat.format(value));
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
SimgleFormat("###,###,###",123456789); //调用静态SimgleFormat()方法
SimgleFormat("00000000.###kg",123456.789); //在数字后面加上单位
//按照格式模板格式化数字,不存在的位以0显示
SimgleFormat("000000.000",123.78);
//调用静态UseApplyPatternMathodFormat()方法
UseApplyPatternMethodFormat("#.###%",0.789); //将数字转换为百分数形式
UseApplyPatternMethodFormat("###.##%",123456.789); //将小数点后格式化为俩位
UseApplyPatternMethodFormat("0.00\u2030",0.789); //将数字转换为千分数形式
}
}
package 第十一章常用类库;
import java.text.DecimalFormat;
public class DecimalMethod {
public static void main(String[] args) {
// TODO 自动生成的方法存根
DecimalFormat myFormat =new DecimalFormat();
myFormat.setGroupingSize(2);//设置将数字分组为二
String output =myFormat.format(123456.789);
System.out.println("将数字以灭两个数字分组"+output);
myFormat.setGroupingUsed(false);//设置不允许数字进行分组
String output2 =myFormat.format(123456.789);
System.out.println("不允许数字分组"+output2);
}
}
11.2.2Math类
Mad类提供了众多数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取最大售、最小值,以及平均值的数方法。这些方法都被定义为 static 形式,所以在程序中应用比较简便。可以使用如下形式调用:
Ma数学方法
在Mth用量,些数学常量作为Math类的成员变量出现,调用起来也很简单。可以使用如下形式调用:
Math,为三角法,指数
Math.Pi
Math.E
数方法,,取大值、最小值和绝对值函数方法。
1.三角函数方法
Math
public static double sin(double a):返回角的三角正弦。
public static double cos(double a):返回角的三角余弦。
public static double tan(double a):返回角的三角正切。
public static double asin(double a):返回一个值的反正弦。
public static double acos(double a):返回一个值的反余弦。
public static double atan(double a):返回一个值的反正切。
public static double toRadians(double angdeg):将角度转换为弧度。
a public static double toDegrees(double angrad):将弧度转换为角度。
以上每个方法的参数和返回值都是 double 型的。将这些方法的参数的值设置为double 型是有一定道理的,参代度来现,180弧度,所以180”可以使用弧度来表元除了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切,Math 类还提供了角度和弧度相互转的方法toRadiansO和toDegrees。但需要注意的是,角度与弧度的转换通常是不精确的。
package 第十一章常用类库;
public abstract class TrigonometricFunction {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//11.2.2Math类
//三角函数
System.out.println("90度的正弦值:"+Math.sin(Math.PI/2));//取90°的正弦
System.out.println("0度的余弦值:"+Math.cos(0));//取0°的正弦
System.out.println("60度的正切值:"+Math.tan(Math.PI/3));//取60°的正切
//取2的平方根与2商的反正弦
System.out.println("取2的平方根与2商的反正弦:"+Math.asin(Math.sqrt(2)/2));
//取2的平方根与2商的反余弦
System.out.println("取2的平方根与2商的反余弦:"+Math.acos(Math.sqrt(2)/2));
System.out.println("1的反正切值:"+Math.atan(1));//取1的反正切
System.out.println("120度的弧度值:"+Math.toRadians(120.0));//取120°的弧度值
System.out.println("Π/2的角度值:"+Math.toDegrees(Math.PI/2));//取PI/2的角度
}
}
2.指数函数方法
Math类中与指数相关的函数方法如下。
public static double exp(doublea):用于获取e的a次方,即取e。
public static double log(doublea):用于取自然对数,即取 lna 的值。
public static double log10(doublea):用于取底数为10的a的对数。
public static double sqrt(double a):用于取a的平方根,其中a的值不能为负值。
public static double cbrt(double a):用于取a的立方根。
public static double pow(doubleadoubleb):用于取a的b次方。
指数运算包括求方根、取对数以及求n次方的算。为了使读者更好地理解这些运算函数方法法,下面举例说明。
例题11.8
package 第十一章常用类库;
public class ExponentFunction {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("e的平方值:"+Math.exp(2));//取e的2次方
System.out.println("以e为底2的对数值:"+Math.exp(2));//取以e为底2的对数
System.out.println("以10为底2的对数值:"+Math.log(2));//取以10为底2的对数
System.out.println("4的平方根::"+Math.sqrt(4));//取4的平方根
System.out.println("8的立方根值:"+Math.cbrt(8));//取8的立方根
System.out.println("2的2次方值:"+Math.pow(2, 2));//取2的2次方
}
}
3.取整函数方法
在具体的问题中,取整操作使用也很普遍,所以Java在Math类中添加了数字取整方法。Math类
public static double ceil(double a):返回大于等于参数的最小整数。向上事整
中主要包括以下几种取整方法:
public static double floor(double a):返回小于等于参数的最大整数。向下轻
public static double rint(double a):返回与参数最接近的整数,如果存在两个同样接近的整数,则结果取偶数。
public static int round(float a):将参数加上 0.5 后返回与参数最近的整数。
public static long round(double a):将参数加上 0.5后返回与参数最近的整数,然后强制转换为长整型。
package 第十一章常用类库;
public class IntFunction {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("使用ceil()方法取整:"+Math.ceil(5.2));//返回一个大于等于参数的整数
System.out.println("使用floor()方法取整:"+Math.floor(2.5));//返回一个小于等于参数的整数
System.out.println("使用rint()方法取整:"+Math.rint(2.7));//返回与参数最接近的整数
System.out.println("使用rint()方法取整:"+Math.rint(2.5));//返回与参数最接近的整数
//将参数加上0.5后返回最接近的整数
System.out.println("使用round()方法取整:"+Math.round(3.4f));
//将参数加上0.5后返回最接近的整数,并将结果强制转换为长整型
System.out.println("使用round()方法取整:"+Math.round(2.5));//取2的2次方
}
}
4.取最大值、最小值、绝对值函数方法
在程序中最常用的方法就是取最大值、最小值、绝对值等, Math类中包括的操作方法如下
Math public static double max(double a,double b):取a与b之间的最大值。
public static int min(int a,intb):取a与b之间的最小值,参数为整型。
public static long min(long a,long b):取a与b之间的最小值,参数为长整型。
public static float min(float a,float b):取a与b之间的最小值,参数为单精度浮点型。
public static double min(double a,double b):取a与b之间的最小值,参数为双精度浮点型。 publicstatic int abs(int a):返回整型参数的绝对值。
public static long abs(long a):返回长整型参数的绝对值。
public static float abs(float a):返回单精度浮点型参数的绝对值。
public static double abs(double a):返回双精度浮点型参数的绝对值。
package 第十一章常用类库;
public class AnyFunction {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("4和8较大者:"+Math.max(4,8)); //取俩个参数的最大值
System.out.println("4.4和4较小者:"+Math.min(4.4,4)); //取两个参数的最小值
System.out.println("-7的绝对值:"+Math.abs(-7)); //取参数的绝对值
}
}
11.2.3Random类
Random 类是JDK随成器类,通例化一个Random 对象创建一个随机数生
器,语法如下:
Randomr=new Random():
以这种方式实例化对象时,Java 编译器将以系统当前时间作为随机数生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两个运行结果相同的随机数。
用户也可以在实例化Random类对象时,设置随机数生成器的种子。语法如下:
Randomr=new Random(seedValue);
r: Random类对象。
seedValue:随机数生成器的种子。
在Random 类中,提供了获取各种数据类型随机数的方法,下面列举几个常用的方法: public int nextIntO):返回一个随机整数。
public int nextInt(intn):返回大于等于0且小于n的随机整数。
M public long nextLong0):返回一个随机长整型值。
public boolean nextBoolean():返回一个随机布尔型值。
public float nextFloat):返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型值。
public double nextGaussian():返回一个概率密度为高斯分布的双精度浮点型值。
package 第十一章常用类库;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Random r=new Random();
//随机产生一个整数
System.out.println("随机产生一个整数:"+r.nextInt());
//随机产生一个大于等于0小于10整数
System.out.println("随机产生一个大于等于0小于10整数:"+r.nextInt(10));
//随机产生一个布尔型的值
System.out.println("随机产生一个布尔型的值:"+r.nextBoolean());
//随机产生一个双精度浮点型的值
System.out.println("随机产生一个双精度浮点型的值:"+r.nextDouble());
//随机产生一个单精度浮点型的值
System.out.println("随机产生一个单精度浮点型的值:"+r.nextFloat());
//随机产生一个概率密度为高斯分布的双精度浮点型的值
System.out.println("随机产生一个概率密度为高斯分布的双精度浮点型:"+r.nextGaussian());
}
}
11.2.4Biglnteger类
11.2.4Biglnteger类
Biginteger类较Integer数字围大得多。文介绍Integerint in,Ineger无法实现了,所以Java中提供 Biglnteger类来处理更大的数字。BigInteger类支持意精度的整数,也就是说,在运算中igne类可以准确地表示任何大小的整数值而不会丢失信息。
在BigIneger类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数最大公约数以及判断是否为质数等操作。
使用BigInteger 类,可以实例化一个BigInteger 对象,并自动调用相应的构造函数。Biglnteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
例如,将2转换为BigInteger类型,可以使用以下语句进行初始化操作:
Biginteger twolnstance=new BigInteger("2")
下面列举了 Biginteger类中常用的几种运算方法
取
spublic BigInteger add(BigInteger val):做加法运算。
s publie Biglnteger subtract(BigInteger val):做减法运算。
public Biginteger multiply(BigInteger val):做乘法运算
public Biginteger divide(BigInteger val):做除法运算。
3publ Biginteger remainder(BigInteger val):做取余操作。
public Biginteger[] divideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数。
public BigInteger powint exponent):进行取参数的 exponent 次方操作。
public BigInteger negateO:取相反数。
public BigIntegershifLef(intn):将数字左移n位,如果为负n数,做右操作
public BigInteger shifRight(int n):将数字右移n位,如果n为负数,做左移操作
public BigInteger and(BigInteger val):做与操作。
public BigInteger or BigInteger val):做或操作。
public int compareTo(BigInteger val):做数字比较操作。
public boolean equals(Object x): 当参数x是BigInteger 类型的数字并且数值与对象实例的数佳
相等时,返回true。
public BigInteger min(BigInteger val):返回较小的数值。
public BigInteger max(BigInteger val):返回较大的数值。
package 第十一章常用类库;
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
BigInteger b1=new BigInteger("987654321987654321");//第1个大数字
BigInteger b2=new BigInteger("123456789123456789");//第2个大数字
System.out.println("加法操作:"+b1.add(b2));//加法运算
System.out.println("减法操作:"+b1.subtract(b2));//减法运算
System.out.println("乘法操作:"+b1.multiply(b2));//乘法运算
System.out.println("除法操作:"+b1.divide(b2));//除法运算
System.out.println("取商:"+b1.divideAndRemainder(b2)[0]);//取商运算
System.out.println("取余数:"+b1.divideAndRemainder(b2)[1]);//取余运算
System.out.println("取余数:"+b1.pow(2));//2次方运算
System.out.println("取相反数操作:"+b1.negate());//相反数运算
}
}
11.2.5BigDecimal类
Decimal 类和BigInteer能实现大字的算不同的是BigDecimal类加入了小数的概念般的 float 型和 double型数据用来做科学计算或工程计算,但由于在商业计算中要求数字精比较高,所以要用到BigDecimal 类。igDecimal支持何精度的定点数,可以用它来精确计算货值。在BigDecimal类中,常用的两个构造方法如表 11.8所示。
构造方法 | 功能说明 |
BigDecimal(double val) | 实例化时将双精度浮点型转换为BigDecimal类型 |
BigDecimal(String val) | 实例化时将字符串形式转换为BigDecimal类型 |
表11.8BigDecimal类
BigDecimal类型的数字可以用来做超大的浮点数的运算,如假、减、乘、除等。但是在所有运算中除法是最复杂的,因为在除不尽的情况下小数点后的末尾的处理需要考虑BigDecimal类实现的加、减、乘、除的方法如表所示
表11.9BigDecimal类实现的加、减、乘、除的方法
在上述方法中 BigDecimal类中divaude()方法有多种设置用于返回商小数点后的末尾的处理这些模式的名称与含义如表11.10所示
方法 | 功能说明 |
add(BigDecimal augend) | 做加法操作 |
subtract(BigDecimal subtrahend) | 做减法操作 |
multiply(BigDecimal multiplicand) | 做乘法操作 |
divide(BigDecimal divisorint scale,RoundingModeroundingMode) | 做除法操作,方法中3个参数分别代表除数、商的小数点后的位 数、 近似处理模式 |
表11.10BigDecimal类中divaide()方法多种处理模式
模式 | 含义 |
RoundingMode.UP | 商的最后一位如果大于 0,则向前进位,正负数都如此 |
RoundingMode.DOWN | 商的最后一位无论是什么数字都省略 |
RoundingMode.CEILING | 商如果是正数,按照UP式理;如果是负数,按照DOWN模式处理。这种模式的处理都会使近似值大于等于实际值 |
RoundingMode.FLOOR | 与CEILING模式相反,商如果是正数,按照 DOWN模式处理;商如果是负数,则按照UP模式处理。这种模式的处理都会使近似值小于等于实际值 |
RoundingMode.HALF_DOWN | 对商进行四舍五入操作,如果商最后一位小于等于5,则做舍弃操作;如果最后一位大于5,则做进位操作,如 7.5~7 |
RoundingMode.HALF_UP | 对商进行四舍五入操作,如果商的最后一位小于5则舍弃;如果大于等于5,进行进位操作,如 7.5~8 |
RoundingMode.HALF_EVEN | 如果商的倒数第二位为奇数,则按照 HALF_UP模式处理;如果为偶数,则按照HALF DOWN模式处理,如7.5~8,8.5~8 |
package 第十一章常用类库;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
BigDecimal b1=new BigDecimal("0.00987654321987654321");//第1个大小数
BigDecimal b2=new BigDecimal("0.00123456789123456789");//第2个大小数
System.out.println("两个数字相加的结果:"+b1.add(b2));//加法运算
System.out.println("两个数字相减的结果:"+b1.subtract(b2));//减法运算
System.out.println("两个数字相乘的结果:"+b1.multiply(b2));//乘法运算
//除法运算,商小数点后保留9位,并将结果进行四舍五入操作
System.out.println("两个数字相除的结果:"+b1.divide(b2,9,RoundingMode.HALF_UP));
}
}
11.3System类
SystemD统,用final修饰的,所以不允许被继承。System 类提供了很多系统层面的操作方法,并且这些方法全部都是静态的。System 类提供的较常用方法如表11.11 所示。本节重点讲解利用 System类控制台输出和计时这两个操作。
11.11System类提供的常用方法
方法 | 功能描述 |
currentTimeMillis() | 返回以毫秒为单位的当前时间 |
exit(int status) | 通过启动虚拟机的关闭序列,终止当前正在运行的Java虚拟机。此方法从不正常返回。 可以将变量作为一个状态码。根据惯例,非零的状态码表示非正常终止;0表示正常 终止 |
Map |
返回一个不能修改的当前系统环境的字符串映射视图 |
getenv(String name) | 获取指定的环境变量值 |
getPropertiesO | 确定当前的系统属性 |
getProperty(String key) | 获取用指定键描述的系统属性 |
setIn(InputStream in) | 重新分配“标准”输入流 |
11.3.1控制台输出字符
System类提供标准输入标准输出和错误输出流,也就是说,System类提供了3个静态对 out和enr。书中的代码多次使用了这些对象,最常见的就是 out 对象。在控制台输出字符串,出的方法有两种,下面分别进行讲解。
1.不会自动换行的print()方法 printO方法的语法如下:
System.out.print("Hello!");
此方法输出“Hello”文字,输出完毕后,光标会停留在“Hello”文字末尾,不会自动换行。
2.可以自动换行的printin()方法
printInO方法在print后面加上了“ln”后缀(就是line的简写),
语法如下: System.out.printin(“书籍是人类进步的阶梯!");
Java 语法 | 运行结果 | Java语法 | 运行结果 |
System.out.print("左"); System.out.print("中"); System.out.print("右"); |
左中右 | System.out.println("上"); System.out.println("中"); System.out.println("下"); |
上 中 下 |
此方法输出“书籍是人类进步的阶梯!”后会自动换行。光标停留在下一行的开头。 print()方法与println()方法输出的对比效果如表 11.12所示
表11.12两种输出方法的效果比较
综上所述,java输出换行的方法有以下两种
System.out.print("\n")//利用换行符\n实现换行
System.out.println()//空参数即可实现换行
11.3.2计时
System.currentTimeMillis()方法可以获取字1970年1月1日零点至今的毫秒数,虽然Date日期类也有类似的方法,但代码会System类多,所以System.currentTimeMillis()方法是为获取当前的毫秒数,最常用的方法是应为该方法的返回值精确到毫秒所以可以利用该方法来记录程序的运行时间
package 第十一章常用类库;
public class SystemTimeDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
long start=System.currentTimeMillis();//程序开始记录时间
String str=null;//创建null字符串
for(int i=0;i<10000;i++) {//循环一万次
str+=i;//字符串与循环变量拼接
}
long end=System.currentTimeMillis();//记录循环结束时间
System.out.println("循环用时:"+(end-start)+"毫秒");
}
}
11.4Scanner类
与C语言不同,Java 从台中读出用户输入的值,用的不是一行可以直接使用的代码,而是由一个叫 Scanner 来现canner英文译就是扫描仪,它的用途就和现实生活的扫描仪一可以把数字化信息流转为人类可识别的文字。控制台输出内容用到了 System.out 就表示向控制台输 System.in 表示从控制台输入,让 Scanner 扫描 System.in 就可以获取用户输入的值了使用Scanner类首先要引入该类,其语法如下:
import java.util.Scanner; //引入Scanner类
canner提供11.13种常用的方法,通过这些方法可以获取控制台中输入的不类型的值
表11.13Scanner类的几个常用方法
方法名 | 返回类型 | 功能说明 | 方法名 | 返回类型 | 功能说明 |
next() | String | 查找并返回此扫描器获取的下一个完整标记 | nextInt() | int | 扫描一个值返回int类型 |
nextBoolean() | boolean | 扫描一个布尔值标记并达返回 | nextLine() | String | 扫描一个值返回 String类型 |
nextBtye() | byte | 扫描一个值返回 byte类型 | nextShort() | short | 扫描一个值返回short类型 |
nextFloat() | double | 扫描一个值返回double类型 | nextShort() | short | 扫描一个值返回short类型 |
nextFloatO | float | 扫描一个值返回float类型 | close() | void | 关闭此扫描器 |
使用Scanner类扫描台的代码图下;
Scanner sc=new Scanner(System.in)
Scanner.in表示控制台输入流在创建Scanner对象时把System.out.println作为参数,这样创建出的扫描对象的目标就是用户在控制台中输入的内容,在通过表11.13中列出的方法将用户输入的内容转为java的数据类型就可以对数据进行加工显示了
package 第十一章常用类库;
import java.util.Random;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Random r=new Random();//随机数对象
int num=r.nextInt(100);//从1~99取值
int input=-1;//记录用户输入的值
Scanner sc=new Scanner(System.in);
while(true) {
System.out.println("猜一猜随机数是多少?");
input=sc.nextInt();
if(input>num) {
System.out.println("你猜的数字大了!");
}else if(input
11.5日期时间类
在程序开发中,经常需要处理日期时间,java中提供了专门的日期时间类来处理类来处理相应的问题,本节将对java中的日期时间类进行详细讲解
11.5.1Date类
构造方法 | 说 明 |
Date() | 分配Date对象并初始化此对象,以表示分 配它的时间(精确到毫秒) |
Date(long date) | 分配Date对象并初始化此对象,以表示自标准基准时间(即1970年1月1日00:00:00GMT)起经过指定毫秒数date后的时间 |
Date,用造建对,其构造法其明如表 11.14所示。
表11.14 Date类的构造方法及其说明
例如,使用Date类的第2种构造方法创建一个 Date 类的对象,代码如下:
long timeMillis=System.currentTimeMillis(): //当前系统时间所经历的毫秒数
Date date=new Date(timeMillis):
上述代码中的 System 类的curenTimeMilis法要用来获取当前系统时间距标准基准时间的数。另外,这里需要注意的是,创建 Date 对象时使用的是 long 型整数,而不是 double型,这主
型可能会损失精度。Date 类的常用方法及其说明如表11.15所示。
方法 | 说明 |
after(Date when) | 测试当前日期是否在指定的日期之后 |
before(Date when) | 测试当前日期是否在指定的日期之前 |
getTime() | 获得自1970年1月1日00:00 0:00 GMT 开始到现在所经过的毫秒数 |
setTime(long time) | 设置当前Date对象所表示的日期时间值,该值用以表示1970年1月1日 00:00:00GMT以后time毫秒的时间点 |
表11.15Date类的常用方法以及说明
package 第十一章常用类库;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Date date=new Date();
long value=date.getTime();
System.out.println("日期:"+date);
System.out.println("到现在所经历的毫秒数为:"+value);
}
}
11.5.2日期时间格式化
如果在村序中直接输出Datc 对象,示的是“Mon Feb 29 17:39:50 CST 2016”这种格式的日m间,何其显示为2016-02-29或者173950这样的日期时间格式呢?Java中提做Danefort类来实现类似的功能,
Datefocmat类是日期时间格式化子类的抽象类,可以按照指定的格式对日期或时间进行格式化
Datefarmat类提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期计 F化包HORTMEDIUMLONG和FULL4种:
E SHORT:完全为数字,如 12.13.52或3:30pm
MEDIUM:较长,如Jan121952
Z LONG:更长,如January12,1952或3:30:32pm
ZFULL:完全指定,如Tuesday、April 12、1952AD或3:30:42pm PST.
另外,使用DaeFormat类还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期,首先需要创建 Daeeformat类的一个对象,由于它是抽象类,因此可以使用其静态方法getDateInstance(进行创建,语法如下:
Dadsfomat df =DateFormat.getDameInstance();
使用getDaeinstance()方法获取的是所在国家或地区的标准日期格式。另外,DateFormat类还提供了一些其他静态方注。例如,使用getTimeInstance()方法可获取所在国家或地区的时间格式,使用 geDaeTimelnsance()方法可获取日期和时间格式。DateFormat类的常用方法及其说明如表11.16所示
表11.16DateFormat类的常用方法及其说明
方法 | 说明 |
format(Date date) | 将一个Date 对 象实例格式化为日期/时间字符串 |
getCalendar() | 获取与此日期/时 时间格式器关联的日历 |
getDateInstance() | 获取日期格式器 该格式器具有默认语言环境的默认格式化风格 |
getDateTimeInstance() | 获取日期/时间格 式器,该格式器具有默认语言环境的默认格式化风格 |
getInstance() | 获取为日期和时间使用 SHORT风格的默认日期/时间格式器 |
getTimeInstance() | 获取时间格式器,该格式器具有默认语言环境的默认格式化风格 |
parse(String source) | 将字符串解析成一个日期,并返回这个日期的 Date 对象 |
例如,将当前日期按照DateFormat类默认格式输出
: DateFormat df =DateFormat.getinstance();
System.out.printin(df.format(new Date()));
结果如下:
2021/2/19 上午 9:59
输出长类型格式的当前时间:
DateFormat df =DateFormat.getTimeInstance(DateFormat.LONG);
System.out.printin(df.format(new Date()));
结果如下
CST 上午10:00:33
输出长类型格式的当前日期:
DateFormat df =DateFormat.getDatelnstance(DateFormat.LONG); System.out.printin(df.format(new Date()));
结果如下:
2021年2月19日
输出长类型格式的当前日期和时间:
DateFormat df=DateFormatgetDateTimeInstance(DateFormat.LONGDateFormat.LONG); System.out.println(dfformat(new Date()));
结果如下:
2021年2月19号 CST上午10:01:12
由于 DateFormat一抽象类,能用new创建实例对象。因此,除了使用getXXXInstanceO方法创建其对象,还可以使用其子类,如 SimpleDateFormat 类,该类是一个以与语言环境相关的方来格式化和分析日期的具体类,它允许进行格式化(日期一文本)、分析(文本→日期)和规范化。
SimpleDateFormat类提供了19个格式化字符,可以让开发者随意编写日期格式,这19个格式字符如表11.17所示。
字母 | 日期或时间元素 | 类型 | 示例 |
G | Era 标志符 | Text | AD |
y | 年 | Year | 1996; 96 |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm标记 | Text | PM |
H | 一天中的小时数(0~23) | Number | 0 |
h | am/pm中的小时数(1~12) | Number | 12 |
k | 一天中的小时数(1~24) | Number | 24 |
K | am/pm中的小时数(0~11) | Number | 0 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -800 |
表11.17SimpleDateFormat
通常表11.17 中的字符出现的数量会影响数字的格式。例如,yyyy表示4位年份,这样输入会显示2021:y表示,这样输入会显示为21:只有一个y的话,会按照yyyy显示;如果超过 y,如yyyyyy,会在4位年份左侧补0,结果为02021常的日期时间格式如表11.18
表11.18常用时间格式
日期时间 | 对应的格式 |
2021/10/25 | yyyy/MM/dd |
2021.10.25 | yyyy.MM.dd |
2021-09-15 13:30:25 | yyyy-MM-dd HHmm:ss |
2021年10月24日0时25分07秒星期日 | yyyy年MM月dd日HH时mm分ss秒EEEE |
下午3时 | ah 时 |
今年已经过去了297天 | 今年已经过去了D天 |
package 第十一章常用类库;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日EEEEHH时mm分ss秒");
System.out.print("各位观众大家好,现在是");
System.out.print(df.format(new Date()));
System.out.print(",欢迎收看新闻");
}
}
11.5.3Calendar类
打开JavaAPI档看javauilDate提供的大部分法都已经过时了,因为Date类设切没有考虑到国际化,而且很多方法也不能满足用户需求,比如需要获取指定时间的年月日时息,或者想要对日期时间进行加减运算等复杂的操作,Date 类已经不能胜任,因此JDK 提供了新的时间处理类--Calendar日历类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF MONTHHOU日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。该类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protecte Calendar提供了一个类方法 getInstanceO,以获得此类型的一个通用的对象。Calendar getInstanceO方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化,其使用方法如 Calendar rightNow=Calendar.getinstance();
说明
由于 Calendar 类是一个抽象类,不能用 new 创建实例对象,因此除了使用getInstance(方法创建其对象,如果需要创建其对象,必须使用其子类,
如 GregorianCalendar 类字段及其说明如表11.19所示。
字段名 | 说明 |
DATE | get 和 set 的字段数字,指示一个月中的某天 |
DAY_OF_MONTH | get 和 set 的字段数字,指示一个月中的某天 |
DAY_OF_WEEK | get 和 set 的字段数字,指示一个星期中的某天 |
DAY_OF_WEEK IN MONTH | get和set的字段 数字,指示当前月中的第几个星期 |
DAY_OF_YEAR | get 和 set 的字段 数字,指示当前年中的天数 |
HOUR | get 和 set 的字段 数字,指示上午或下午的小时 |
HOUR_OF_DAY | get和set的字段 数字,指示一天中的小时 |
MILLISECOND | get和set的字段类 数字,指示一秒中的毫秒 |
MINUTE | get 和 set 的字段 数字,指示一小时中的分钟 |
MONTH | 指示月份的get和 set的字段数字 |
SECOND | get 和 set 的字段类 数字,指示一分钟中的秒 |
time | 日历的当前设置时时间,以毫秒为单位,表示自格林威治标准时间1970年1月1日0:00:00后经过的时间 |
WEEK_OF_MONTH | get 和 set 的字段数 数字,指示当前月中的星期数 |
WEEK_OF_YEAR | get和set的字段数 数字,指示当前年中的星期数 |
YEAR | 指示年的 get 和 set的字段数字 |
表11.19Calendar类提供的常用字段及其说明
方法 | 说明 |
add(int field, int amount) | 根据日历的规则,为给定的日历字段添加或减去指定的时间量 |
after(Object when) | 判断此Calendar示时间是否指定Object表示时间之后,回判断结果判断此 |
before(Object when) | 判断此Calendar示时间是否指定Object表示时间之后,回判断结果判断此 |
get(int field) | 返回给定日历字段的值 |
getInstance() | 使用默认时区和语言环境获得一个日历 |
getTime() | 返回一个表示此Calendar对时间值从现在的毫秒偏移量)的Date 对象 |
getTimeInMillis() | 返回此 Calendar 对象的时间值,以毫秒为单位 |
roll(int field,boolean up) | 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
set(int field, int value) | 将给定的日历字段设置为给定值 |
set(int year, int month, int date) | 设置日历字段YEAR、MONTH和DAY_OF_MONTH 的值 |
set(int year, int month int date. int hourOfDay, int minute) | 设置日历字段YEAR、MONTH、DAY_OF_MONTHHOUR_OF DAY和MINUTE的值 |
set(int year. int month. int date. int hourOfDay, int minute, int second) | 设置字段YEAR、MONTH、DAY OF MONTHHOUR、MINUTE和SECOND的值 |
setTime(Date date) | 使用给定的Date 对象设置此Calendar对象的时间 |
setTimeInMillis(long millis) | 用给定的long 值设置此Calendar对象的当前时间值 |
表11.20Calendar类提供的常用方法及其说明
package 第十一章常用类库;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CountDown {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("————中华人民共和国成立100周年倒计时————");
Date date = new Date();
//创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyy年MM月dd日");
//调用format方法,格式化时间,转换为指定格式
String today=simpleDateFormat.format(date);
System.out.println("今天是"+today); //输出当前日期
//获取自1970年1月1日至当前时间所经过的毫秒数
long time1=date.getTime();
//使用默认时区和语言环境获得一个日历calendar
Calendar calendar=Calendar.getInstance();
//设置日历calendar中的年,月和日的值。因为月份是从0开始计算的,所以这里要减一
calendar.set(2049,10-1,1);
//计算自1970年1月1日至2049年10月1日所经过的毫秒数
long time2=calendar.getTimeInMillis();
//计算2049年10月1日距离当前时间相差的天数
long day=(time2-time1)/(1000*60*60*24);
System.out.println("距离2049年10月1日还有"+day+"天!");
}
}
最后对Calendar类的使用做出几点总结:
cset(CalendarDAY_OFMONH)获取的是上个月的最后一天,所以调用前需要将月份往后
加一个月。
CalendarMONTH的第一个月使用0记录的,所以在获得月份数字后要加1。44年和日是从开始记录的,不需要加1。
CalendarDAY_OF_WEEK 的第一天是周日,周一是第二天,周六是最后一天。
11.6Runtime类
Runtime 类是JDK提供的运行时类,该类为Java程序提供了与当前运行环境相连接的一个通道, Java 程序可以利用该类对当前的运行环境执行一些简单的操作。Runtime类不能使用 new关键字创建
实例,只能通过Runtime.getRuntime()方法获取实例。 制台
Runtime类的常用方法如表11.21所示,本节将重点讲解利用Runtime类执行本地命令和查看Java虚拟机所占内存这两个操作。
方法 | 功能描述 |
getRuntime() | 区回与当前Java应用程序相关的运行时对象 返 |
exec(String command) | 在单独的进程中执行指定的字符串命令 |
exec(String[] cmdarray) | 在单独的进程中执行指定命令和指令参数 |
totalMemory() | 返回Java虚拟机中的内存总量 |
freeMemory() | 返回Java虚拟机中的空闲内存量 |
load(String filename) | 加载作为动态库的指定文件名 |
loadLibrary(String libname) | 加载具有指定库名的动态库 |
表11.21Runtime类的常用方法
11.6.1 执行本地命令
本地命令指的是操作系统的命令。例如,在Linux系统下就表示shell命令,在Windows系统下
表示cmd命令。
Runtime 类提供 execO方法让Java 代码可以执行系统的命令,execO方法有很多重载的形式,例如。
Process exec(String command)
Process exec(Stringlcmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
其实这两个重载方式很类似,如执行“javac hello.java”这行命令,使用第一种重载方式的代码如下:
Runtime.getRuntime().exec("javac hello.java");
使用第二种重载方式的代码如下:
String command[={"javac","hello.java" };
Runtime.getRuntime().exec(command);
exec()方法会返回一个 Process 对象。Process类是Java 中进程类,该类是抽象类,不能使用new
返回的信息。
关键字创建实例。Process 类的常用方法如表 11.22所示,开发可以使用getInputStream()方法获取进程返回的信息
11.22[rpcess类的常用的方法
方法 | 功能描述 | 方法 | 功能描述 |
destroy() | 结束进程 | getInoutStream() | 获取进程的输入流 |
getErrorStram() | 获取进程的错误流 | getOutputStream() | 获取进程的输入流 |
例题11.19让java 程序执行Windows系统的help命令
package 第十一章常用类库;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class RuntimeExecDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Runtime r=Runtime.getRuntime();//获取本地Runtime
try {
Process p=r.exec("help");//执行help命令,获取进程对象
InputStream is=p.getInputStream();//获取进程的字节输入流
//将字节输入流转换为字符输入流
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;//创建null字符串
while((str=br.readLine())!=null) {//如果字符流中可以获取非控内容
System.out.println(str);//打印获取的内容
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
11.6.2查看内存
Runtime 类可以通过freeMemory0方法查看当前 Java虚拟机可用内存的剩余量。如果程序能够实时监控内存剩余量,就可以尽量控制程序对内存的占用,从而避免出现“内存溢出”的情况。同样,也可以用来对测试程序性能,检验程序算法是否导致内存紧张
例题11.20监控虚拟机内存使用
package 第十一章常用类库;
public class MemoryDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Runtime r=Runtime.getRuntime();//获取本地Runtime对象
Integer ints[]=new Integer[10000];//创建长度为10000的整型数组
long before=r.freeMemory();//获取当前空闲内存数
System.out.println("赋值前空闲内存字节数:"+before);
for(int i=0,length=ints.length;i