java常用类 比较器/system/math/big

醉酒当歌 提交于 2019-11-30 21:37:02

Java 比较器

  自然排序:java.lang.Comparable

  定制排序:java.util.Comparator

 

自然排序:java.lang.Comparable

   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 一致。
  
Comparable 的典型实现:(默认都是从小到大排列的)

  String:按照字符串中字符的Unicode值进行比较

  Character:按照字符的Unicode值来进行比较

  数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值 大小进行比较

  Boolean:true 对应的包装类实例大于 false 对应的包装类实例

  Date、Time等:后面的日期时间比前面的日期时间大

class Goods implements Comparable { 
private String name; private double price;
//按照价格,比较商品的大小 
@Override 
public int compareTo(Object o) { 
if(o instanceof Goods) {
 Goods other = (Goods) o;
 if (this.price > other.price) {
 return 1; 
} else if (this.price < other.price) {
 return -1;
 } 
return 0; 
} throw new RuntimeException("输入的数据类型不一致"); 
} 
//构造器、getter、setter、toString()方法略
}
public class ComparableTest{
public static void main(String[] args) {
Goods[] all = new Goods[4]; 
all[0] = new Goods("《红楼梦》", 100);
 all[1] = new Goods("《西游记》", 80); 
all[2] = new Goods("《三国演义》", 140); 
all[3] = new Goods("《水浒传》", 120);
Arrays.sort(all);
System.out.println(Arrays.toString(all));
}
}

定制排序:java.util.Comparator
  当元素的类型没有实现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 提供排序

Goods[] all = new Goods[4]; 
all[0] = new Goods("War and Peace", 100); 
all[1] = new Goods("Childhood", 80);
 all[2] = new Goods("Scarlet and Black", 140); 
all[3] = new Goods("Notre Dame de Paris", 120);
Arrays.sort(all, new Comparator() {
@Override 
public int compare(Object o1, Object o2) { Goods g1 = (Goods) o1; Goods g2 = (Goods) o2;
return g1.getName().compareTo(g2.getName());
}
});
System.out.println(Arrays.toString(all));

System类

 

 

 

 

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类

 

BigInteger与BigDecimal

BigInteger类

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

 

  BigDecimal类

  一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类。 

  BigDecimal类支持不可变的、任意精度的有符号十进制定点数。

  构造器
   public BigDecimal(double val)

   public BigDecimal(String val)
  常用方法
  public BigDecimal add(BigDecimal augend) 

  public BigDecimal subtract(BigDecimal subtrahend) 

  public BigDecimal multiply(BigDecimal multiplicand)

  public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

public void testBigInteger() { 
BigInteger bi = new BigInteger("12433241123"); 
BigDecimal bd = new BigDecimal("12435.351"); 
BigDecimal bd2 = new BigDecimal("11"); 
System.out.println(bi);
 // System.out.println(bd.divide(bd2)); 
System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));System.out.println(bd.divide(bd2, 15, BigDecimal.ROUND_HALF_UP));
 }

 



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!