面向对象之14:开发中的常用类之一: Math、Random、System、Arrays、BigInteger、BigDecimal、Scanner 的使用总结:

目录

数学相关的类:Math

Math类中常用的API:

随机数相关的类:Random

Random类常用API:

系统相关的类:System

System类中的常用API:

操作数组的工具类:Arrays

Arrays 类中常用API:

static void sort(T[] a, Comparator c) 源码解读:

使用冒泡排序模拟:static void sort(T[] a, Comparator c) 方法:

使用 static void sort(T[] a, Comparator c) 方法 排序对象数组中的元素(对象):(封装+继承+多态+多态动态绑定机制+面向接口编程)

文本扫描器:Scanner

BigInteger类(大的整数)、BigDecimal类(大的小数)

BigInteger的常用方法:

BigDecimal常用方法:

说明:


数学相关的类:Math

  1. ,Math在 java.lang包下,直接使用,无需导包。
  2. Math 的 UML类图:
  3. ,Math被final所修饰,不可被继承。
  4. ,构造器私有化,不能创建Math的对象。(只能是 Math 类 自己在自己的类中使用自己的对象。)
  5. Math类内部所有的 属性、方法都是 静态的,被static 修饰,直接用类名.静态成员 访问即可。
  6. 如果本类中的静态成员有和静态导入的类的静态成员重名时,在运行程序调用静态成员的时候,优先调用的是本类中的静态成员!没有,则是使用静态导入的类中的静态成员!
  7. Math类中常用的API:

     public static void invokeMath() {
            // 常用属性
            //Math.E: double值比其他任何一个都更接近 e ,自然对数的基数。ln
            System.out.println("自然对数的基数: " + Math.E);
            //Math.PI:double值比任何其他的更接近 pi ,圆周长与其直径的比率。
            System.out.println("圆周率 = " + Math.PI);
    
            // 常用方法
            //1:
            // static double abs(double a): 返回值为 double绝对值。
            // static float abs(float a): 返回值为 float 绝对值。
            // static int abs(int a): 返回值为 int 绝对值。
            // static long abs(float a): 返回为 long 值的绝对值。
            System.out.println("-3.345的绝对值 = " + Math.abs(-3.345));
    
            //2:static double pow(double a, double b) 将第一个参数的值返回到第二个参数的幂。
            System.out.println("2^10的幂 = " + Math.pow(2, 10));
    
            //3:static int decrementExact(int a) 返回一个递减1的参数,如果结果溢出int,则 "integer overflow" 。
            // static long decrementExact(long a) 将返回的参数递减1,如果结果溢出long,则 "long overflow"。
            System.out.println("Integer.MAX_VALUE 递减 = " + Math.decrementExact(Integer.MAX_VALUE));
            // static int incrementExact(int a)返回增加1的参数,如果实参溢出int,则 integer overflow 。
            //static long incrementExact(long a)返回一个增加1的参数,如果实参溢出long,则 long overflow。
            System.out.println("Integer.MAX_VALUE-1 递增 = " + Math.incrementExact(Integer.MAX_VALUE - 1));
    
            //4:static double ceil(double a)返回大于或等于参数的最小(最接近负无穷大) double值,等于一个数学整数。
            System.out.println("6.000001向上取整 = " + Math.ceil(6.000001));
    
            //5:static double floor(double a)返回小于或等于参数的最大(最接近正无穷大) double值,等于一个数学整数。
            System.out.println("-9.99999999 向下取整 = " + Math.floor(-9.99999999));
    
            //6:static double sqrt():返回的正确舍入的正平方根 double值。(不是算术平方根!!!也不是平方根!)
            // 4.47213595499958^2 ≈ 20
            System.out.println("20的正平方根  = " + Math.sqrt(23));
    
            //7:static long round(double a) 返回参数中最接近的 long ,其中 long四舍五入为正无穷大。
            //static  int round(float a) 返回参数中最接近的 int ,其中 int四舍五入为正无穷大。
            System.out.println("5.5四舍五入 = " + Math.round(5.5));
    
            //8:static long max(long a, long b) 返回两个 long的较大值。
            // static int max(int a, int b)返回两个 int值中的较大值。
            // static float max(float a, float b)返回两个 float的较大值。
            // static double max(double a, double b)返回两个 double值中的较大值。
            System.out.println("3.14 和 6.66 中的较大值 = " + Math.max(3.14, 6.66));
    
            //9:static long min(long a, long b)返回两个 long的较小值。
            // static int min(int a, int b)返回两个 int的较小值。
            // static double min(double a, double b) 返回两个 double的较小值。
            //static float min(float a, float b)返回两个 float的较小值。
            System.out.println(" 7 和 2 中的较小值 = " + Math.min(7, 2));
    
            //10: static int multiplyExact(int x, int y) 返回参数的乘积,如果结果溢出int,则抛出 integer overflow 。
            //static long multiplyExact(long x, long y) 返回参数的乘积,如果结果溢出long,则抛出 long overflow 。
            System.out.println("56 * 78 = " + Math.multiplyExact(56, 78));
    
            // 11: static int negateExact(int a) 返回参数的否定,如果结果溢出int,则 integer overflow 。
            //static long negateExact(long a) 返回参数的否定,如果结果溢出long,则 integer overflow 。
            System.out.println("-8 的相反数是 = " + Math.negateExact(-8));
    
            // 12:static double log(double a) 返回的自然对数(以 e为底) double值。
            //static double log10(double a)返回一个 double的基数10对数值。
            // 2.7182818284590452354^1.791759469228055 ≈ 6.0
            System.out.println("6的自然对数 = " + Math.log(6));
            // 10^1.5410797677766288 ≈  34.76
            System.out.println("34.76的常用对数 = " + Math.log10(34.76));
    
            // 13:static double IEEEremainder(double f1, double f2) 根据IEEE 754标准计算两个参数的余数运算。
            System.out.println("Math.IEEEremainder(7.6, 5.56) = " + Math.IEEEremainder(7.6, 5.56));
    
            // 14: static double random()返回值为 double值为正号,大于等于 0.0 ,小于 1.0
            // 返回 [0.0,1.0) 之间的随机数
            System.out.println("Math.random() = " + Math.random());
            // 求 2 ~ 14 [2,14] 之间的随机数
            for (int i = 1; i <= (14 << 1) + 2; i++) {
                System.out.print("2 ~ 14 之间的随机数 : =  " + (int) ((Math.random() * (14 - 2 + 1)) + 2) + "\t\t");
                if (i % 3 == 0) System.out.println();
    
            }
            // 求 46 ~ 124 [46,124] 之间的随机数
            System.out.println("46 ~ 124 之间的随机数 : =" + (int) ((Math.random() * (124 - 46 + 1)) + 46));
        }

    result:


