常用API

常用API

  • Object类
  • Objects
  • 包装类
  • StringBuilder、StringBuffer
  • StringJoiner

Object类的作用:

Object类是java中所有类的祖宗类,因此,java中所有类的对象都可直接使用Object类中提供的一些方法

Object的常见方法
方法名说明
Public String toString()返回对象的字符串表示形式
Public boolean equal(Object o)判断两个对象是否相等
Public Object Clone()对象克隆
equal方法比较内容相等
Public class Student { // extends Object
    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;
    }
    // 重写父类Object的equals方法,equals默认比较两个对象的地址,重写后比较两个对象的内容
    // 比较者:s1 == this
    // 被比较者: s2 == o
    @Override
    public boolean equals(Object o) { 
        // 1. 判断两个对象是否地址一样,一样返回true
        if (this == o) return true;
        // 2. 判断o是null直接返回false,或者比较者的类型和被比较者的类型不一样,返回false
        if (o == null || getClass() != o.getClass()) return false;
        // 3. o不是null,且o一定是学生(Student)类型的时候,开始比较内容!
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
}
---------------------------------------------------------------------------------------------
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",18);
        Student s2 = new Student("张三",18);
         //默认使用父类Object的equals方法(比较地址)输出false,重写后比较内容输出true
        System.out.println(s1.equals(s2));
         // 比较地址常用方法
        System.out.println(s1 == s2);
    }
}
注意:
  • equals方法默认比较两个对象的地址,比较地址用 == 比较多,重写equals常用来比较两个对象的内容
  • toString存在的意义:toString()方法存在的意义就是为了被子类重写,以便返回对象具体的内容
  • equals存在的意义:直接比较两个对象的地址是否相同,完全可以用 == 替代equals方法,equals存在的意义就是为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容)
总结
  1. Object中的toString方法的作用是什么?存在的意义是什么?
    • 基本作用:返回对象的字符串形式
    • 存在的意义:让子类重写,以便返回子类对象的内容
  2. Object中的equals方法的作用是什么?存在的意义是什么?
    • 基本作用:默认比较两个对象的地址是否相等
    • 存在的意义:让子类重写,以便用于比较对象的内容是否相同
Object类提供的克隆方法
方法名说明
protected对象克隆

当某个对象调用这个方法时,这个方法会复制一个一模一样的新对象返回

// 浅克隆:拷贝出的新对象与原对象中的数据一模一样(引用数据类型拷贝的只是地址)
public class User implements Cloneable{ // Cloneable是一个标记类,要实现这个克隆接口,虚拟机才允许类的对象去使用克隆方法
    private int id; // 用户编码
    private String username; //用户名
    private String password; //密码
    private double[] scores; // 分数

    public User() {

    }

