天天看点

Java Math类 Random类 BigInteger类 BigDecimal类 Date类 DateFormat类 Calendar类

1.Math类概述

•Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

成员变量:

 *         public static final double PI

 *         public static final double E

 * 成员方法:

 *        public static int abs(int a):绝对值

 *        public static double ceil(double a):向上取整

 *        public static double floor(double a):向下取整

 *        public static int max(int a,int b):最大值 (min自学)

 *        public static double pow(double a,double b):a的b次幂

 *        public static double random():随机数 [0.0,1.0)

 *        public static int round(float a) 四舍五入(参数为double的自学)

 *        public static double sqrt(double a):正平方根

package cn.itcast_01;

public class MathDemo {
	public static void main(String[] args) {
		// public static final double PI
		System.out.println("PI:" + Math.PI);//PI:3.141592653589793
		// public static final double E
		System.out.println("E:" + Math.E);//E:2.718281828459045
		System.out.println("--------------");

		// public static int abs(int a):绝对值
		System.out.println("abs:" + Math.abs(10));//abs:10
		System.out.println("abs:" + Math.abs(-10));//abs:10
		System.out.println("--------------");

		// public static double ceil(double a):向上取整
		System.out.println("ceil:" + Math.ceil(12.34));//ceil:13.0
		System.out.println("ceil:" + Math.ceil(12.56));//ceil:13.0
		System.out.println("--------------");

		// public static double floor(double a):向下取整
		System.out.println("floor:" + Math.floor(12.34));//floor:12.0
		System.out.println("floor:" + Math.floor(12.56));//floor:12.0
		System.out.println("--------------");

		// public static int max(int a,int b):最大值
		System.out.println("max:" + Math.max(12, 23));//max:23
		// 需求:我要获取三个数据中的最大值
		// 方法的嵌套调用
		System.out.println("max:" + Math.max(Math.max(12, 23), 18));//max:23
		// 需求:我要获取四个数据中的最大值
		System.out.println("max:"
				+ Math.max(Math.max(12, 78), Math.max(34, 56)));//max:78
		System.out.println("--------------");

		// public static double pow(double a,double b):a的b次幂
		System.out.println("pow:" + Math.pow(2, 3));//pow:8.0
		System.out.println("--------------");

		// public static double random():随机数 [0.0,1.0)
		System.out.println("random:" + Math.random());//random:0.43021608773102227
		// 获取一个1-100之间的随机数
		System.out.println("random:" + ((int) (Math.random() * 100) + 1));//random:90
		System.out.println("--------------");

		// public static int round(float a) 四舍五入
		System.out.println("round:" + Math.round(12.34f));//round:12
		System.out.println("round:" + Math.round(12.56f));//round:13
		System.out.println("--------------");
		
		//public static double sqrt(double a):正平方根
		System.out.println("sqrt:"+Math.sqrt(4));//sqrt:2.0
	}
}
           
  • 如何获取任意范围内的随机数案例

 * 需求:请设计一个方法,可以实现获取任意范围内的随机数。

 *

 * 分析:

 *         A:键盘录入两个数据。

 *             int strat;

 *             int end;

 *         B:想办法获取在start到end之间的随机数

 *             我写一个功能实现这个效果,得到一个随机数。(int)

 *         C:输出这个随机数

package cn.itcast_02;

import java.util.Scanner;

public class MathDemo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入开始数:");
		int start = sc.nextInt();
		System.out.println("请输入结束数:");
		int end = sc.nextInt();

		for (int x = 0; x < 100; x++) {
			// 调用功能
			int num = getRandom(start, end);
			// 输出结果
			System.out.println(num);
		}
	}

	/*
	 * 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end
	 */
	public static int getRandom(int start, int end) {

		int number = (int) (Math.random() * (end - start + 1)) + start;
		return number;
	}
}
           

2.Random类的概述和方法使用

Random:产生随机数的类

 * 构造方法:

 *         public Random():没有给种子,用的是默认种子,是当前时间的毫秒值

 *        public Random(long seed):给出指定的种子

 *

 *        给定种子后,每次得到的随机数是相同的。

 *

 * 成员方法:

 *         public int nextInt():返回的是int范围内的随机数

 *        public int nextInt(int n):返回的是[0,n)范围的内随机数

package cn.itcast_01;

import java.util.Random;

public class RandomDemo {
	public static void main(String[] args) {
		// 创建对象
		// Random r = new Random();
		Random r = new Random(1111);

		for (int x = 0; x < 10; x++) {
			// int num = r.nextInt();
			int num = r.nextInt(100) + 1;
			System.out.println(num);
		}
	}
}
           

