11.1:包 把基本数据类型转换为对象进行处理,java中的包装类及其对应的基本数据类型如表11.1所示
11.1.1 Integer类
integer类在对象中包装了一个基本数据类型int的值,该类的对象包含了一个int类型的字段。此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法,integer类的常用方法如表11.2所示
public class IntergerDaemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = Integer.parseInt("456"); //将字符串转换为int类型
Integer iNum = Integer.valueOf("456"); //创建一个intefer对象
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);
}
}
//例题11.1
11.1.2 Double类
double类在对象中包装一个基本类型为double的值,每个double类的对象都包含一个double类型的字段。此外,该类还提供多个方法,可以将double类型转换为String类型,将String类型转换为double类型,也提供其他一些处理double类型时有用的常量方法。double类的常用方法如表11.3所示
public class DoubleDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Double dNum =Double.valueOf("3.14");
//判断是否为非数字值
System.out.println("3.14是否为非数字值:"+Double.isNaN(dNum.doubleValue()));
System.out.println("3.14转换为int的值为"+dNum.intValue());//转换为int类型
//判断大小
System.out.println("值为3.14的Double对象与3.14的比较"+dNum.equals(3.14));
//转换为十六进制
System.out.println("3.14转换为十六进制为:"+Double.toHexString(dNum));
}
}
//例题11.3
11.1.3 Boolean类
Boolean类将基本类型为boolean的值包装在一个对象中。一个Boolean类型的对象只包含一个类型为boolean的字段,此外,此类还为Boolean类和Stringl类型的相互转换提供了许多方法。并提供处理boolean类型时非常有用的其他一些常量方法。boolean类的常用方法如表11.4所示
public class BooleanDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Boolean b1 =Boolean.valueOf("true"); //创建Boolean对象
Boolean b2 =Boolean.valueOf("ok");
System.out.println("b1:"+b1.booleanValue());
System.out.println("b2:"+b2.booleanValue());
}
}
11.1.4 Characte
Characte在对象中包装一个基本类型为char的值,该类提供了多种方法以确定字符的类别(小写字母数字等),并可以很方便的将字符从大写转换为小写,反之亦然。Characte提供了很多方法来完成对字符的操作。常用的方法,如表11.5所示。
public class UpperOrLower {
public static void main(String[] args) {
// TODO Auto-generated method stub
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(mychar1+"是小写字母");
//转换为大写字母输出
System.out.println("转换为小写字母的结果:"+Character.toUpperCase(mychar2));
}
}
}//例题11.5
11.1.5 Number类
返回数值
前面介绍了Java 中的包装类,对于数值型的包装类,它们有一个共同的父类——number类。该类是一个抽象类,它是Byte Integer Short Long Float和Double类的父类,其子类必须提供j将表示的数值转换为byte, Int short,long float和double的方法。例如double value()方法返回双精度浮点值float value()方法返回单精度浮点值。这些方法如表11.6所示。
import java.text.DecimalFormat;
public class DecimalFormatSimpleDemo {
//使用实例化对象时设置格式
static public void SimgleFormat(String pattern,double value) {
DecimalFormat myFormat =new DecimalFormat(pattern);
String output =myFormat.format(value);
System.out.println(value+""+pattern+""+output);
}
//使用applyPattern()方法对数字进行格式化
static public void UseApplyPatternMethodFormat(String pattern,double value) {
DecimalFormat myFormat =new DecimalFormat();
myFormat.applyPattern(pattern);
System.out.println(value+""+pattern+""+myFormat.format(value));
}
public static void main(String[] args) {
SimgleFormat("###,###,###",123456.789);
SimgleFormat("00000000.###",123456.789);
//按照格式化模板格式化数字,不存在的位以0显示
SimgleFormat("000000.000",123.78);
//调用静态 UseApplyPatternMethodFormat()方法
UseApplyPatternMethodFormat("#.###%", 00.789);
UseApplyPatternMethodFormat("###.##", 123456.789);
UseApplyPatternMethodFormat("0.00\u2030", 0.789);
}
}
//例题11.6
11.2:数字处理
11.2.1数字化格式
DecimalFormat类
数字化格式化在解决实际问题时应用非常普遍,如表示某超市的商品价格需要保留两位有效数字。数字格式化操作主要针对的是浮点型数据,包括double型和float型数据。在Java中使用Java.test Decimal format格式化数字。本节将着重讲解Decimal format类在Java中。没有格式化的数据将遵循以下原则:
1.如果数据绝对值大于0.001并且小于10000000,使以常规小数形式表示
2.如果数据绝对值小于0.001并且小于10000000,使用科学计数法表示
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在Java中可以使用decimal format类进行格式化操作。decimal format类是number format的一个子类,用于格式化十进制数字。它也可以将一些数字格式化为整数,浮点数,百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的。精度一般情况下,可以在实例化decimal format对象时传递数字格式,也可以通过decimal format类中的apply Parttner()方法来实现数字格式化。当格式化数字时。可在的decimal format类中使用一些特殊字符构成一个格式化模板,使数字按照一定的殊字符规则进行匹配。表11.7列举了格式化模板中的特殊字符及其所代表的含义。
import java.text.DecimalFormat;
public class DecimalFormatSimpleDemo {
//使用实例化对象时设置格式
static public void SimgleFormat(String pattern,double value) {
DecimalFormat myFormat =new DecimalFormat(pattern);
String output =myFormat.format(value);
System.out.println(value+""+pattern+""+output);
}
//使用applyPattern()方法对数字进行格式化
static public void UseApplyPatternMethodFormat(String pattern,double value) {
DecimalFormat myFormat =new DecimalFormat();
myFormat.applyPattern(pattern);
System.out.println(value+""+pattern+""+myFormat.format(value));
}
public static void main(String[] args) {
SimgleFormat("###,###,###",123456.789);
SimgleFormat("00000000.###",123456.789);
//按照格式化模板格式化数字,不存在的位以0显示
SimgleFormat("000000.000",123.78);
//调用静态 UseApplyPatternMethodFormat()方法
UseApplyPatternMethodFormat("#.###%", 00.789);
UseApplyPatternMethodFormat("###.##", 123456.789);
UseApplyPatternMethodFormat("0.00\u2030", 0.789);
}
}
//例题11.6
11.2.2Math类
math类提供了众多数学函数方法,主要包括三角函数方法指数函数方法取整函数方法取最大值最小值以及平均值函数方法。这些方法都被定义为static形式,所以在程序应用中比较简便,可以使用如下形式调用。
1三角函数
public class TrigonometricFunction {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("90度的正弦值为:"+Math.sin(Math.PI/2));
System.out.println("0度的余弦值:"+Math.cos(0));
System.out.println("90度的正弦值为:"+Math.tan(Math.PI/3));
//取2的平方根与2商的反正弦
System.out.println("取2的平方根与2商的反正弦"+Math.asin(Math.sqrt(2)/2));
//取2的平方根与2商的反余弦
System.out.println("取2的平方根与2商的反余弦"+Math.asin(Math.sqrt(2)/2));
System.out.println("1的反正切值"+Math.atan(1));
System.out.println("120度的弧度制"+Math.toRadians(120.0));
System.out.println("Π/2的角度值"+Math.toDegrees(Math.PI/2));
}
}
//例题11.7
2.指数函数
public class ExceponentFunction {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("e的平方值"+Math.exp(2));
System.out.println("以e为底的2的对数值"+Math.log(2));
System.out.println("以10为底2的对数值"+Math.log10(2));
System.out.println("4的平方根值"+Math.sqrt(4));
System.out.println("8的立方根值"+Math.cbrt(8));
System.out.println("2的2次方值"+Math.pow(2, 2));
}
}
//例题11.8
3.取整函数
public class IntFunction {
public static void main(String[] args) {
// TODO Auto-generated method stub
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));
}
}
//例题11.9
4.取最大值、最小值、绝对值
11.2.3 Random类
random类是GDP中随机数生成器类,可以通过实例化一个random对象创建一个随机数生成器,语法如下。
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
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.11
11.2.4 BigInteger类
big integer类的数字范围较integer类的数字范围要大得多。前文介绍过,intent类是int的包装类,int的最大值为2的31次方减1,如果要计算更大的数字,使用intent类就无法实现了。所以Java中提供了 big integer类来处理更大的数字。big integral支持任意精度的整数,也就是说,在运算中big integer类可以准确的表示任何大小的整数值而不会丢失信息。在big integer类中封装了多种操作。除了基本的加减乘除,这些操作还提供了绝对值相反数最大公约数以及判断是否为质数等操作。使用big intent类可以实例化一个对象,并自动调用相应的构造函数。 big integer具有更多构造函数,但是最直接的一种方式是参数以字符串形式代表要处理的数字。
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger b1 =new BigInteger("987654321987654321");
BigInteger b2 =new BigInteger("123456789123456789");
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("做2次方操作:"+b1.pow(2));
System.out.println("取相反数操作:"+b1.negate());
}
}
//例题11.12
11.2.5 BigDecimal类
big December类和big integer 类都能实现大数字的运算。不同的是,big December类加入了小数的概念,一般的float型和double型数据只可以用来做科学计算或者工程计算,但由于在商业计算中要求数字精度比较高,所以要用到big decimal类。bigdecimal支持任何精度的定点数,可以用它来精确计算货币值。在big decimal类中常用的两个构造方法,如表11.8所示。
Big decimal类型的数字可以用来做超大的浮点数的运算,如加减乘除等。但是在所有的运算中,除法是最复杂的,因为在除不尽的情况下,商小数点后的末位的处理是需要考虑的。big December类的实现的加减乘除的方法,如表11.9所示。
在上述方法中,big Decimal类中的divide()方法有多种设置,用于返回商小数点后的末位处理。这些模式的名称与含义如表11点10所示。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//11.2.4 BigDecimal
BigDecimal b1=new BigDecimal("0.728382834535");
BigDecimal b2=new BigDecimal("0.00045353");
System.out.println("两个数字相加结果:"+b1.add(b2));
System.out.println("两个数字相减结果:"+b1.subtract(b2));
System.out.println("两个数字相乘结果:"+b1.multiply(b2));
//除法运算,商小数点后保留9位,并将结果进行四舍五入操作
System.out.println("两个数字相除,保留小数点后9位:"+b1.divide(b2,9,RoundingMode.HALF_UP));
}
}
//例题11.13
11.3System类
system 类是jdk中提供的系统类,该类用final修饰的,所以不允许被继承。system类提供了很多系统层面的操作方法,并且这些方法全部都是静态的。system类提供的较常用方法,如表11点11所示。本节重点讲解利用system 类控制台输出和计时这两个操作。
11.3.1:控制台输出字符
system 类提供了标准输入标准输出的和错误输出流。也就是说,system类提供了三个静态对象,in out和err。本书中的代码多次使用了这些对象。最常见的是out对象。在控制台输出字符串输出的字符有两种:
1.会自动换行
2.不会自动换行
print方法与println方法输出的对比效果如表11.12所示。
11.3.2:计时
public class SystemTimeDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
long start = System.currentTimeMillis();//程序开始时间
String str =null;//创建null字符串
for(int i=0;i<10000;i++) { //循环10000次
str+=i;//字符串与循环变量拼接
}
long end = System.currentTimeMillis();
System.out.println("循环用时:"+(end-start)+"毫秒");//记录循环时间
}
}
//例题11.14
11.4:Scanner类
与c语言不同,java从控制台中读取用户输入的值,用到的不是一行可以直接使用的代码,而是由一个叫Scanner的类来实现的。Scanner类提供了如表11.13所示的几种常用的方法。
import java.util.Random;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Random r = new Random();
int num =r.nextInt(100);
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<num) {
System.out.println("你输入的数字小了!");
}else if(input==num) {
break;
}else {
System.out.println("你输入的数字有误!");
}
}
System.out.println("恭喜你答对了!");
sc.close();
}
}
//例题11.15
11.5 日期时间类
11.5.1:Date类
date类用于表示日期时间,使用该类表示时间需要使用其构造对象,其构造方法及其说明如表11.14所示。
上述代码System类的currentTimeMi拉力赛()方法主要用来获取当前系统时间距标准时间的毫秒数。另外,这里需要注意的是,创建Date对象时使用的long型整数,而不是double型,这主要是因为double类型可能会损失精度。date类的常用方法及其说明如表11.15所示。
11.5.2 :日期时间格式化
使用GetDateInstance()方法获取的是所在国家或地区的标准日期格式。datefomart类的常用方法及其说明如表11.16所示
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//11.5 Date类
Date d1 =new Date(); //当前时间
System.out.println(d1);
Date d2 = new Date(1692673826189L);
System.out.println(d2);
//判断顺序以及获取毫秒数
System.out.println(d1.after(d2));
System.out.println(d1.before(d2));
System.out.println(d1.getTime());
System.out.println(d1);
d1.setTime(1782927261567L);
System.out.println(d1);
//11.5.2 DateFormat 日期时间格式化
//抽象类不能示例化
//第一种:单纯格式化时间模式
DateFormat df1 = DateFormat.getInstance();
System.out.println(df1.format(d1));
//第二种:获取精准的时间日期
DateFormat df2 = DateFormat.getDateInstance();
System.out.println(df2.format(d1));
DateFormat df3 = DateFormat.getDateTimeInstance();
System.out.println(df3.format(d1));
//书上举例
DateFormat df = DateFormat.getInstance();
System.out.println(df.format(new Date()));//将当前日期按照DateFormat类默认格式输出
//使用他的子类简单实例化
DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(df4.format(new Date()));
}
}
11.5.3:Calendar类
Calendar类提供的常用字段及其说明如表11.19所示
Calendar类提供的常用方法及其说明如表11.20所示
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CountDown {
public static void main(String[] args) {
System.out.println("——————————共和国建立100周年倒计时——————————");
Date date = new Date(); // 当前时间
// 创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年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 + " 天!");
}
}
//例题11.18
11.6:Runtime类
Runtime类的常用方法如表11.21所示
exec()方法会返回一个Proocess对象。就是进程类,process类的常用方法如表11.22所示
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) {
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.19
11.6.2:查看内存
Runtime类可以通过freememory方法查看当前java虚拟机可用内存的剩余量
public class MemoryDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime(); // 获取本地Runtime对象
Integer ints[] = new Integer[10000]; // 创建长度为一万的整型数组
long before = r.freeMemory(); // 获取当前空闲内存数
System.out.println("赋值前空闲内存字节数:" + before);
// 循环为整型数组赋值
for (int i = 0, length = ints.length; i < length; i++) {
ints[i] = i;// 赋值
}
long after = r.freeMemory(); // 获取当前空闲内存数
System.out.println("赋值后空闲内存字节数:" + after);
// 输出数组用掉的内存量
System.out.println("数组用掉的内存字节数:" + (before - after));
}
}
//例题11.20