    public User(int id, String username, String password, double[] scores) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.scores = scores;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
    // super去调用父类Object中的clone方法
        return super.clone();
    }

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }
}
-----------------------------------------------------------------------------------------------------
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 掌握Object类提供的对象克隆的方法
        // protected Object clone():对象克隆
        User u1 = new User(1,"zhangsan","999",new double[] {99.0,99.5});
        System.out.println(u1.getId());
        System.out.println(u1.getUsername());
        System.out.println(u1.getPassword());
        System.out.println(u1.getScores());

        User u2 = (User) u1.clone();
        System.out.println(u2.getId());
        System.out.println(u2.getUsername());
        System.out.println(u2.getPassword());
        System.out.println(u2.getScores());
    }
}
输出:
1
zhangsan
999
[D@4eec7777
1
zhangsan
999
[D@4eec7777

1

// 深克隆
// 1. 对象中基本类型的数据直接拷贝 
// 2. 对象中字符串拷贝的还是地址 
// 3. 对象中还包含的其他对象,不会拷贝地址,会创建新对象
public class User implements Cloneable{ // Cloneable是一个标记类,要实现这个克隆接口,虚拟机才允许类的对象去使用克隆方法
    private int id; // 用户编码
    private String username; //用户名
    private String password; //密码
    private double[] scores; // 分数

    public User() {

    }

    public User(int id, String username, String password, double[] scores) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.scores = scores;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
    // super去调用父类Object中的clone方法
        User u2 = (User) super.clone();
        u2.scores = u2.scores.clone();
        return u2;
    }

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }
}
-----------------------------------------------------------------------------------------------------
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 掌握Object类提供的对象克隆的方法
        // protected Object clone():对象克隆
        User u1 = new User(1,"zhangsan","999",new double[] {99.0,99.5});
        System.out.println(u1.getId());
        System.out.println(u1.getUsername());
        System.out.println(u1.getPassword());
        System.out.println(u1.getScores());

        User u2 = (User) u1.clone();
        System.out.println(u2.getId());
        System.out.println(u2.getUsername());
        System.out.println(u2.getPassword());
        System.out.println(u2.getScores());
    }
}
输出:
1
zhangsan
999
[D@4eec7777
1
zhangsan
999
[D@3b07d329

2

Objects

Objects类是一个工具类,提供了很多操作对象的静态方法给我们使用

Objects类的常见方法

方法名说明
Public static boolean equals(Object a,Object b)先做非空判断,在比较两个对象
Public static boolean isNull(Object obj)判断对象是否为null,为null返回true,反之返回false
Public static boolean nonNull(Object obj)判断对象是否不为null,不为null返回true,反之返回false

Objects的equals方法源码

Public static boolean equals(object a,object b) {
	return(a==b) || (a!=null && a.equals(b)); 
}
// 官方为什么要使用Objects类的equals方法来比较两个对象是否相等
// 因为假如在将来某个对象是null,那么使用Objects类的equals方法来比较的时候,
// 不会出现空指针异常的情况,并且还会返回一个正确的结果给我们,
// 如果是拿对象自己的equals方法来比较的话,万一主调是null,
// 那系统就极容易出现bug,因此使用Objects的equals方法,更安全

包装类

包装类就是把基本数据类型包装成对象

基本数据类型对应的包装类(引用数据类型)
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean
基本类型的数据包装成对象的方案

Public Integer(int value):已过时

Public static Integer valueof(int i)

  • 自动装箱:基本数据类型可以自动转换成包装类型

  • 自动拆箱:包装类型可以自动转换成基本数据类型

public class IntegerDemo1 {
    public static void main(String[] args) {
        // 目标:掌握包装类的使用
        // Integer a1 = new Integer(12); // 已过时
        Integer a2 = Integer.valueOf(12);
        System.out.println(a2);
        // 自动装箱:可以自动把基本类型的数据转换成对象
        Integer a3 = 12;
        // 自动拆箱:可以自动把包装类型的对象转换成对象的基本数据类型
        int a4 = a3;
        // 泛型和集合不支持基本数据类型,只能支持引用数据类型
        ArrayList<Integer> List = new ArrayList<>();
        List.add(12); // 自动装箱
        List.add(13); // 自动拆箱
    }
}
包装类的其他常见操作
  1. 可以把基本数据类型的数据转换成字符串类型

    • Public static String toString(double d)

    • Public String toString()

  2. 可以把字符串类型的数值转换成数值本身对应的数据类型

    • Public static int paseInt(String s)
    • Public static Integer valueof(String s)
public class IntegerDemo2 {
    public static void main(String[] args) {
     // 包装类的其他常见操作
        // 1. 把基本类型的数据转换成字符串
        Integer a = 23;
        String rs1 = Integer.toString(a); //"23"
        System.out.println(rs1 + 1); // "231"
        String rs2 = a.toString(); // "23"
        System.out.println(rs2 + 1); // "231"
        // 常用:
        String rs3 = a + ""; // "231"
        // 2.把字符串类型的数值转换成对应的基本类型
        String agestr = "29";
        // int ageI = Integer.parseInt(agestr); // 29
        int ageI = Integer.valueOf(agestr); // 29
        System.out.println(ageI + 1); //30

        // 3. 把字符串类型的小数数值转换成对应的double类型
        String Scorestr = "99.5";
        // double Score = Double.parseDouble(Scorestr); // 99.5
        double Score = Double.valueOf(Scorestr); // 99.5
        System.out.println(Score + 0.5); // 100
    }
}

StringBuilder、StringBuffer

StringBuilder

StringBuilder代表可变字符串对象,相当于一个容器,它里面装的字符串可以改变的,就是用来操作字符串的

好处:StringBuilder 比 String 更适合做字符串的修改操作,效率会更高,代码也会更简洁

构造器说明
Public StringBuilder()创建一个空白的可变的字符串对象,不包含任何内容
Public StringBuilder(String str)创建一个指定的字符串内容的可变字符串对象
方法名称说明
Public StringBuilder append(任意类型)添加数据并返回StringBuilder对象本身
Public StringBuilder reverse()将对象的内容反转
Public int length()返回对象内容长度
Public String toString()通过toString()就可以实现把StringBuilder转换成String
为啥操作字符串建议使用StringBuilder,而不用String
public class Test {
    public static void main(String[] args) {
        String s = "";
        for (int i = 0; i < 1000000; i++) {
            s = s + "abc";
        }
        System.out.println(s);
    }
    // 由于String是不可变字符串,所以对字符串的拼接,修改操作效率很低
}
---------------------------------------------------------------------------------------------------
public class Test2 {
    public static void main(String[] args) {
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < 1000000; i++) {
            s.append("abc");
        }
        System.out.println(s);
        // 对于字符串相关的操作,如频繁的拼接,修改等,建议用StringBuilder效率更高
    }
}
注意:如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String

StringBuffer

注意:

  • StringBuffer 的用法与 StringBuilder 是一模一样的
  • 但StringBuilder是线程不安全的,StringBuffer是线程安全的

StringJoiner

JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后,里面的内容是可变的

好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁

构造器说明
Public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
Public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号
方法名称说明
Public StringJoiner add(添加的内容)添加数据,并返回对象本身
Public int length()返回长度(字符出现的个数)
Public String toString()返回一个字符串(该字符串就是拼接后的结果)
public class Test1 {
    public static void main(String[] args) {
        // 目标:完成遍历数组内容,并拼接成指定格式的案例
        System.out.printf(getArrayData(new int[]{11, 22, 33}));
    }

    public static String getArrayData(int[] arr) {
        // 1. 判断arr是否为null
        if(arr == null){
            return null;
        }
        // 2. arr数组对象存在, arr = [11, 22, 33]
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i <arr.length ; i++) {
            if(i == arr.length-1) {
                sb.append(arr[i]);
            }else {
                sb.append(arr[i]).append(", ");
            }

        }
        sb.append("]");
        return sb.toString();
    }
}

用StringJoiner代码更加简洁

public class StringJoinerDemo1 {
    public static void main(String[] args) {
        // 目标:完成遍历数组内容,并拼接成指定格式的案例
        System.out.printf(getArrayData(new int[]{11, 22, 33}));
    }

    public static String getArrayData(int[] arr) {
        // 1. 判断arr是否为null
        if(arr == null){
            return null;
        }
        // 2. arr数组对象存在, arr = [11, 22, 33]
        StringJoiner sb = new StringJoiner(",","[","]");
        for (int i = 0; i < arr.length; i++) {
            sb.add(arr[i] + "");
        }
        return sb.toString();
    }
}
  • 38
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值