常用类二

1 java比较器

1.1 概述

  • 在java中经常会涉及到对象数组的排序问题,那么就会涉及到对象之间的比较问题。
  • java实现对象的排序方式有两种:
  • ①自然排序:java.lang.Comparable。
  • ②定制排序:java.util.Comparator。

1.2 自然排序

1.2.1 概述

  • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
  • 实现Comparable的类必须实现compareTo(Object obj)方法,即两个对象通过compareTo(Object obj)方法的返回值比较大小。如果当前对象this大于形参对象obj,则返回正整数;如果当前对象this小于形参对象obj,则返回负整数;如果当前对象this等于形参对象obj,则返回零。
  • 实现Comparable接口的对象列表(或数组)可以通过Collections.sort或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或者有序集合中的元素,无需指定比较器。
  • 对于类C的每个e1和e2来说,当且仅当e1.compareTo(e2)==0与e1.equals(e2)具有相同的boolean值时,类C的自然排序才叫做和equals一致。建议最好使得自然排序和equals一致。

1.2.2 典型实现

  • String:按照字符串中字符的Unicode值来进行比较。
  • Character:按照字符的Unicode值来进行比较。
  • 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数组大小进行比较。
  • Boolean:true对应的包装类实例大于false对应的包装类实例。
  • Date、Time等:后面的日期时间比前面的日期时间大。

1.2.3 应用示例

  • 示例:
package day23;

