一、比较器
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 }