如何比较两个字符串
发布网友
发布时间:2022-05-14 11:49
我来回答
共1个回答
热心网友
时间:2022-04-23 05:12
知道什么是引用不?引用也就是引用变量,Java中的变量按照数据类型,可以分为两种,一种是基本数据类型变量,一种是引用数据类型变量:
基本数据类型变量:byte,short,char,int,long,float,double,boolean,以这8种基本数据类型声明的变量,如:int i;
基本数据类型变量:到目前为止引用数据类型包括 类,接口,数组,枚举,注解,以它们声明的变量叫做引用变量,或者引用,如:
String s1 = new String("abc");
String s2 = "abc";
引用s1里面存的是一个地址,地址什么样你不用管,就知道 通过这个地址就可以准确的找到上面这个new出来的String对象,所以我们说,引用s1指向了这个String对象。同样,s2也指向了一个String对象。
再说 == 和 equals 的区别:
s1 == s2 是true还是false?
== 比较的是引用地址,换句话说,==号两边的这两个变量所记录的地址是不是相同,用new关键字new出来的对象位于内存的堆区,"abc"是一个字符串常量,Java中字符串常量也是String类的一个对象,字符串常量被分配在内存的data segment(数据区),现在它们是两个不同的对象,s1指向new出来的这个,s2指向这个字符串常量,s1和s2指向的是不同的对象,它们的引用地址当然不同,毫无疑问表达式返回false
。
再说equals方法,s1.equals(s2) 是true还是false?
有些人上来就说equals方法比较的内容,其实这是不全面的,equals方法和==的区别,面试也经常考,
equals方法是父类Object所定义的方法,用来实现两个对象内容是否相等的逻辑,说equals方法要从两个方面:
1)从Object角度来说,==与equals是一样的,都是比较引用,因为Object类的equals()方法是这样定义的, public boolean equals(Object obj) { return (this == obj); }
方法内部的实现就是比较引用地址,用的也是==号,所以对于Object来讲,equals与==是一样的。
2)对于其它类来说,可以根据需要,在自定义的类中重写(Override) equals方法,实现内容是否相等的逻辑,因为String类重写了equals方法,所以我们才说String的equals比较的是两个字符串的内容,内容就是"abc",第一个new出来的时候传入构造方法的实参就是"abc",第二个字符串常量也是"abc",它们虽然是两个不同的对象,但是它们的内容相同,所以s1.equals(s2)返回真,它们相等。
我再给你写一个,String s3 = "abc"; String s4 = new String("abc");
s2 == s3 是真是假?
答案是true,注意,Java虚拟机 对于内存数据区里面的内容有一个优化,如果已经存在了,不会分配第二个,上面已经 String s2 = "abc";了, 这个"abc"已经存在了,下面String s3 = "abc"; 就不会分配第二个"abc"了,那么s3指向谁?s3也指向上面s2指向的这个对象,现在是s2和s3同时指向同一个对象,那么它们的地址当然一样,==比较的是引用地址,所以s2 == s3 返回true。
s2.equals(s3) 呢? 都是同一个对象了,那自己和自己内容还能不一样?返回true。
s1 == s4 是真是假?
答案是false,注意,使用new关键字生成的对象分配在内存的堆区(heap),并且只要是用了new关键字了,不管你new多少个,内容是否一样,它们都是不同的对象,new一个就出现一个新的,所以s4指向的这个对象,和s1指向的这个是两个不同的对象,地址不同, 因此s1 == s4为false,使用equals比较返回true,因为内容相同。