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命令 |
代码演示:
java
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);//true
System.out.println(r1.availableProcessors());
// 1GB = 1024MB = 1024×1024 KB = 1024×1024×1024 bytes
System.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方法
代码演示:
测试类
java
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@776ec8df
Student 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类
java
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()方法
@Override
public String toString() {
return getName() +","+getAge();
}
}
equals()方法详解:
介绍:
Object中的equals方法比较的是地址值是否相等
一般来讲地址值对于我们意义不大,所以需要重写,比较对象内部的属性值是否相等
代码演示:
测试类
java
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类
java
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;
}
@Override
public 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 方法,该方法先判断参数是否为字符串
如果是字符串,再比较内部的属性是否相同,如果参数不是字符串,直接返回 false
sb 是 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接口,表示当前类的对象可以被克隆,没有实现,则当前类的对象不能克隆
代码演示:
测试类
java
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类
java
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方法返回属性值
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", data=" + Arrays.toString(data) +
'}';
}
//重写clone方法
@Override
protected 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的结果相反 |
代码演示:
java
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));//true
System.out.println(Objects.isNull(s2));//false
System.out.println(Objects.nonNull(s1));//false
System.out.println(Objects.nonNull(s2));//true
}
}