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命令 |

代码演示:

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
    }
}
相关推荐
MicoZone5 分钟前
6、spring-cloud-gateway
java
唐青枫9 分钟前
Java 泛型使用教程
java
xiezhr13 分钟前
SpringBoot3整合SpringSecurity6(二)SpringSecurity默默的干了些啥
java·spring boot·springboot3·springsecurity
寻找沙漠的人14 分钟前
Java 中使用 Redis
java·数据结构·数据库·redis·缓存
wang__1230015 分钟前
【无标题】
java
薛家明16 分钟前
easy-query隐式Group革命性OLAP优化JAVA下最强查询ORM没有之一子查询合并
java·orm·easy-query
岁岁岁平安1 小时前
基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)
java·spring boot·spring·java-ee·mvc·mybatis·mybatis-plus
亢从文_Jackson1 小时前
SSM--AOP 日志
java·开发语言
天天爱吃肉82181 小时前
【基于Fluent+Python耦合的热管理数字孪生系统开发:新能源产品开发的硬核技术实践】
开发语言·python·数学建模·汽车