Java基础(七)
一、Math类
1、Math类介绍
Math类属于java.lang包下面,里面包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数,该类被final修饰。
常用字段:
1、E 表示自然对数的底数 2.71828
2、Π 表示圆周率 3.1415926
2、Math类常用方法
以下X表示 double,float,int,,long
1、abs(X x):求绝对值,比如 static double abs(double a) 。
2、max(X x1,X x2):求最大值,比如 static double max(double a, double b) 求两个数中的最大值。
3、min(X x1,X x2):求最小值。
4、pow(double a,double b) 返回第一个参数次幂的值。
5、random():返回一个 0 到 1 之间的数,double类型。
6、public static int round(float a):返回最接近参数的 int
。结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 int
类型。
public static long round(double a):返回最接近参数的 long
。结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long
类型。
7、public static double sqrt(double a):返回正确舍入的 double
值的正平方根。
二、BigInteger类和 BigDecimal类
1、BigInteger类
不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
BigInteger类比long大。
BigInteger 方法:
1、BigInteger add(BigInteger val);
返回其值为 (this + val) 的 BigInteger(当前对象和传入对象相加,返回新的值)。
2、BigInteger multiply(BigInteger val);
返回其值为 (this * val) 的 BigInteger。
3、BigInteger divide(BigInteger val);
返回其值为 (this / val) 的 BigInteger。
2、BigDecimal类
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
BigDecimal能够精确的表示一个小数,常用于商业和科学计算;float,double不能精确的表示一个小数。
BigDecimal类和BigInteger类很相似,比如 add(加法)、multiply(乘法)divide(除法)。
1 import java.math.BigDecimal; 2 3 public class BigDecimalTest { 4 /** 5 * 不精确的计算 6 */ 7 @Test 8 public void test1(){ 9 System.out.println(0.05 + 0.01); //输出:0.060000000000000005 10 System.out.println(1.0 - 0.42); //输出:0.5800000000000001 11 System.out.println(4.015*100); //输出:401.49999999999994 12 System.out.println(123.3/100); //输出:1.2329999999999999 13 } 14 15 /** 16 * 使用BigDecimal,参数类型是double类型,计算还是不精确 17 */ 18 @Test 19 public void test2(){ 20 BigDecimal b1 = new BigDecimal(0.05); 21 BigDecimal b2 = new BigDecimal(0.01); 22 System.out.println(b1.add(b2)); //输出:0.06000000000000000298372437868010820238851010799407958984375 23 } 24 25 /** 26 * 使用BigDecimal,参数类型是String类型,计算结果精确 27 */ 28 @Test 29 public void test3(){ 30 BigDecimal b1 = new BigDecimal("0.05"); 31 BigDecimal b2 = new BigDecimal("0.01"); 32 System.out.println(b1.add(b2)); //输出:0.06 33 } 34 }
3、小结
BigInteger和BigDecimal它们之间有很多共性:
1、BigInteger 和 BigDecimal 都是Number的子类,表示数字类型。
2、Integer是int的包装类,BigInteger,BigDecimal和Integer没有一点关系,BigInteger,BigDecimal都是平级的,都是Number的子类。
3、BigInteger,BigDecimal 虽然都是数字类型的引用类型,但是不能够使用基本运算符( 比如 +, -, *,/),需要使用专门的方法来进行计算。
三、随机数
1、获取随机数的方法
1、Math.random()
返回带正号的double值,该值大于等于0.0 且小于1.0;(返回值double,范围[0.0,1.0) )。
2、Java中单独提供了一个Random类
int nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。(在整个int范围内随机获得int值)。
int nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值n(不包括)之间均匀分布的 int 值。(获得0到n的一个int值)。
3、Random括展了一个子类(ThreadLocalRandom),可以指定区间[n,m)左闭右开。
4、UUID 唯一标识
1 import java.util.Random; 2 import java.util.UUID; 3 import java.util.concurrent.ThreadLocalRandom; 4 5 public class RandomTest { 6 /** 7 * 测试Math.random 8 */ 9 @Test 10 public void test1(){ 11 System.out.println(Math.random()); //输出:0.4645899681898382 12 } 13 14 /** 15 * 测试Random类 16 */ 17 @Test 18 public void test2(){ 19 Random random = new Random(); 20 int nextInt1 = random.nextInt(); 21 int nextInt2 = random.nextInt(); 22 System.out.println(nextInt1); 23 System.out.println(nextInt2); 24 //Random(long seed) 如果种子是一个固定值,得到也是一个固定值 25 Random random1 = new Random(123456); 26 int nextInt3 = random1.nextInt(); 27 //int nextInt(int n) n 必须比0大,返回在 n 之间的随机数 28 int nextInt4 = random1.nextInt(9); 29 System.out.println(nextInt3); 30 System.out.println(nextInt4); //输出:4 31 } 32 33 /** 34 * 测试ThreadLocalRandom类 35 */ 36 @Test 37 public void testThreadLocalRandom(){ 38 //不能使用new来创建ThreadLocalRandom对象 39 ThreadLocalRandom random = ThreadLocalRandom.current(); 40 int nextInt1 = random.nextInt(); 41 //nextInt(int n) n 必须比0大,返回在 n 之间的随机数 42 int nextInt2 = random.nextInt(9); 43 System.out.println(nextInt1); //输出:347500648 44 System.out.println(nextInt2); //输出:7 45 } 46 47 /** 48 * 测试UUID 唯一标示 49 */ 50 @Test 51 public void testUUID(){ 52 UUID uuid = UUID.randomUUID(); 53 System.out.println(uuid); //输出:2cc14224-72e3-4e3a-8c7b-017abb433f74 54 } 55 }
四、日期时间类
1、Date类
java.util.Date 使用一个类表示时间,也就是把时间封装成一个类。
1 import java.util.Date; 2 3 public class DateTest { 4 /** 5 * 测试Date 6 */ 7 @Test 8 public void test1(){ 9 Date date = new Date(); 10 System.out.println(date); //返回当前时间 11 } 12 }
2、时间格式化
DateFormat类的子类SimpleDateFormat
方法:
1、格式化(把Date转换成String) String format(Date date)。
2、解析(把String转换成Date) Date parse(String source)。
一般可以把时间格式化方法封装为一个工具类:
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 import java.util.Locale; 5 6 /** 7 * 时间工具类 8 */ 9 public class DateUtil { 10 /** 11 * 格式化日期 12 * @param date 13 * @return 14 */ 15 public static String DateToString(Date date) { 16 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); 17 String format = dateFormat.format(date); 18 return format; 19 } 20 21 /** 22 * 字符串转换成日期格式 23 * @param date 24 * @return 25 * @throws ParseException 26 */ 27 public static Date StringToDate(String date) { 28 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); 29 Date parse = null; 30 try { 31 parse = dateFormat.parse(date); 32 } catch (ParseException e) { 33 e.printStackTrace(); 34 } 35 return parse; 36 } 37 }
2、Calendar 日历类
Calendar类属于java.util包下面 , 抽象类;不能使用new创建对象,获取日历对象用 Calendar.getInstance()。
Calendar方法:
1、public final void set(int year, int month, int date)
设置日历字段 YEAR
、MONTH
和 DAY_OF_MONTH
的值。
2、public int get(int field)
返回给定日历字段的值。在 lenient 模式下,所有日历字段都被标准化。在 non-lenient 模式下,所有日历字段都是经过验证的,如果任何日历字段有超出范围的值,则此方法抛出一个异常。
1 public class DateTest { 2 /** 3 * 测试Calendar类 4 */ 5 @Test 6 public void testCalendar(){ 7 Calendar calendar = Calendar.getInstance(); //创建Calendar对象,不能用new,是一个抽象类 8 int year = calendar.get(Calendar.YEAR); //获取年 9 int month = calendar.get(Calendar.MONTH) + 1; //获取月 第一个月是 JANUARY,它为 0;所以需要加 1 10 int day = calendar.get(Calendar.DAY_OF_MONTH); //获取day 11 System.out.println("当前日期:" + year + "年"+ month + "月" + day + "号"); //输出:当前日期:2018年2月7号 12 Date time = calendar.getTime(); //一次性获取日期 13 System.out.println(time); //Wed Feb 07 16:11:00 GMT+08:00 2018 14 } 15 16 /** 17 * Calendar类的计算 18 */ 19 @Test 20 public void testCalendar2(){ 21 Calendar calendar = Calendar.getInstance(); 22 calendar.add(Calendar.YEAR, 1); //增加1年 23 calendar.add(Calendar.MONTH, 2); //增加2个月 24 calendar.add(Calendar.DAY_OF_MONTH, 8); //增加8天 25 int year = calendar.get(Calendar.YEAR); 26 int month = calendar.get(Calendar.MONTH) + 1; //获取月 第一个月是 JANUARY,它为 0;所以需要加 1 27 int day = calendar.get(Calendar.DAY_OF_MONTH); 28 System.out.println("当前日期:" + year + "年"+ month + "月" + day + "号"); //输出:当前日期:2019年4月15号 29 } 30 }