Java基础(四)——常用类

一、比较器

1、介绍

  在Java中经常会涉及到对象数组的排序问题,那么,就需要让对象具有可比性。
  Java实现对对象排序的方式有两种:
  自然排序:java.lang.Comparable
  定制排序:java.util.Comparator

2、自然排序(Comparable)

  代码示例:将学生按身高排序

 1 public class Student implements Comparable<Student> {
 2     private String name;
 3     private int age;
 4     // 学生身高
 5     private int height;
 6 
 7     @Override
 8     public int compareTo(Student o) {
 9         // 默认升序. 需要降序的话, o.height - this.height 即可
10         return this.height - o.height;
11     }
12     // 省略setter getter
13 }
 1 // 测试类
 2 public class Main {
 3     public static void main(String[] args) {
 4         Student[] arr = new Student[5];
 5         arr[0] = new Student("小0", 10, 178);
 6         arr[1] = new Student("小1", 10, 181);
 7         arr[2] = new Student("小2", 10, 170);
 8         arr[3] = new Student("小3", 10, 190);
 9         arr[4] = new Student("小4", 10, 160);
10         Arrays.sort(arr);
11 
12         System.out.println(Arrays.toString(arr));
13     }
14 }

  JDK源码中,Comparable 的典型实现,默认都是从小到大排列的。
  String:按照字符串中字符的Unicode值进行比较。
  Character:按照字符的Unicode值来进行比较。
  数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较。
  Boolean:true 对应的包装类实例大于 false 对应的包装类实例。
  Date、Time等:后面的日期时间比前面的日期时间大。

3、定制排序(Comparator)

  代码示例:将学生按身高排序

 1 public class Main {
 2     public static void main(String[] args) {
 3         Student[] arr = new Student[5];
 4         arr[0] = new Student("小0", 10, 178);
 5         arr[1] = new Student("小1", 10, 181);
 6         arr[2] = new Student("小2", 10, 170);
 7         arr[3] = new Student("小3", 10, 190);
 8         arr[4] = new Student("小4", 10, 160);
 9         
10         Arrays.sort(arr, new Comparator<Student>() {
11             @Override
12             public int compare(Student o1, Student o2) {
13                 // 升序
14                 return o1.getHeight() - o2.getHeight();
15             }
16         });
17 
18         System.out.println(Arrays.toString(arr));
19     }
20 }
21 
22 class Student {
23     private String name;
24     private int age;
25     // 学生身高
26     private int height;
27 
28     // 省略setter getter
29 }

二、日期

1、时间戳

1 final long l = System.currentTimeMillis();

  返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。

2、Date

  表示特定的瞬间,精确到毫秒
  代码示例:

 1 public class Main {
 2     public static void main(String[] args) {
 3         Date date = new Date();
 4         System.out.println(date);
 5 
 6         System.out.println(date.getTime());
 7 
 8         Date date1 = new Date(date.getTime());
 9 
10         System.out.println(date1.getTime());
11         System.out.println(date1.toString());
12     }
13 }

3、SimpleDateFormat

  Date类的API不易于国际化,大部分被废弃了,SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
  代码示例(重要):日期格式化

 1 // 不写注释也能看懂的代码
 2 public static Date parse(String datetimeStr, String format) {
 3     try {
 4         return new SimpleDateFormat(format).parse(datetimeStr);
 5     } catch (Exception e) {
 6         return null;
 7     }
 8 }
 9 
10 public static String format(Date date, String format) {
11     return new SimpleDateFormat(format).format(date);
12 }