随机数相关的类:Random

  1. ,Random类在java.util包,使用时需要导包。
  2. Random类 UML类图:
  3. Random类 构造器:
  4. Random类常用API:

    public static void invokeRandom() {
            // 利用带参数构造器初始化 Random对象:
    
            // Random(long seed) 使用单个 long种子创建一个新的随机数生成器。
            // 使用单个long种子创建新的随机数生成器。 种子是通过方法next(int)维护的伪随机数发生器的内部状态的初始值。
            // 调用new Random(seed)相当于:
            // Random rnd = new Random(); rnd.setSeed(seed);
            Random random = new Random(666666666666L);
    
            // int nextInt() 返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。
            // 如果种子 每次都是一样的,那么生成的伪随机数也每次都是一样的。
            System.out.println(random.nextInt());
        }

    result:

    public static void invokeRandom() {
            // 利用带参数构造器初始化 Random对象:
    
            // Random(long seed) 使用单个 long种子创建一个新的随机数生成器。
            // 使用单个long种子创建新的随机数生成器。 种子是通过方法next(int)维护的
                                                伪随机数发生器的内部状态的初始值。
            // 调用new Random(seed)相当于:
            // Random rnd = new Random(); rnd.setSeed(seed);
            Random random = new Random(System.currentTimeMillis());
    
            // int nextInt() 返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。
            // 如果种子 每次都是一样的,那么生成的伪随机数也每次都是一样的。
            System.out.println(random.nextInt());
    
            // 利用空参构造器初始化 Random 对象
            // 表面上是在调用无参构造器,实际底层还是调用了带参构造器
            //  public Random() {
            //        this(seedUniquifier() ^ System.nanoTime());
            //    }
            Random rd = new Random();
    
            // Random 常用方法:
            // int nextInt(int bound)
            // 返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),
                                    从该随机数生成器的序列绘制。
            // 比如生成 1 ~ 10 之间的伪随机数
            for (int i = 1; i <= (5 << 1) + 2; i++) {
                System.out.print("生成 1 ~ 10 之间的伪 随机数: "
                                     + (rd.nextInt(10) + 1) + "\t\t");
                if (i % 3 == 0) {
                    System.out.println();
                }
            }
            System.out.println("=========================================================");
    
            //  double nextDouble()
            //  返回下一个伪随机数,从这个随机数发生器的序列中 0.0和 1.0之间的 double值 0.0分布。
            //  比如生成 89 ~ 101 之间的随机数
            for (int i = 1; i <= 101 - 89; i++) {
                System.out.print("生成 89 ~ 101 之间的随机数: " 
                        + (int) (rd.nextDouble() * (101 - 89 + 1) + 89) + "\t\t");
                if (i % 3 == 0) System.out.println();
            }
    
        }

    result:

  5. Math类中的random 方法实际上调用的就是 Random类中的 nextDouble 方法:实际上在Math类中 的私有 RandomNumberGenratorHolder 静态内部类中,已经初始化了 Random 的对象。