3.System类

System

类包含一些有用的类字段和方法。它不能被实例化。在

System

类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。

方法:

 *         public static void gc():运行垃圾回收器。调用

gc

方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速 地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

System.gc()可用于垃圾回收。当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现。

从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。

但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好

package cn.itcast_01;

public class Person {
	private String name;
	private int age;

	public Person() {
		super();
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	@Override
	protected void finalize() throws Throwable {
		System.out.println("当前的对象被回收了" + this);
		super.finalize();
	}

}
           
package cn.itcast_01;

public class SystemDemo {
	public static void main(String[] args) {
		Person p = new Person("赵雅芝", 60);
		System.out.println(p);

		p = null; // 让p不再指定堆内存,就是垃圾了
		System.gc();//自己看输出
	}
}
           

*        public static void exit(int status) 终止当前正在运行的 Java 虚拟机。

 *        public static long currentTimeMillis() 返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

package cn.itcast_02;

public class SystemDemo {
	public static void main(String[] args) {
		// System.out.println("我们喜欢林青霞(东方不败)");
		// System.exit(0);
		// System.out.println("我们也喜欢赵雅芝(白娘子)");

		// System.out.println(System.currentTimeMillis());

		// 单独得到这样的实际目前对我们来说意义不大
		// 那么,它到底有什么作用呢?
		// 要求:请大家给我统计这段程序的运行时间
		long start = System.currentTimeMillis();
		for (int x = 0; x < 100000; x++) {
			System.out.println("hello" + x);
		}
		long end = System.currentTimeMillis();
		System.out.println("共耗时:" + (end - start) + "毫秒");
	}
}
           

 *        public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束

package cn.itcast_03;

import java.util.Arrays;
public class SystemDemo {
	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 11, 22, 33, 44, 55 };
		int[] arr2 = { 6, 7, 8, 9, 10 };

		// 请大家看这个代码的意思
		System.arraycopy(arr, 1, arr2, 2, 2);

		System.out.println(Arrays.toString(arr));//输出 [11, 22, 33, 44, 55]
		System.out.println(Arrays.toString(arr2));//输出[6, 7, 22, 33, 10]
	}
}
           

4.BigInteger的概述和构造方法

BigInteger:可以让超过Integer范围内的数据进行运算

构造方法:

  BigInteger(String val)

package cn.itcast_01;

import java.math.BigInteger;

public class BigIntegerDemo {
	public static void main(String[] args) {
		// 这几个测试,是为了简单超过int范围内,Integer就不能再表示,所以就更谈不上计算了。
		// Integer i = new Integer(100);
		// System.out.println(i);
		// // System.out.println(Integer.MAX_VALUE);
		// Integer ii = new Integer("2147483647");
		// System.out.println(ii);
		// // NumberFormatException
		// Integer iii = new Integer("2147483648");
		// System.out.println(iii);

		// 通过大整数来创建对象
		BigInteger bi = new BigInteger("2147483648");
		System.out.println("bi:" + bi);
	}
}
           

  public BigInteger add(BigInteger val):加

  public BigInteger subtract(BigInteger val):减

  public BigInteger multiply(BigInteger val):乘

  public BigInteger divide(BigInteger val):除

  public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组

package cn.itcast_02;

import java.math.BigInteger;

public class BigIntegerDemo {
		public static void main(String[] args) {
		BigInteger bi1 = new BigInteger("1001");
		BigInteger bi2 = new BigInteger("50");

		// public BigInteger add(BigInteger val):加
		System.out.println("add:" + bi1.add(bi2));//add:1051
		// public BigInteger subtract(BigInteger val):加
		System.out.println("subtract:" + bi1.subtract(bi2));//subtract:951
		// public BigInteger multiply(BigInteger val):加
		System.out.println("multiply:" + bi1.multiply(bi2));//multiply:50050
		// public BigInteger divide(BigInteger val):加
		System.out.println("divide:" + bi1.divide(bi2));//divide:20

		// public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
		BigInteger[] bis = bi1.divideAndRemainder(bi2);
		System.out.println("商:" + bis[0]);//商:20
		System.out.println("余数:" + bis[1]);//余数:1

	}
}
           

5.BigDecimal类概述及其构造方法

由于在运算的时候,float类型和double很容易丢失精度,演示案例。

package cn.itcast_01;