4、Calendar

  Calendar是一个抽象基类,用于完成日期字段之间相互操作的功能。线程安全,因为是单例的。
  代码示例:方法的使用
  获取月份时:一月是0,二月是1,……12月是11。
  获取星期时:周日是1,周二是2,……周六是7。

 1 // 不写注释也能看懂的代码
 2 public class Main {
 3 
 4     public static void main(String[] args) {
 5         String fromDate = "2016-7-29 20:00:04";
 6         String toDate = "2000-09-30 20:00:03";
 7         String dateFormat = "yyyy-MM-dd HH:mm:ss";
 8         
 9         //方式一:创建其子类(GregorianCalendar)的对象
10         //方式二:调用其静态方法getInstance()
11         Calendar calendar = Calendar.getInstance();
12         calendar.setTime(dateFromString(fromDate, dateFormat));
13 
14         // 获取年
15         System.out.println("YEAR== " + calendar.get(Calendar.YEAR));
16         // 获取月 0~11
17         System.out.println("MONTH== " + calendar.get(Calendar.MONTH));
18         // 获取日
19         System.out.println("DATE== " + calendar.get(Calendar.DATE));
20         // 当前是一年的第几天
21         System.out.println("DAY_OF_YEAR== " + calendar.get(Calendar.DAY_OF_YEAR));
22         // 当前是本月的第几天
23         System.out.println("DAY_OF_MONTH== " + calendar.get(Calendar.DAY_OF_MONTH));
24         // 周几:星期天 1
25         System.out.println("DAY_OF_WEEK== " + calendar.get(Calendar.DAY_OF_WEEK));
26         // 在本月属于第几周
27         System.out.println("DAY_OF_WEEK_IN_MONTH== " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
28         // 12小时制
29         System.out.println("HOUR == " + calendar.get(Calendar.HOUR));
30         // 24小时制
31         System.out.println("HOUR_OF_DAY == " + calendar.get(Calendar.HOUR_OF_DAY));
32         System.out.println("MINUTE == " + calendar.get(Calendar.MINUTE));
33         System.out.println("SECOND == " + calendar.get(Calendar.SECOND));
34         // 当月有多少天
35         System.out.println("ActualMaximum == " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
36     }
37 
38     public static Date dateFromString(String dateString, String dateFormat) {
39         try {
40             return new SimpleDateFormat(dateFormat).parse(dateString);
41         } catch (Exception e) {
42             System.out.println("日期格式解析错误!");
43             return null;
44         }
45     }
46 }
47 
48 // 结果
49 YEAR== 2016
50 MONTH== 6
51 DATE== 29
52 DAY_OF_YEAR== 211
53 DAY_OF_MONTH== 29
54 DAY_OF_WEEK== 6
55 DAY_OF_WEEK_IN_MONTH== 5
56 HOUR == 8
57 HOUR_OF_DAY == 20
58 MINUTE == 0
59 SECOND == 4
60 ActualMaximum == 31

 

 1 public class Main {
 2     public static void main(String[] args) {
 3         Calendar calendar = Calendar.getInstance();
 4 
 5         // get()
 6         int days = calendar.get(Calendar.DAY_OF_MONTH);
 7         System.out.println(days);
 8         System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
 9 
10         // set().calendar可变性
11         calendar.set(Calendar.DAY_OF_MONTH, 22);
12         days = calendar.get(Calendar.DAY_OF_MONTH);
13         System.out.println(days);
14 
15         // add().在当前时间减3天
16         calendar.add(Calendar.DAY_OF_MONTH, -3);
17         days = calendar.get(Calendar.DAY_OF_MONTH);
18         System.out.println(days);
19 
20         // getTime():日历类---> Date
21         Date date = calendar.getTime();
22         System.out.println(date);
23 
24         // setTime():Date ---> 日历类
25         calendar.setTime(new Date());
26         days = calendar.get(Calendar.DAY_OF_MONTH);
27         System.out.println(days);
28     }
29 }

三、System

1、介绍

  描述系统的一些信息。System类中的方法和属性都是静态的。
  out:标准输出,默认是控制台。
  in:标准输入,默认是键盘。
  err:标准错误输出流(显示器)。
  Properties:是Hashtable的子类,也就是Map集合的一个子类对象,可以通过map的方法取出该集合中的元素。该集合中存储的都是字符串,没有泛型定义。

2、方法

  Properties getProperties():获取系统属性信息。
  setProperties(String key, String value):在系统中自定义一些特有信息
  String getProperty(String key):获取指定属性信息。
  void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。
  void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。

  代码示例:打印一些系统信息

 1 // 打印出来看一下就知道是什么
 2 public class Main {
 3     public static void main(String[] args) {
 4         String javaVersion = System.getProperty("java.version");
 5         System.out.println("java version:" + javaVersion);
 6 
 7         String javaHome = System.getProperty("java.home");
 8         System.out.println("java home:" + javaHome);
 9 
10         String osName = System.getProperty("os.name");
11         System.out.println("os name:" + osName);
12 
13         String osVersion = System.getProperty("os.version");
14         System.out.println("os version:" + osVersion);
15 
16         String userName = System.getProperty("user.name");
17         System.out.println("user name:" + userName);
18 
19         String userHome = System.getProperty("user.home");
20         System.out.println("user home:" + userHome);
21 
22         String userDir = System.getProperty("user.dir");
23         System.out.println("user dir:" + userDir);
24 
25         final Properties properties = System.getProperties();
26         final Set<Object> set = properties.keySet();
27         for (Object o : set) {
28             String value = (String) properties.get(o);
29             System.out.println(o + "-----" + value);
30         }
31     }
32 }

  系统中常见的属性名以及属性的作用如下表所示:

属性名
属性说明
java.version
Java运行时环境版本
java.home
Java安装目录
os.name
操作系统的名称
os.version
操作系统的版本
user.name
用户的账户名称
user.home
用户的主目录
user.dir
用户的当前工作目录

四、Runtime

1、介绍

  每个应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前运行时。应用程序不能创建自己的Runtime类实例。

2、方法

  这是一个经典的饿汉式单例模式。

  代码示例:用记事本打开 aa.txt

1 public class Main {
2     public static void main(String[] args) throws Exception {
3         final Process process = Runtime.getRuntime().exec("notepad.exe F:\\aa.txt");
4         // 线程睡眠4s
5         Thread.sleep(4000);
6         // 线程销毁
7         process.destroy();
8     }
9 }

五、Math

1、介绍

  Math类包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数。

2、方法

  new Random().nextInt(10):返回 [0,10) 的整数,伪随机数。
  random():返回[0,1)的伪随机数

  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):取最小
  long round(double a):double型数据a转换为long型(四舍五入)
  toDegrees(double angrad):弧度—>角度
  toRadians(double angdeg):角度—>弧度

六、BigInteger

1、介绍

  Integer类作为 int 的包装类,能存储的最大整型值为2^31 - 1,Long类也是有限的,最大为2^63 - 1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类,都无能为力,更不用说进行运算了。

  BigInteger可以表示不可变的任意精度的整数。

2、方法

  BigInteger abs():返回此 BigInteger 的绝对值
  BigInteger add(BigInteger val) :返回其值为 (this + val)
  BigInteger subtract(BigInteger val) :返回其值为 (this - val)
  BigInteger multiply(BigInteger val) :返回其值为 (this * val)
  BigInteger divide(BigInteger val) :返回其值为 (this / val) 。整数相除只保留整数部分。
  BigInteger remainder(BigInteger val) :返回其值为 (this % val)
  BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。
  BigInteger pow(int exponent) :返回其值为 (this^exponent)

七、BigDecimal

1、介绍

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

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

2、方法

  public BigDecimal add(BigDecimal augend)
  public BigDecimal subtract(BigDecimal subtrahend)
  public BigDecimal multiply(BigDecimal multiplicand)
  public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

  代码示例:计算

 1 public class Main {
 2     public static void main(String[] args) {
 3         BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
 4         BigDecimal bd = new BigDecimal("12435.351");
 5         BigDecimal bd2 = new BigDecimal("11");
 6         System.out.println(bi);
 7 
 8         // System.out.println(bd.divide(bd2));
 9         // 表示四舍五入.其他含义自行百度
10         System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
11         System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));
12     }
13 }

作者:Craftsman-L

本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。

如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!

posted @ 2020-10-28 23:11  Craftsman-L  阅读(58)  评论(0编辑  收藏  举报