Java学习笔记09(3)-常用类之Java比较器和其他常用类
一、Java比较器
Java实现对象排序有两种方式:
- 自然排序:
java.lang.Comparable
- 定制排序:
java.util.Comparator
1、Comparable
Comparable
接口强行对实现它的每个类的对象进行整体排序,这种排序称为类的自然排序。
实现Comparable
的类,必须实现compareTo(Object obj)
方法,从小到大的排序规则如下:
- 如果当前对象this大于obj,返回正整数。
- 如果当前对象this小于obj,返回负整数。
- 如果当前对象this等于obj,返回0。
以上规则是从小到大排列,如果想从大到小排列,则正负和上面相反。
String
类、包装类等类实现了Comparable
接口,并实现了compareTo()
方法,进行了从小到大的排列。
实现Comparable
接口的对象列表可以通过Collections.sort
或Arrays.sort
进行自动排序,比如String
数组就可以自动比较大小,自动排序:
1 |
|
2、Comparator
当元素的类型没有实现java.lang.Comparable
接口而又不方便修改代码,或者实现了java.lang.Comparable
接口的排序规则不适合当前的操作,那么可以考虑使用Comparator
的对象来排序,强行对多个对象进行整体排序的比较。
实现Comparator
接口需要实现其compare(Obj o1, Obj o2)
方法,规则和compareTo(Object obj)
相同。
同样地,可以将Comparator
传递给sort
方法(如Collections.sort
或Arrays.sort
),控制排序规则。还可以使用Comparator
来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection
提供排序。
举例:
1 |
|
Comparable
接口的方式一旦指定,保证Comparable
接口实现类的对象在任何位置都可以比较大小。Comparator
接口属于临时性的比较。
二、System类
java.lang.System
类代表系统,系统级的很多属性和控制方法都放置在该类的内部。
System
类的构造器是private
的,因此无法创建该类的对象,其内的成员变量和成员方法都是static
的,可以方便调用。
成员变量:
in
:标准输入流out
:标准输出流err
:标准错误输出流
成员方法:
native long currentTimeMillis()
:返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。void exit(int status)
:退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。void gc()
:请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。String getProperty(String key)
:获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下:java.version
:Java运行时环境版本java.home
:Java安装目录os.name
:操作系统的名称os.version
:操作系统的版本user.name
:用户名称user.home
:用户的主目录user.dir
:用户的当前目录
代码举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class OtherClass {
@Test
public void test1() {
System.out.println("java的version:" + System.getProperty("java.version"));
System.out.println("java的home:" + System.getProperty("java.home"));
System.out.println("os的name:" + System.getProperty("os.name"));
System.out.println("os的version:" + System.getProperty("os.version"));
System.out.println("user的name:" + System.getProperty("user.name"));
System.out.println("user的home:" + System.getProperty("user.home"));
System.out.println("user的dir:" + System.getProperty("user.dir"));
}
}
/*以上代码输出结果为:
java的version:15.0.1
java的home:D:\JDK15
os的name:Windows 10
os的version:10.0
user的name:xxx
user的home:C:\Users\xxx
user的dir:D:\IntelliJ IDEA\Project\Java_shangguigu\JavaSenior\day04
*/
三、Math类
java.lang.Math
类提供了一系列静态方法用于科学计算,其方法的参数和返回值类型一般为double
型:
abs
:绝对值acos
/asin
/atan
/cos
/sin
/tan
:三角函数sqrt
:平方根pow(double a, double b)
:求a的b次幂log
:自然对数exp
:e为底数max(double a, double b)
:求a、b之间的最大值min(double a, double b)
:求a、b之间的最小值random()
:返回0.0到1.0之间的随机数long round(double a)
:double型数据a转换为long型(四舍五入)toDegrees(double angrad)
:弧度—>角度toRadians(double angdeg)
:角度—>弧度
四、BigInteger与BigDecimal
1、BigInteger
Long
是long
的包装类,最大值为,如果是再大的数,就需要使用BigInteger
类。java.math.BigInteger
表示不可变的任意精度的整数。BigInteger
类用int[]
来模拟非常大的整数,BigInteger
类对象进行计算的时候只能使用实例方法。
构造器:
BigInteger(String val)
:根据字符串构建BigInteger对象
常用方法:
public BigInteger abs()
:返回此BigInteger的绝对值的BigInteger。BigInteger add(BigInteger val)
:返回其值为(this + val)的BigIntegerBigInteger subtract(BigInteger val)
:返回其值为(this-val)的BigIntegerBigInteger multiply(BigInteger val)
:返回其值为(this * val)的BigIntegerBigInteger divide(BigInteger val)
:返回其值为(this / val)的BigInteger。整数相除只保留整数部分。BigInteger remainder(BigInteger val)
:返回其值为(this % val)的BigInteger。BigInteger[] divideAndRemainder(BigInteger val)
:返回包含(this / val)后跟(this % val)的两个BigInteger的数组。BigInteger pow(int exponent)
:返回其值为this的exponent次幂的BigInteger。
BigInteger和基本数据类型转换:
- 转换为
byte
:byteValue()
- 转换为
short
:shortValue()
- 转换为
int
:intValue()
- 转换为
long
:longValue()
- 转换为
float
:floatValue()
- 转换为
double
:doubleValue()
直接调用以上方法,如果超出范围,不会抛出异常,会导致结果不正确。
调用
xxxValueExact()
方法,转换超出范围时,会抛出ArithmeticException
异常,以保证结果准确。
2、BigDecimal
java.math.BigDecimal
表示一个任意大小且精度完全准确的浮点数,同样是不可变的。
BigDecimal
用scale()
表示小数位数,小数末尾是0的时候也计算在内。如果调用scale()
方法,返回值为负数,比如-2
,表示这个数是整数,并且末尾有两个0。
构造器:
public BigDecimal(double val)
public BigDecimal(String val)
常用方法:
public BigDecimal setScale(int newScale)
:设置当前BigDecimal的精度,如果比原始值低,根据指定的处理方式进行四舍五入或者直接截断。public BigDecimal stripTrailingZeros()
:将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimalpublic BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
:如果除不尽,会报ArithmeticException
异常,此时必须指定精度以及如何截断。
说明:
- 通过源码可知,一个
BigDecimal
是通过一个BigInteger
和一个scale
来表示的,即BigInteger
表示一个完整的整数,而scale
表示小数位数。 - 比较两个
BigDecimal
数的大小,应该使用compareTo()
方法,根据两个值的大小分别返回-1
、1
和0
,分别表示小于、大于和等于。 compareTo()
比较的是两个数值的大小,而equals()
方法不但要求两个BigDecimal
的值相等,还要求它们的scale()
相等:
1 |
|
- 本文作者:Kangshitao
- 本文链接:http://kangshitao.github.io/2021/04/05/java-note-0903/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!