public class BigDecimalDemo {
	public static void main(String[] args) {
		System.out.println(0.09 + 0.01);//0.09999999999999999
		System.out.println(1.0 - 0.32); //0.6799999999999999
		System.out.println(1.015 * 100);//101.49999999999999
		System.out.println(1.301 / 100);//0.013009999999999999

		System.out.println(1.0 - 0.12);//0.88

	}
}
           

结果和我们想的有一点点不一样,这是因为float类型的数据存储和整数不一样导致的。它们大部分的时候,都是带有有效数字位。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal 。

BigDecimal类:不可变的、任意精度的有符号十进制数,可以解决数据丢失问题。

构造方法:

          public BigDecimal(String val)

  public BigDecimal add(BigDecimal augend)

  public BigDecimal subtract(BigDecimal subtrahend)

  public BigDecimal multiply(BigDecimal multiplicand)

  public BigDecimal divide(BigDecimal divisor)

  public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)divisor商,scale最后几位小数,roundingMode如何舍取

package cn.itcast_02;

import java.math.BigDecimal;

public class BigDecimalDemo {
	public static void main(String[] args) {

		BigDecimal bd1 = new BigDecimal("0.09");
		BigDecimal bd2 = new BigDecimal("0.01");
		System.out.println("add:" + bd1.add(bd2));
		System.out.println("-------------------");

		BigDecimal bd3 = new BigDecimal("1.0");
		BigDecimal bd4 = new BigDecimal("0.32");
		System.out.println("subtract:" + bd3.subtract(bd4));
		System.out.println("-------------------");

		BigDecimal bd5 = new BigDecimal("1.015");
		BigDecimal bd6 = new BigDecimal("100");
		System.out.println("multiply:" + bd5.multiply(bd6));
		System.out.println("-------------------");

		BigDecimal bd7 = new BigDecimal("1.301");
		BigDecimal bd8 = new BigDecimal("100");
		System.out.println("divide:" + bd7.divide(bd8));
		System.out.println("divide:"
				+ bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP));
		System.out.println("divide:"
				+ bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP));
	}
}
           

6. Date:表示特定的瞬间,精确到毫秒。

  构造方法:

          Date():根据当前的默认毫秒值创建日期对象

          Date(long date):根据给定的毫秒值创建日期对象

package cn.itcast_01;

public class DateDemo {
	public static void main(String[] args) {
		// 创建对象
		Date d = new Date();
		System.out.println("d:" + d);//d:Mon Aug 27 18:43:55 CST 2018

		// 创建对象
		long time = 1000 * 60 * 60; // 1小时
		Date d2 = new Date(time);
		System.out.println("d2:" + d2);//d2:Thu Jan 01 09:00:00 CST 1970
		
		long time1 = System.currentTimeMillis();
		Date d3 = new Date(time1);
		System.out.println("d3:" + d3);//d3:Mon Aug 27 18:45:25 CST 2018
	}
}
           

public long getTime():获取时间,以毫秒为单位,有它 System.currentTimeMillis()的效果

public void setTime(long time):设置时间

  从Date得到一个毫秒值

          getTime()

  把一个毫秒值转换为Date

          构造方法

          setTime(long time)

package cn.itcast_02;

import java.util.Date;

public class DateDemo {
	public static void main(String[] args) {
		// 创建对象
		Date d = new Date();

		// 获取时间
		long time = d.getTime();
		System.out.println(time);//1535367889403
		System.out.println(System.currentTimeMillis());//1535367889403

		System.out.println("d:" + d);//d:Mon Aug 27 19:04:49 CST 2018
		// 设置时间
		d.setTime(1000);
		System.out.println("d:" + d);//d:Thu Jan 01 08:00:01 CST 1970
	}
}
           

7.DateFormat实现日期和字符串的相互转换

DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat。

SimpleDateFormat的构造方法:

 *         SimpleDateFormat():默认模式

 *         SimpleDateFormat(String pattern):给定的模式

 *             这个模式字符串该如何写呢?

 *             通过查看API,我们就找到了对应的模式

 *             年 y

 *             月 M    

 *             日 d

 *             时 H

 *             分 m

 *             秒 s

 *

 *             2014年12月12日 12:12:12

Date     --     String(格式化)

          public final String format(Date date)

 String -- Date(解析)

          public Date parse(String source)