系统相关的类:System

  1. ,System 类在java.lang包下,直接使用,无需导包。
  2. ,System 被final修饰,不可被继承。构造器私有化,不能在System类以外的地方初始化 System对象。
  3. System 的 UML 类图:
  4. System类中的成员,全部为静态成员,直接用 类名.静态成员调用即可。
  5. System类中的常用API:

      public static void invokeSystem() {
            // 常用属性,
            // static PrintStream out “标准”输出流。
            // 获取“标准”输出流对象
            PrintStream out = System.out;
            out.println("“标准”输出流");
    
            // static InputStream in “标准”输入流。
            // 获取“标准”输入流对象
            InputStream in = System.in;
    
            //static PrintStream err “标准”错误输出流。
            // 获取“标准” 错误输出流对象
            // “标准”错误输出流 会在 “标准”输出流out.println() 的最后输出
            PrintStream err = System.err;
            err.println("“标准”错误输出流");
    
            // 常用方法:
            // (System.arraycopy方法是本地方法,由Java以外的语言实现, 
                                    由(C 或者是 C++)语言实现具体功能)
    
            // public static native void arraycopy(Object src, int srcPos, 
                                            Object dest, int destPos, int length)
    
            // 将指定源数组中的数组从指定位置复制到目标数组的指定位置。
            /**
             * public static native void arraycopy(Object src, int srcPos,
                                             Object dest, int destPos, int length)
    
             *                      src: 源数组(即拷贝的数组)
             * @param      src      the source array
    
             *                      srcPos:源数组起始索引(即从源数组中那个索引位置上开始拷贝,
                                                包含这个索引位置上的元素。)
             * @param      srcPos   starting position in the source array.
    
             *                      dest:目标数组(即被拷贝的数组)
             * @param      dest     the destination array.
    
             *                      destPos:目标数组起始索引
                                   (即从目标数组中那个索引位置开始拷贝)
             * @param      destPos  starting position in the destination data.
    
             *                      length:拷贝的元素数量
                                    (即从源数组中起始位置开始拷贝多少个元素到目标数组中)
                                    (从源数组中拷贝到目标数组中的最后一个元素,
                    这个元素在源数组中对应的索引是 (起始索引元素的索引 + 拷贝的元素数量) -1)
             * @param      length   the number of array elements to be copied.
    
             * // 如果拷贝的元素个数超出 源数组的长度,
                                        则抛出java.lang.ArrayIndexOutOfBoundException
             * // 如果源数组与目标数组的类型不匹配,则抛出 java.lang.ArrayStoreException
             * // 如果源数组或者是目标数组 为 null 则抛出 java.lang.NullPointerException
             */
            String[] strArr = {"java", "mysql", "redis", "spring", "netty", "dubbo"};
            String[] strArr2 = new String[strArr.length + 2];
            System.arraycopy(strArr, 0, strArr2, 2, strArr.length - 2);
            for (String s : strArr2) {
                out.print(s + "\t\t");
            }
            out.println();
    
            // static long currentTimeMillis() 返回当前时间(以毫秒为单位)。
            // 返回 UTC 1970年1月1日0时到当前时间 的时间差 ,以毫秒为单位。
            out.println("System.currentTimeMillis() = " + System.currentTimeMillis());
    
            // static long nanoTime() 以纳秒为单位返回正在运行的Java虚拟机
                                                的高分辨率时间源的当前值。
    
            out.println("System.nanoTime() = " + System.nanoTime());
    
            // currentTimeMillis() 和 nanoTime() 方法的区别
            // 纳秒
            //  ns(nanosecond):纳秒, 时间单位。一秒的10亿分之一,
                                        即等于10的负9次方秒。常用作 内存读写速度的单位。
            //  1纳秒=0.000001 毫秒
            //  1纳秒=0.00000 0001秒
            // System.nanoTime()返回的是纳秒,nanoTime而返回的可能是任意时间,甚至可能是负数……
            // System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数.
            // 两个方法都不能保证完全精确,精确程度依赖具体的环境.
            out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
            /**
             * System.nanoTime(): 此方法只能用于测量已过的时间,
                                    与系统或钟表时间的其他任何时间概念无关。
             * 返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。
             * 此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。
             * 在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:
                                        由于数字溢出,将无法准确计算已过的时间。
             *
             * System.currentTimeMillis(): 此方法 返回的是从1970.1.1 UTC 零点开始
                            到现在的时间,精确到毫秒,平时我们可以根据System.currentTimeMillis
                            来计算当前日期,星期几等,可以方便的与Date进行转换,
             * 返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,
             * 值的粒度取决于底层操作系统,并且粒度可能更大。例如,
                                        许多操作系统以几十毫秒为单位测量时间。
             */
    
    
            // static void gc() 运行垃圾回收器。
            // 当对象不再有任何引用,在执行 gc() 运行垃圾回收机制时,
    
            // 会主动先执行对象的finalize()方法里面的逻辑代码,
                            如果对象类中有重写Object父类的finalize()
            // finalize()方法,只要在对象被垃圾回收时就都会执行,
                            如果对象类中有重写Object的finalize() 
    
            // 调用System.gc(),只是主动运行垃圾回收器
            System.gc();
    
            // static void exit(int status)终止当前运行的Java虚拟机。exit后面的任何代码都不再执行
            // status : 0 表示程序正常终止,非零 表示异常终止
            System.exit(0);
            out.println("终止虚拟机,本句代码不会再执行!");
        }

    result:


操作数组的工具类:Arrays

  1. Arrays 类中包含了一系列的静态方法,用于操作数组(比如数组的排序和二分查找)
  2. Arrays 的 UML类图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值