java 对象/字符串的比较

1、同类型对象的比较:

        同一性关系:对象是否为同一个对象

        相等性关系:对象的具体内容是否相等

直接使用==进行比较默认比较对象的同一性,即引用指向的是否为同一个对象。

如果要进行对象具体内容的比较,则通过重写equals方法来实现。

例如现在有两本一样的书,他们的内容是完全相同的,直接使用==比较的话那么比较的为同一性,由于不是同一本书,因此就是false。但这两本书的内容是相同的,通过重写equals方法可以根据需要对对象进行内容的比较:示例如下

public class Book {
    public String name;
    public String color;
    public int page;

    public Book(String name, String color, int page) {
        this.name = name;
        this.color = color;
        this.page = page;
    }

    //根据需要判断所要比较的对象内容
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        Book v = (Book) o;
        return this.name == v.name && this.color == v.color
                && this.page == v.page;
    }
}
public class Demo {
    public static void main(String[] args) {
        //内容相同的两本书
       Book book1 = new Book("百年孤独","黑",360);
       Book book2 = new Book("百年孤独","黑",360);
        System.out.println(book1 == book2); //false 同一性(同一对象)比较
        System.out.println(book1 == book1); //true

        //判断对象的内容是否相等
        System.out.println(book1.equals(book2)); //true 重写了equals方法
    }
}

2、对象大小的比较:

        理论上对象是没有大小的,进行对象大小的比较实际上是人为按照一定的逻辑进行比较。JDK中的本身提供了comparable接口当某个类实现了该接口,那么这个类实例化的对象就具备了比较能力。例如有两个Person对象,假定身高高的对象要比身高低的对象大。对象大小的比较返回值类型默认为int型。返回值小于0意味着this < obj.余下同理

最直观的应用就是比如我们要根据人的身高来排序,最后进行输出,通过实现comparable接口进行对象大小的比较就提供了很大的便利。

示例如下:

public class Person implements Comparable{ //实现Comparable接口
    public String name;
    public int height;
    public Person(String name,int height){
        this.name = name;
        this.height = height;
    }

    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        if(this.height < p.height){
            return -1;  //身高低的对象小
        }
        if(this.height == p.height){
            return 0;
        }
        return 1;
    }
}
public class Demo {
    public static void main(String[] args) {
        Person[] person ={
                new Person("张三",180),
                new Person("李胜",175),
                new Person("赵五",182),
                new Person("周放",160)
        };
        sortPerson(person);
        for (Person v :person) {
            System.out.println(v.name + "  " + v.height);
        }
    }
    private static void sortPerson(Person[] p){
        for(int i = 0;i < p.length - 1;i++){
            for(int k = 0;k < p.length - i - 1;k++){
                int n = p[k].compareTo(p[k + 1]);
                if(n >= 0){
                    Person tmp = p[k];
                    p[k] = p[k + 1];
                    p[k + 1] = tmp;
                }
            }
        }
    }
}

结果如下:

由于compareTo无法满足所有场景,因此java中还提供了比较器Comparator,通过实现Comparator接口实现两个对象的比较

public class compare implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {

    }
}

3、字符串的比较:

        使用==直接比较,是比较的同一性(同一对象)。

        通常情况下equals方法比较的仍然为同一性,要比较相等性(对象内数据)就需要重写equals方法。但String用的频率高,所以String中的的equals比较的是相等性。

字符串比较较为特殊,String s = "hello", String s1 = "hello"s引用应当指向一个对象。但是在java中逻辑上存在字符串常量池,此时的s与s1都在字符串常量池中因此判断s == s1是true。

当String s2 = new String("hello");new出来的s2就在JVM的堆上,此时s1 == s2 就为false 

==判断,在字符串常量池中的相同字符串就是true,在堆上同一个对象则为true。

还可以利用inter()使堆中字符串对象进入字符串常量池。

 

当执行完s3.intern()后,返回堆区对象的引用。

public class Demo2 {
    public static void main(String[] args) {
        String s1 = "hello";  //存在于逻辑上的字符串常量池中
        String s2 = "hello";
        String s3 = new String("hello"); //两不同对象
        String s4 = new String("hello");

        System.out.println(s1 == s2); //true
        System.out.println(s1 == s3); //false
        System.out.println(s3 == s4); //false
        System.out.println(s1.equals(s3)); //true
        String v = s3.intern();
        System.out.println(v == s2); //true
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值