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); Listlist = 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); Listlist = 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)); } }