java 常用类
System
System 表示系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于 java.lang 包。
由于该类的 构造方法 被 private 修饰的,所以无法创建对象,也就是无法实例化该类。其内部的成员方法和成员变量都是被 static 修饰的,所以可以通过类名直接调用。
System 中包含了 in 、 out 、 err 三个成员变量,分别表示标准输入流、标准输出流和标准错误输出流。
示例:通过键盘录入年龄
Scanner scanner = new Scanner(System.in);
boolean flag = true;
while(flag) {
try {
System.out.println("请输入您的年龄:");
String line = scanner.nextLine();
final int num = Integer.parseInt(line);
if(num > 0 && num < 120) {
System.out.println("您的年龄为:" + num);
flag = false;
} else {
System.err.println("您输入的年龄不符合常规!!!");
}
} catch ( Exception e) {
System.err.println("您输入的数据类型错误:" + e.getMessage());
}
}
scanner.close();
System 常用API:
array copy 数组拷贝:
int[] arrs = {1, 2, 3, 4, 5, 6};
System.out.println(Arrays.toString(arrs)); // logs: [1, 2, 3, 4, 5, 6]
int[] tmps = new int[4];
System.arraycopy(arrs, 2, tmps, 0, 4);
System.out.println(Arrays.toString(tmps)); // logs: [3, 4, 5, 6]
currentTimeMillis 获取当前时间的毫秒值:
long startTimeMillis = System.currentTimeMillis();
// 打印九九乘法表
for(int i=1; i<=9; i++) {
for(int j = 1; j<=i; j++) {
System.out.printf("%d * %d = %d tt", j, i, i*j);
}
System.out.println();
}
long stopTimeMillis = System.currentTimeMillis();
// 打印九九乘法表所耗费的毫秒值
System.out.println((stopTimeMillis - startTimeMillis) + "ms");
getProperty 获取系统属性:
// 获取系统属性配置对象
Properties properties = System.getProperties();
properties.list(System.out); // 打印所有的系统属性
// 获取指定的系统属性
String osName = System.getProperty("os.name"); // 系统名
String userName = System.getProperty("user.name"); // 用户名
System.out.println(osName);
System.out.println(userName);
CharSequence
char Sequence 是一个接口,表示 char 值的一个可读序列,此接口对许多不同种类的 Char 序列提供统一的自读访问。
CharSequence 与 String 都能用于定义字符串,但 CharSequence 的值是可读可写序列,而 String 的值是只读序列。
示例:
// 定义字符串
CharSequence cs = "ijunfu";
System.out.println(cs.length()); // logs: 6
System.out.println(cs.charAt(2)); // logs: u
// 声明一个CharSequence类型的字符串缓冲区
CharSequence sb = new StringBuffer("ijunfu");
System.out.println(sb); // logs: ijunfu
sb = ((StringBuffer)sb).append(".Wei");
System.out.println(sb); // logs: ijunfu.Wei
runtime
Runtime 类封装了运行时环境。每个Java应用程序都有一个 Runtime 类实例,使应用程序能够与其运行环境相连。
Runtime 类通过 total Memory () 和 freeMemory() 方法可以知道对象的堆内存有多大、还剩多少。
示例:
Runtime runtime = Runtime.getRuntime();
int availableProcessors = runtime.availableProcessors();
System.out.printf("处理器数:%dn", availableProcessors);
long totalMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
System.out.printf("总内存: %d byte n", totalMemory);
System.out.printf("剩余内存:%d byten", freeMemory);
Cleaner
Cleaner 类负责清理对象,替代 finialize() 方法,是在 jdk 9+ 才提供的一个对象清理操作。
jdk 9之前:
class Member {
public Member() {
System.out.println("【构造】你出生时满园芳香,群蝶飞舞。");
}
@ Override
protected void finalize() throws Throwable {
System.out.println("【消亡】躺在病床上,看着日渐消瘦的身躯");
super. finalize ();
}
}
Member member = new Member();
member = null;
System.gc(); // 清理
jdk 9之后:
class Member implements Runnable {
public Member() {
System.out.println("【构造】你出生时满园芳香,群蝶飞舞。");
}
@Override
public void run() {
System.out.println("【回收】你死亡后,被扔到荒郊,甚是悲凉!");
}
}
class MemberCleaning implements AutoCloseable {
// 创建一个清除对象
private final static Cleaner cleaner = Cleaner.create();
private Member member; // 被清理的对象
private Cleaner.Cleanable cleanable;
public MemberCleaning() {
this.member = new Member();
this.cleanable = cleaner.register(this, this.member);
}
@Override
public void close() throws Exception {
this.cleanable.clean();
}
}
try(MemberCleaning mc = new MemberCleaning()) {
// TODO
} catch (Exception e) {
e.printStackTrace();
}
Cloneable
和现实生活中的克隆一样,克隆就是复制一个一模一样的对象出来。
clone() 方法是来自 Object 类。一个对象要实现克隆,需要实现 Cloneable 接口,只有实现这个接口后,才能实现克隆操作。
克隆分为 深度克隆 和 浅度克隆 。
深度克隆 :复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。
示例:
// 成绩
class Score implements Cloneable {
private int chinese; // 语文
private int math; // 数学
private int english; // 英语
public Score() {}
public Score(int chinese, int math, int english) {
this.chinese = chinese;
this.math = math;
this.english = english;
}
@Override
protected Score clone() throws CloneNotSupportedException {
return (Score) super.clone();
}
//... 省略getter、setter 和 toString
}
// 学生
class Student implements Cloneable {
private String name;
private Score score;
public Student() {}
public Student(String name) {
this.name = name;
}
@Override
protected Student clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
Score score = student.getScore().clone();
student.setScore(score);
return student;
}
//... 省略getter、setter 和 toString
}
// 源对象
Student student = new Student("张三");
Score score = new Score(98, 100, 92);
student.setScore(score);
System.out.println(student);
// 克隆对象
Student std = student.clone();
Score s = std.getScore();
s.setEnglish(96);
s.setMath(90);
// 源对象未被改变
System.out.println(student);
System.out.println(std);
浅度克隆 :复制对象时仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。修改上述 Student 中的 clone() 方法和测试代码如下:
// 学生
class Student implements Cloneable {
private String name;
private Score score;
public Student() {}
public Student(String name) {
this.name = name;
}
@Override
protected Student clone() throws CloneNotSupportedException {
return (Student) super.clone();
}
//... 省略getter、setter 和 toString
}
// 源对象
Student student = new Student("张三");
Score score = new Score(98, 100, 92);
student.setScore(score);
System.out.println(student);
// 克隆对象
Student std = student.clone();
std.setName("李四");
Score s = std.getScore();
s.setEnglish(96);
s.setMath(90);
// 源对象未被改变
System.out.println(student);
System.out.println(std);
从结果来看原 Student 和克隆的 Student 中的 Score 对象是一样的。即浅度克隆仅克隆了自身属性,但未克隆引用对象。
Math
Math 类中包含基本的数字操作,如指数、对数、平方根和 三角函数 等。
Math 类中包含 E 和 PI 两个静态常量,以及进行科学计算的类方法,可以直接通过类名调用。
示例:求圆的面积
int r = 4; // 半径
double area = Math.PI * Math.pow(r, 2);
System.out.println(area);
Random
Random 类用于产生随机数。
Random.nextInt(int bound) :随机数生成 [0, bound) 之间的整数。注意:是 左开右闭区间 ,可能取到 0 ,不能取到 bound 的值。
示例:产生 [1, 10] 之间的数字
Random random = new Random();
Set<Integer> set = new Hash Set<>();
for(int i=0; i<100; i++) {
set.add(random.nextInt(10) + 1);
}
System.out.println(set);
BigDecimal
BigDecimal 是一个不变的、任意精度的有符号的十进制数对象。
BigDecimal(double) 是把一个 double 类型的十进制数构造成为一个 BigDecimal 实例。
BigDecimal(String) 是把一个以 String 表示的十 进制 构造为一个 BigDecimal 实例, 推荐使用此方式 。
示例:求两个数的和
BigDecimal num = new BigDecimal("2");
num = num.add(new BigDecimal("3")); // 返回一个新的BigDecimal对象
System.out.println(num.toBigInteger()); // logs: 5
日期
Date 和 Calendar 都是关于日期的类,都在 java.util 包中。
Date 对象用来表示时间和日期,用得最多的是获取系统当前日期和时间,精确到毫秒。
Calendar 是抽象类,无法实例化。
JDK 8 新增 java.time 用于日期、时间处理。
Date 示例:
Date date = new Date();
System.out.println("今天日期是:" + date);
// 获取当前日期的毫秒值,距离1970.1.1 0的毫秒
long time = date.getTime();
System.out.println(time);
Calendar 示例:
Calendar calendar = Calendar. getInstance ();
//获取时间
int year = calendar.get(Calendar.YEAR); // 年份
int month = calendar.get(Calendar.MONTH)+1; // 月份,从0开始
int day = calendar.get(Calendar.DATE); // 天, 1~31
System.out.printf("%d-%d-%dn", year, month, day); // 日期格式: yyyy-MM-dd
// 指定具体时间
calendar.set(Calendar.DATE, 5);
day = calendar.get(Calendar.DATE); //5, 天, 1~31
System.out.printf("%d-%d-%dn", year, month, day); // 日期格式: yyyy-MM-dd
// amount 整数,日期加amount,可为正或负
calendar.add(Calendar.DATE, 1);
day = calendar.get(Calendar.DATE); //6, 天, 1~31
System.out.printf("%d-%d-%dn", year, month, day); // 日期格式: yyyy-MM-dd
Clock 用来获取指定时区的日期时间。
Clock 示例:
Clock clock = Clock.systemUTC();// 世界统一时间
System.out.println(clock.instant()); // 当前时间
System.out.println(clock.millis()); // 当前时间毫秒值
System.out.println(System.currentTimeMillis()); // 当前时间毫秒值
Duration :
Duration 示例:
int time = 59 * 59 * 12;
Duration duration = Duration.ofSeconds(time);
System.out.println(time + "秒相当于" + duration.toMinutes() + "分");
System.out.println(time + "秒相当于" + duration.toHours() + "时");
System.out.println(time + "秒相当于" + duration.toDays() + "天");
Instant :
示例:
Instant now = Instant.now();
System.out.println("当前时间:" + now);
Instant instant = now.plusSeconds(60 * 60); // 加一小时
System.out.println("修改时间:" +instant);
LocalDate :
示例:
LocalDate localDate = LocalDate.now(); // 日期格式: yyyy-MM-dd
System.out.println(localDate);
LocalDate plusYears = localDate.plusYears(1); // 加一年
System.out.println(plusYears);
UUID
Universally Unique Identifier 简写为 UUID ,即通用唯一识别码。
UUID 产生的目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定,每个人都可以创建不与其他人冲突的 UUID 。
示例:
String str = UUID.randomUUID().toString();
System.out.println(str); // logs: 83e87632-fc2e-44f8-aab4-9cebce024a95
String id = str. replace All("-", ""); // logs: 83e87632fc2e44f8aab49cebce024a95
System.out.println(id);