Object类和String类的常用方法

2019-02-19  本文已影响0人  LaobingFung

Java中所有类都直接或间接继承Object类,而String类是Java中最常用的类之一,总结一下这两个类的一些常用方法。

Object类的常用方法

package model;

public class Student implements Cloneable {
    public String name;
    public int age;
    public Teacher teacher;

    public Student(String name, int age, Teacher teacher) {
        this.name = name;
        this.age = age;
        this.teacher = teacher;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

package model;

public class Teacher {
    public String name;
    public int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

import model.Student;
import model.Teacher;

public class Main {
    public static void main(String[] args) {
        Teacher zhang = new Teacher("Zhang", 40);
        Student liu = new Student("Liu", 20, zhang);
        System.out.println("复制前" + liu.teacher.name);
        try {
            Student wang = (Student) liu.clone();
            wang.teacher.name = "Li";
            System.out.println("复制后" + liu.teacher.name);
            System.out.println("复制后" + wang.teacher.name);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

输出结果如下,用clone方法将liu复制给wang,修改wang的teacher属性,liu的teacher也跟着变化了。

复制前Zhang
复制后Li
复制后Li

要实现深复制,需要修改Student类中引用类型成员,让其也实现clone方法,同时在Student的clone方法中调用。
将Student和Teacher类修改为

package model;

public class Student implements Cloneable {
    public String name;
    public int age;
    public Teacher teacher;

    public Student(String name, int age, Teacher teacher) {
        this.name = name;
        this.age = age;
        this.teacher = teacher;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Student stu = (Student) super.clone();
        stu.teacher = (Teacher) teacher.clone();
        return stu;
    }
}

package model;

public class Teacher implements Cloneable {
    public String name;
    public int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

输出结果

复制前Zhang
复制后Zhang
复制后Li
public boolean equals(Object obj){
        return (this==obj);
}

Java一些内置的引用类型都重写了equals方法,而当我们给自定义的数据类型重写equals方法时,需要注意以下几点:
1. 自反性(reflexive),对于任意不为 null 的引用值 x,x.equals(x) 一定是 true。
2. 对称性(symmetric),对于任意不为 null 的引用值 x 和 y ,当且仅当x.equals(y)是 true 时,y.equals(x)也是true。
3. 传递性(transitive),对于任意不为 null 的引用值x、y和z,如果 x.equals(y) 是 true,同时 y.equals(z) 是 true,那么x.equals(z)一定是 true。
4. 一致性 (consistent),对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时 x.equals(y) 要么一致地返回 true 要么一致地返回 false。
5. 对于任意非null的对象x,x.equals(null)返回false。

public class Main {
    public static void main(String[] args) {
        System.out.println(zhang.name.getClass());
        System.out.println(String.class);
        try {
            System.out.println(Class.forName("java.lang.String"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出

class java.lang.String
class java.lang.String
class java.lang.String
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

当自定义类需要特定的toString返回值,需要重写该方法。


String类的常用方法

    public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

运行一下代码

public class Main {
    public static void main(String[] args) {
        String str1 = "hello";
        System.out.println(str1.compareTo("hi"));
        System.out.println(str1.compareTo("hello"));
        System.out.println(str1.compareTo("hello1"));
    }
}

结果如下

-4
0
-1
    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String str1 = "Hello world!";
        String str2 = str1.concat(" This is java.");
        System.out.println(str2);
        StringBuffer str3 = new StringBuffer("Hello world!");
        System.out.println(str1.equals(str3));
        System.out.println(str1.contentEquals(str3));
        String.join("-", new String[]{"java", "is", "cool"});
        System.out.println(String.join("-", new String[]{"java", "is", "cool"}));
        List<String> list = new ArrayList<>();
        list.add("java");
        list.add("is");
        list.add("cool");
        String str4 = String.join(" ", list);
        System.out.println(str4);
        String[] strArr = str4.split(" ", 2);
        for (String str : strArr) {
            System.out.println(str);
        }
        String str5 = "     java is cool    ";
        System.out.println(str5);
        System.out.println(str5.trim());
        System.out.println(str5.isEmpty());
        String str6 = "";
        System.out.println(str6.isEmpty());
    }
}

输出如下:

Hello world! This is java.
false
true
java-is-cool
java is cool
java
is cool
     java is cool    
java is cool
false
true

上一篇下一篇

猜你喜欢

热点阅读