Java常用类之 Java比较器、System类、Math类、BigInteger与BigDecimal

Java常用类

五、Java比较器

提出背景:

Java中的对象,正常情况下,只能进行比较: == 或 !=。 不能使用 > 或 <

但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。需要使用两个接口中的任何一个实现:Comparable 或 Comparator

5.1、Comparable 接口的使用

5.1.1、自然排序:Comparable接口

  1. 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的
  2. 像String、包装类重写了compareTo(obj)方法以后,进行了从小到大的排列
  3. 重写compareTo(obj)方法的规则:
    1. 如果当前对象this大于形参对象obj,则返回正整数,
    2. 如果当前对象this小于形参对象obj,则返回负整数,
    3. 如果当前对象this等于形参对象obj,则返回零。
  4. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序

示例一、String中默认按照从小到达排序

@Test
    public void test1(){
    
    
        String arr[] = new String[]{
    
    "AA", "HH", "TT", "GG", "CC","SS"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));// [AA, CC, GG, HH, SS, TT]
    }

示例二、自定义类Goods,用默认的方法排序是按照整数从小到大排序。

@Test
    public void test2(){
    
    
        Goods[] arr = new Goods[5];
        arr[0] = new Goods("lenovoMouse", 34);
        arr[1] = new Goods("dellMouse", 43);
        arr[2] = new Goods("xiaomiMouse", 23);
        arr[3] = new Goods("huaweiMouse", 65);
        arr[4] = new Goods("micorsoftMouse", 43);

        Arrays.sort(arr);
        for (Goods i : arr) {
    
    
            System.out.println(i);
        }
    }

输出结果

image.png

示例三、自定义排序,将字符串按照从大到小的顺序排序

 @Test
    public void test3(){
    
    
        String arr[] = new String[]{
    
    "AA", "HH", "TT", "GG", "CC","SS"};
        Arrays.sort(arr, new Comparator<String>() {
    
    
            @Override
            public int compare(String o1, String o2) {
    
    
                if (o1 instanceof String && o2 instanceof  String){
    
    
                    // 强转
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(arr));// [TT, SS, HH, GG, CC, AA]
    }

5.1.2、定制排序:Comparator接口

  1. 背景:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序
  2. 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2。

示例四、定制排序:Comparator接口,指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序

/*
定制排序:Comparator接口
 */
@Test
public void test4(){
    
    
    Goods[] arr = new Goods[6];
    arr[0] = new Goods("lenovoMouse", 34);
    arr[1] = new Goods("dellMouse", 43);
    arr[2] = new Goods("xiaomiMouse", 23);
    arr[3] = new Goods("huaweiMouse", 65);
    arr[4] = new Goods("huaweiMouse", 224);
    arr[5] = new Goods("micorsoftMouse", 43);

    Arrays.sort(arr, new Comparator() {
    
    
        //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
        @Override
        public int compare(Object o1, Object o2) {
    
    
            if (o1 instanceof Goods && o2 instanceof Goods){
    
    
                //强转
                Goods goods1 = (Goods) o1;
                Goods goods2 = (Goods) o2;
                if (goods1.getName().equals(goods2.getName())){
    
    
                    return -Double.compare(goods1.getPrice(), goods2.getPrice());
                }else {
    
    
                    return goods1.getName().compareTo(goods2.getName());
                }
            }
            throw new RuntimeException("输入的数据类型不一致");
        }
    });

    System.out.println(Arrays.toString(arr));
}

Goods.java


/**
 * @author: Arbicoral
 * @create: 2023-05-07 15:04
 * @Description: Comparable接口的使用
 */
public class Goods implements Comparable {
    
    
    private String name;
    private double price;

    public Goods(){
    
    }
    public Goods(String name, double price){
    
    
        this.name = name;
        this.price = price;
    }

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

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

    public String getName() {
    
    
        return name;
    }

    public double getPrice() {
    
    
        return price;
    }

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

    /*
    指明商品比较大小的方式: 按照价格从低到高排序,再按照产品名称从低到高排序
     */
    @Override
    public int compareTo(Object o) {
    
    
        if (o instanceof Goods){
    
    
            //强转
            Goods goods = (Goods) o;
            //比较
            if (this.price > goods.price){
    
    
                return 1;
            } else if (this.price == goods.price) {
    
    
//                return 0;
//                return -this.name.compareTo(goods.name);//使用compareTo(obj)直接比较
                return Double.compare(this.price, goods.price);
            }else {
    
    
                return -1;
            }
        }
        throw new RuntimeException("传入的数据类型不一致!");
    }
}

Comparable接口与Comparator接口的使用的对比:

  • Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
  • Comparator接口属于临时性的比较。

六、System类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。

由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便 的进行调用。

成员方法:

* native long currentTimeMillis():
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时
间和GMT时间(格林威治时间)197011000秒所差的毫秒数。

* void exit(int status):
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表
异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。

* void gc():
该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则
取决于系统中垃圾回收算法的实现以及系统执行时的情况。

* String getProperty(String key):
该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见
的属性名以及属性的作用如下表所示:
image.png

基本代码如下:

public void test1(){
    
    
    String javaVersion = System.getProperty("java.version");
    System.out.println("java的version: " + javaVersion);
    String javaHome = System.getProperty("java.home");
    System.out.println("java的home: " + javaHome);
    String osName = System.getProperty("os.name");
    System.out.println("os的name: " + osName);
    String osVersion = System.getProperty("os.version");
    System.out.println("os的version: " + osVersion);
    String userName = System.getProperty("user.name");
    System.out.println("user的name: " + userName);
    String userHome = System.getProperty("user.home");
    System.out.println("user的home: " + userHome);
    String userDir = System.getProperty("user.dir");
    System.out.println("user的dir: " + userDir);
}

七、Math类

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

abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,doble b) a的b次幂
log 自然对数
exp e为底指数
max(double a,double b)
min(double a,double b)
random() 返回0.0到1.0的随机数
long round(double a) double型数据a转换为long型(四舍五入)
toDegrees(double angrad) 弧度—>角度
toRadians(double angdeg) 角度—>弧度

八、BigInteger与BigDecimal

image.pngimage.pngimage.png

猜你喜欢

转载自blog.csdn.net/Miss_croal/article/details/132951372