Java—— 常见API介绍 第二期
Runtime
说明:
Runtime表示当前虚拟机的运行环境
获取Runtime对象的方法是静态的,可以用类名调用
不能用new关键字创建Runtime对象,只能调用获取Runtime对象的方法获取对象
其他的方法不是静态的,不能直接用类名调用,需要用Runtime的对象去调用
常用方法:
方法名 | 说明 |
public static Runtime getRuntime () | 获取当前系统的运行环境对象 |
public void exit (int status) | 停止虚拟机 |
public int availableProcessors () | 获得CPU的线程数 |
public long maxMemory () | JVM能从系统中获取总内存大小(单位byte) |
public long totalMemory () | JVM已经从系统中获取总内存大小(单位byte) |
public long freeMemory ( ) | JVM剩余内存大小(单位byte) |
public Process exec (string command) | 运行cmd命令 |
代码演示:
public class Test4 {public static void main(String[] args) throws IOException {//public static Runtime getRuntime() 获取当前系统的运行环境对象//public void exit (int status) 停止虚拟机//public int availableProcessors () 获得CPU的线程数//public long maxMemory () JVM能从系统中获取总内存大小(单位byte)//public long totalMemory () JVM已经从系统中获取总内存大小(单位byte)//public long freeMemory ( ) JVM剩余内存大小(单位byte)//public Process exec (string command) 运行cmd命令//获取Runtime的对象,不管获取几个对象,指的都是同一地址值//因为一台电脑只有一个系统运行环境Runtime r1 = Runtime.getRuntime();Runtime r2 = Runtime.getRuntime();System.out.println(r1 == r2);//trueSystem.out.println(r1.availableProcessors());// 1GB = 1024MB = 1024×1024 KB = 1024×1024×1024 bytesSystem.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);//shutdown:关机//参数://-s:默认1分钟后关机//-s -t:指定关机时间 单位:秒//-a:取消关机操作//-r:关机并重启Runtime.getRuntime().exec("shutdown -s -t 3600");Runtime.getRuntime().exit(0);}
}
Object
说明:
Object是Java中的顶级父类。所有的类都直接或间接的继承于Object类。
Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法。
构造方法:
方法名 | 说明 |
public Object () | 只有空参构造 |
常见成员方法:
方法名 | 说明 |
public string toString ( ) | 返回对象的字符串表示形式 |
public boolean equals (0bject obj) | 比较两个对象是否相等 |
protected object clone (int a) | 对象克隆 |
toString()方法详解:
介绍:
因为
Object类中的toString方法返回的是对象的地址值
打印一个对象的时候,底层默认调用toString方法
所以默认情况下,打印一个对象打印的就是该对象的地址值
但是地址值对于我们是没什么意义的
想要看到对象内部的属性值,需要重写父类object类中的toString方法
代码演示:
测试类
public class Test {public static void main(String[] args) {//Object的toString()方法返回的是对象地址值Object o = new Object();String str1 = o.toString();System.out.println(str1);//java.lang.Object@776ec8dfStudent stu = new Student("zhangsan", 23);String str2 = stu.toString();System.out.println(str2);//包名.Student@3b07d329//打印一个对象的时候,底层默认调用toString()方法,所以结果也为地址值System.out.println(stu);//包名.Student@3b07d329//重写toString()方法后,打印对象System.out.println(stu);//zhangsan,23}
}
Student类
import java.util.Objects;public class Student {private String name;private int age;public Student(){}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//重写toString()方法@Overridepublic String toString() {return getName() +","+getAge();}
}
equals()方法详解:
介绍:
Object中的equals方法比较的是地址值是否相等
一般来讲地址值对于我们意义不大,所以需要重写,比较对象内部的属性值是否相等
代码演示:
测试类
public class Test {public static void main(String[] args) {Student stu1 = new Student("zhangsan",23);Student stu2 = new Student("zhangsan",23);boolean flag = stu1.equals(stu2);//Object中的equals()方法比较的是两个对象的地址值是否相同System.out.println(flag);//false//重写equals方法后,比较对象内部的属性值是否相等System.out.println(flag);//true}
}
Student类
import java.util.Objects;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}}
面试题分析:
String s = "abc";
StringBuilder sb = StringBuilder("abc");判断 s.equals(sb) 和 sb.equals(s) 的结果
System.out.println(s.equals(sb)); // false
因为 equals 方法是被 s 调用的,s 是字符串
所以 equals 方法要看 String 类中的
String 重写了 equals 方法,该方法先判断参数是否为字符串
如果是字符串,再比较内部的属性是否相同,如果参数不是字符串,直接返回 falsesb 是 StringBuilder 类型,不是字符串,所以直接返回 false
System.out.println(sb.equals(s)); // false
因为 equals 方法是被 sb 调用的,而 sb 是 StringBuilder类型
所以 equals 方法要看 StringBuilder 中的
StringBuilder 没有重写equals方法
默认使用的是 object 中的
在 object 中比较的是两个对象的地址值
而这里的 s 和 sb 记录的地址值是不一样的,所以结果返回 false
clone()方法详解:
介绍:
1.把A对象的属性值完全拷贝到B对象,也叫对象拷贝,对象复制
2.clone()方法是protected修饰的,所以A类需要重写该方法,方法调用父类Object的clone()方法,这样本包的其它类才能使用clone()方法
3.A类需要实现Cloneable接口,该接口里面没有抽象方法,表示这是一个标记性接口
实现了Cloneable接口,表示当前类的对象可以被克隆,没有实现,则当前类的对象不能克隆
代码演示:
测试类
public class Test {public static void main(String[] args) throws CloneNotSupportedException {int[] arr = {1,2,3,4,5,6,7,8,9,10};User u1 = new User(1,"zhangsan",arr);//调用方法进行克隆User u2 = (User) u1.clone();System.out.println(u1);//User{id=1, userName='zhangsan', data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}System.out.println(u2);//User{id=1, userName='zhangsan', data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}}
}
User类
import java.util.Arrays;//Cloneable标记型接口
public class User implements Cloneable{private int id;private String userName;private int[] data;public User() {}public User(int id, String userName, int[] data) {this.id = id;this.userName = userName;this.data = data;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int[] getData() {return data;}public void setData(int[] data) {this.data = data;}//重写toString方法返回属性值@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", data=" + Arrays.toString(data) +'}';}//重写clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {//调用父类的clone方法return super.clone();}
}
小扩展:
浅克隆:
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来注:Object 的 clone是浅克隆
深克隆:
基本数据类型拷贝过来
字符串复用
引用数据类型会重新创建新的
Objects
说明:
是一个对象工具类,提供了一些操作对象的方法
常用方法:
方法名 | 说明 |
public static boolean equals(0bject a, object b) | 先做非空判断, 比较两个对象 |
public static boolean isNull(Object obj) | 判断对象是否为null, 为null返回true ,反之返回false |
public static boolean nonNull(Object obj) | 判断对象是否为null,跟isNul1的结果相反 |
代码演示:
public class Test {public static void main(String[] args) {//public static boolean equals(0bject a, object b) 先做非空判断,比较两个对象//public static boolean isNull(Object obj) 判断对象是否为null,为null返回true ,反之返回false//public static boolean nonNull(Object obj) 判断对象是否为null,跟isNul1的结果相反Student s1 = null;Student s2 = new Student("zhangsan", 23);boolean flag = Objects.equals(s1, s2);System.out.println(flag);//false// 先做非空判断 s1如果为空,直接返回false//s1不为空,则调用 s1.equals(s2)//s1如果重写了equals方法,则比较属性值//s1没有重写equals方法,则比较地址值System.out.println(Objects.isNull(s1));//trueSystem.out.println(Objects.isNull(s2));//falseSystem.out.println(Objects.nonNull(s1));//falseSystem.out.println(Objects.nonNull(s2));//true}
}