黑马程序员——常用的API之冷门兵器

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

A:BigDecimal

float类型和double的数据存储和整数不一样。它们大部分的时候,都是带有有效数字位。

于是在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,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):商,几位小数,如何舍取
B:BigInteger
BigInteger:可以让超过Integer范围内的数据进行运算
 * 构造方法:
 * BigInteger(String val)
 * 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):返回商和余数的数组

 C: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):正平方根
		// public static double ceil(double a):向上取整
		System.out.println("ceil:" + Math.ceil(12.34));//13
		System.out.println("ceil:" + Math.ceil(12.56));//13
		System.out.println("--------------");

		// public static double floor(double a):向下取整
		System.out.println("floor:" + Math.floor(12.34));//12
		System.out.println("floor:" + Math.floor(12.56));//12
		System.out.println("--------------");
请设计一个方法,可以实现获取任意范围内的随机数
public static int getRandom(int start, int end) {
		// 回想我们讲过的1-100之间的随机数
		// int number = (int) (Math.random() * 100) + 1;
		// int number = (int) (Math.random() * end) + start;
		// 发现有问题了,怎么办呢?
		int number = (int) (Math.random() * (end - start + 1)) + start;
		return number;
D:Random:产生随机数的类
 * 构造方法:
 * 		public Random():没有给种子,用的是默认种子,是当前时间的毫秒值
 *		public Random(long seed):给出指定的种子
 *
 *		给定种子后,每次得到的随机数是相同的。
 *
 * 成员方法:
 * 		public int nextInt():返回的是int范围内的随机数
 *		public int nextInt(int n):返回的是[0,n)范围的内随机数
E:System类包含一些有用的类字段和方法,它不能被实例化。
 * 方法:
 * 		public static void gc():运行垃圾回收器。 
 *		public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。 
 *		public static long currentTimeMillis():返回以毫秒为单位的当前时间
 *		public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
 *				从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置,总共复制length个元素。
数组复制的案例
public class SystemDemo {
	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 11, 22, 33, 44, 55 };
		int[] arr2 = { 6, 7, 8, 9, 10 };
                // 用arr的22,33替换arr2的8,9
		// 从arr数组的第2个元素开始复制到arr2数组的第3个元素,总共复制2个元素。
		System.arraycopy(arr, 1, arr2, 2, 2);

		System.out.println(Arrays.toString(arr));
		System.out.println(Arrays.toString(arr2));
	}
}
F:Date 表示特定的瞬间,精确到毫秒。
 * 构造方法:
 * 		Date():根据当前的默认毫秒值创建日期对象
 * 		Date(long date):根据给定的毫秒值创建日期对象

/* 从Date得到一个毫秒值
 * 		getTime()
 * 把一个毫秒值转换为Date
 * 		构造方法
 * 		setTime(long time)
 */

G:DateForamt 对日期和字符串进行格式化和解析的抽象类

但是由于是抽象类,所以使用具体子类SimpleDateFormat。

 * Date	 --	 String(格式化)
 * 		public final String format(Date date)
 * 
 * String -- Date(解析)
 * 		public Date parse(String source)
 * SimpleDateFormat的构造方法:
 * 		SimpleDateFormat():默认模式
 * 		SimpleDateFormat(String pattern):给定的模式
 * 			这个模式字符串该如何写呢?
 * 			通过查看API,我们就找到了对应的模式
 * 			年 y
 * 			月 M	
 * 			日 d
 * 			时 H
 * 			分 m
 * 			秒 s
 * 			2014年12月12日 12:12:12对应
 * 			yyyy年MM月dd日 HH:mm:ss
案例:

把当前的时间以"yyyy年MM月dd日 HH:mm:ss"格式打印出来,且把"2008-08-08 12:12:12"解析为时间

public class DateFormatDemo {
	public static void main(String[] args) throws ParseException {
		// Date -- String
		// 创建日期对象
		Date d = new Date();
		// 创建格式化对象,给定模式
		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);
		
		//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);
	}
}
H:Calendar 对日历进行操作的类
/* 最常用来为其创建对象的方式是通过该类的静态方法getInstance()
 * public static Calendar getInstance()	返回的 Calendar 基于当前系统的日历时间(北京时间)。 
 * 
 * 获取日历字段的方法:
 * 		public int get(int field):返回给定日历字段的值。
 * 		日历类中的每个日历字段都是静态的成员变量,并且是int类型。使用类名直接获取
 * 		如:Calendar.YEAR;Calendar.MONTH;Calendar.DATE;
 */

 
  
		// 其日历字段已由当前日期和时间初始化:
		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):设置当前日历的年月日
 */
案例1:获取5年后的10天前日期,然后把当前日期设置为2011年11月11日

public class CalendarDemo {
	public static void main(String[] args) {
		// 获取当前的日历时间
		Calendar c = Calendar.getInstance();
		
		// 5年后的10天前
		c.add(Calendar.YEAR, 5);
		c.add(Calendar.DATE, -10);
		// 获取年
		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 + "日");
		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 + "日");
	}
}

案例2:编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。

public class Test9 {
	public static void main(String[] args) throws ParseException {
		//给定模式创建SimpleDateFormat对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个日期,格式为‘yyyy-MM-dd’:");
		String str = sc.nextLine();
		//解析日期
		Date d = sdf.parse(str);
		
		//创建日历对象
		Calendar cal = Calendar.getInstance();
		//设置当前的日历时间为解析的时间
		cal.setTime(d);
		
		//获取星期
		int week = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println("这一天是星期"+(week-1));
		//获取天数
		int day = cal.get(Calendar.DAY_OF_YEAR);
		System.out.println("这一天是一年中的第"+day+"天");
	}
}

案例3:获取任意一年的二月有多少天

/*
 * 获取任意一年的二月有多少天
 * 
 * 分析:
 * 		A:键盘录入任意的年份
 * 		B:设置日历对象的年月日
 * 			年就是A输入的数据
 * 			月是2
 * 			日是1
 * 		C:把时间往前推一天,就是2月的最后一天
 * 		D:获取这一天输出即可
 */
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));
	}
}

你可能感兴趣的:(java基础)