/**
 * 商品
 *
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class Goods implements Comparable{

    private String name;
    private Double price;

    public String getName() {
        return name;
    }

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

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Goods o) {

        int num = name.compareTo(o.name);
        if(0 == num){
            num = price.compareTo(o.getPrice());
        }
        return num;
    }
}
package day23;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class CompareTest {
    public static void main(String[] args) {
        Goods g1 = new Goods();
        g1.setName("苹果");
        g1.setPrice(1.1);

        Goods g2 = new Goods();
        g2.setName("香蕉");
        g2.setPrice(2.1);

        List list = new ArrayList<>();
        list.add(g2);
        list.add(g1);

        System.out.println("排序前:" + list);

        Collections.sort(list);

        System.out.println("排序后:" + list);
    }
}

1.3 定制排序

1.3.1 概述

  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码的时候,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较。
  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小。如果方法返回正整数,则表示o1大于o2;如果方法返回0,则表示相等;如果方法返回负整数,表示o1小于o2。
  • 可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。
  • 可以使用Comparator来控制某些数据结构(如有序Set或者有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

1.3.2 应用示例

  • 示例:
package day23;

/**
 * 商品
 *
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class Goods implements Comparable{

    private String name;
    private Double price;

    public String getName() {
        return name;
    }

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

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Goods o) {

        int num = name.compareTo(o.name);
        if(0 == num){
            num = price.compareTo(o.getPrice());
        }
        return num;
    }
}
package day23;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class CompareTest {
    public static void main(String[] args) {
        Goods g1 = new Goods();
        g1.setName("苹果");
        g1.setPrice(1.1);

        Goods g2 = new Goods();
        g2.setName("香蕉");
        g2.setPrice(2.1);

        List list = new ArrayList<>();
        list.add(g2);
        list.add(g1);

        System.out.println("排序前:" + list);

        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Goods o1, Goods o2) {
                int num = - o1.getName().compareTo(o2.getName());
                if (0 == num) {
                    num = o1.getPrice().compareTo(o2.getPrice());
                }
                return num;
            }
        });

        System.out.println("排序后:" + list);
    }
}

 

2 System类

2.1 概述

  • System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。
  • 该类位于java.lang包下。
  • 由于该类的构造器是私有的,所以无法创建该类的对象,即无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方法的进行调用。

2.2 常用的方法

  • 返回当前时间的毫秒值:
public static native long currentTimeMillis();
  • 退出程序:(其中status的值为0表示正常退出,非0表示异常退出)
public static void exit(int status){}
  • 请求系统进行垃圾回收:(至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况)
public static void gc() {}     
  • 获取系统中属性名为key对应的值:
public static String getProperty(String key) {}

 

  • 示例: 
package day23;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class SystemTest {
    public static void main(String[] args) {
        long l = System.currentTimeMillis();
        System.out.println("当前时间的毫秒值:" + l);

        String version = System.getProperty("java.version");
        System.out.println("当前运行的JDK的版本:" + version);

        String javaHome = System.getProperty("java.home");
        System.out.println("java的安装目录:" + javaHome);

        String osName = System.getProperty("os.name");
        System.out.println("操作系统的名称:" + osName);

        String osVersion = System.getProperty("os.version");
        System.out.println("操作系统的版本:" + osVersion);

        String userName = System.getProperty("user.name");
        System.out.println("用户的账户名称:" + userName);

        String userHome = System.getProperty("user.home");
        System.out.println("用户的主目录:" + userHome);

        String userDir = System.getProperty("user.dir");
        System.out.println("用户的当前工作目录:" + userDir);
    }
}

 

3 Math类

3.1 概述

  • java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值一般为double类型。

3.2 常用方法

  • 绝对值:
public static int abs(int a){}
public static long abs(long a){}
public static float abs(float a){}
public static double abs(double a){}
  • 三角函数:
public static double sin(double a){}
public static double cos(double a){}
public static double tan(double a){}
public static double asin(double a){}
public static double acos(double a){}
public static double atan(double a){}
  • 平方根:
public static double sqrt(double a)
  • a的b次幂:
public static double pow(double a, double b){}
  • 自然对数:
public static double log(double a){}
public static double log10(double a){}
  • e为底数:
public static double exp(double a){}
  • 两个数的最大值:
public static int max(int a, int b){}
public static long max(long a, long b){}
public static float max(float a, float b){}
public static double max(double a, double b){}
  • 两个数的最小值:
public static int min(int a, int b){}
public static long min(long a, long b){}
public static float min(float a, float b){}
public static double min(double a, double b) {}
  • 返回[0.0,1.0)之间的随机数:
public static double random(){}
  • 四舍五入:
public static int round(float a){}
public static long round(double a){}
  • 弧度转角度:
public static double toDegrees(double angrad){}
  • 角度转弧度:
public static double toRadians(double angdeg){}

 

4 BigInteger类和BigDecimal类

4.1 BigInteger类

4.1.1 概述

  • Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的,最大为2^63-1,如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。
  • java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger提供所有java的基本整数操作符的对应物,并提供java.lang.Math的所有相关方法。另外,BigInteger还提供模运算、GCD计算、质数测试、质数生成、位操作以及一些其他操作。

4.1.2 常用方法

  • 构造器:
public BigInteger(byte[] val){}
public BigInteger(int signum, byte[] magnitude){}
public BigInteger(String val, int radix){}
public BigInteger(String val){}//常用
public BigInteger(int numBits, Random rnd){}
public BigInteger(int bitLength, int certainty, Random rnd){}
  • 返回绝对值:
public BigInteger abs(){}
  • 相加:
public BigInteger add(BigInteger val){}
  • 相减:
public BigInteger subtract(BigInteger val){}
  • 相乘:
public BigInteger multiply(BigInteger val){}
  • 相除:
public BigInteger divide(BigInteger val){}
  • 取模:
public BigInteger remainder(BigInteger val){}
  • 除数和余数:
public BigInteger[] divideAndRemainder(BigInteger val) {}
  • 指数:
public BigInteger pow(int exponent){}

4.1.3 应用示例

  • 示例:
package day23;

import java.math.BigInteger;
import java.util.Arrays;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class BigIntegerTest {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("-1");
        BigInteger bigInteger1 = new BigInteger("123");

        BigInteger abs = bigInteger.abs();
        System.out.println("原来的值:" + bigInteger);
        System.out.println("返回绝对值:" + abs);

        System.out.println("原来的值:" + bigInteger);
        System.out.println("相加之后的值:" + bigInteger.add(bigInteger1));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("相减之后的值:" + bigInteger.subtract(bigInteger1));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("相乘之后的值:" + bigInteger.multiply(bigInteger1));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("相除之后的值(只保留整数部分):" + bigInteger.divide(bigInteger1));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("取模(求余数):" + bigInteger.remainder(bigInteger1));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("相除之后获取整数的值和余数的值:" + Arrays.toString(bigInteger.divideAndRemainder(bigInteger1)));

        System.out.println("原来的值:" + bigInteger);
        System.out.println("指定指数的值:" + bigInteger.pow(2));
    }
}

4.2 BigDecimal类

4.2.1 概述

  • 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,所以需要用到BigDecimal类。
  • BigDecimal类支持不可变的、任意精度的有符号的十进制定点数。

4.2.2 构造器

  • 参数为double类型的构造器:
public BigDecimal(double val){}
  • 参数为String类型的构造器(建议):
public BigDecimal(String val){}

4.2.3 常用方法

  • 相加:
public BigDecimal add(BigDecimal augend) {}
  • 相减:
public BigDecimal subtract(BigDecimal subtrahend){}
  • 相乘:
public BigDecimal multiply(BigDecimal multiplicand){}
  • 相除:
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode){}

4.2.4 应用示例

  • 示例:
package day23;

import java.math.BigDecimal;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-07-15
 */
public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal bigDecimal1 = new BigDecimal("12.3");
        BigDecimal bigDecimal2 = new BigDecimal("13.2");

        System.out.println("相加后的结果是:" + bigDecimal1.add(bigDecimal2));
        System.out.println("相减的结果是:" + bigDecimal1.subtract(bigDecimal2));
        System.out.println("相乘的结果是:" + bigDecimal1.multiply(bigDecimal2));
        System.out.println("相除的结果是:" + bigDecimal1.divide(bigDecimal2,2, BigDecimal.ROUND_HALF_UP));
    }
}

 

你可能感兴趣的:(常用类二)