欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础(七)

程序员文章站 2022-06-24 07:56:37
一、Math类 1、Math类介绍 Math类属于java.lang包下面,里面包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数,该类被final修饰。 常用字段: 1、E 表示自然对数的底数 2.71828 2、Π 表示圆周率 3.1415926 2、Math类常用方法 以下X表 ......

一、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)

  设置日历字段 YEARMONTHDAY_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 }