package cn.itcast_03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatDemo {
	public static void main(String[] args) throws ParseException {
		// Date -- String
		// 创建日期对象
		Date d = new Date();
		// 创建格式化对象
		// SimpleDateFormat sdf = new SimpleDateFormat();
		// 给定模式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		// public final String format(Date date)
		String s = sdf.format(d);
		System.out.println(s);//2018年08月27日 19:16:17
		
		
		//String -- Date
		String str = "2008-08-08 12:12:12";
		//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date dd = sdf2.parse(str);
		System.out.println(dd);//Fri Aug 08 12:12:12 CST 2008
	}
}
           
  •  算一下你来到这个世界多少天?

      分析:

              A:键盘录入你的出生的年月日

              B:把该字符串转换为一个日期

              C:通过该日期得到一个毫秒值

              D:获取当前时间的毫秒值

              E:用D-C得到一个毫秒值

              F:把E的毫秒值转换为年

                  /1000/60/60/24

package cn.itcast_05;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class MyYearOldDemo {
	public static void main(String[] args) throws ParseException {
		// 键盘录入你的出生的年月日
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你的出生年月日:");
		String line = sc.nextLine();

		// 把该字符串转换为一个日期
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = sdf.parse(line);

		// 通过该日期得到一个毫秒值
		long myTime = d.getTime();

		// 获取当前时间的毫秒值
		long nowTime = System.currentTimeMillis();

		// 用D-C得到一个毫秒值
		long time = nowTime - myTime;

		// 把E的毫秒值转换为年
		long day = time / 1000 / 60 / 60 / 24;

		System.out.println("你来到这个世界:" + day + "天");
	}
}
           

8.

lCalendar类概述

•Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。

与其他语言环境敏感类一样,

Calendar

提供了一个类方法

getInstance

,以获得此类型的一个通用的对象。

Calendar

getInstance

方法返回一个

Calendar

对象,其日历字段已由当前日期和时间初始化:

Calendar rightNow = Calendar.getInstance();      
package cn.itcast_01;

import java.util.Calendar;

public class CalendarDemo {
	public static void main(String[] args) {
		// 其日历字段已由当前日期和时间初始化:
		Calendar rightNow = Calendar.getInstance(); // =右边子类对象,左边抽象类

		// 获取年
		int year = rightNow.get(Calendar.YEAR);
		// 获取月
		int month = rightNow.get(Calendar.MONTH);
		// 获取日
		int date = rightNow.get(Calendar.DATE);

		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
	}
}
           

public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。

 public final void set(int year,int month,int date):设置当前日历的年月日

package cn.itcast_02;

import java.util.Calendar;
public class CalendarDemo {
	public static void main(String[] args) {
		// 获取当前的日历时间
		Calendar c = Calendar.getInstance();

		// 获取年
		int year = c.get(Calendar.YEAR);
		// 获取月
		int month = c.get(Calendar.MONTH);
		// 获取日
		int date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month + 1) + "月" + date + "日");

		// // 三年前的今天
		// c.add(Calendar.YEAR, -3);
		// // 获取年
		// year = c.get(Calendar.YEAR);
		// // 获取月
		// month = c.get(Calendar.MONTH);
		// // 获取日
		// date = c.get(Calendar.DATE);
		// System.out.println(year + "年" + (month + 1) + "月" + date + "日");

		// 5年后的10天前
		c.add(Calendar.YEAR, 5);
		c.add(Calendar.DATE, -10);
		// 获取年
		year = c.get(Calendar.YEAR);
		// 获取月
		month = c.get(Calendar.MONTH);
		// 获取日
		date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
		System.out.println("--------------");

		c.set(2011, 11, 11);
		// 获取年
		year = c.get(Calendar.YEAR);
		// 获取月
		month = c.get(Calendar.MONTH);
		// 获取日
		date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
	}
}
           
  • 获取任意一年的二月有多少天

     *

     * 分析:

     *         A:键盘录入任意的年份

     *         B:设置日历对象的年月日

     *             年就是A输入的数据

     *             月是2

     *             日是1

     *         C:把时间往前推一天,就是2月的最后一天

     *         D:获取这一天输出即可

package cn.itcast_03;

import java.util.Calendar;
import java.util.Scanner;
public class CalendarTest {
	public static void main(String[] args) {
		// 键盘录入任意的年份
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = sc.nextInt();

		// 设置日历对象的年月日
		Calendar c = Calendar.getInstance();
		c.set(year, 2, 1); // 其实是这一年的3月1日
		// 把时间往前推一天,就是2月的最后一天
		c.add(Calendar.DATE, -1);

		// 获取这一天输出即可
		System.out.println(c.get(Calendar.DATE));
	}
}