本帖最后由 李厚斌 于 2014-4-6 23:55 编辑
先看题。。。再出总结。这样容易记得。。如果你都正确那就不用看解释了。完全over了
- public class Tset
-
- {
-
- public static void main(String[] args) {
- String s1="abc";
- String s2="abc";
- System.out.println(s1==s2);
- System.out.println(s1.equals(s2));
- String s3=s2+"abc";
- System.out.println(s3==s2+"abc");
- System.out.println(s3.equals(s2+"abc"));
-
- String s4=s1+s2;
- System.out.println(s4==s1+s2);
- System.out.println(s4=="abcabc");
- String s5=new String("abcabc");
- System.out.println(s5==s4);
- System.out.println(s5=="abcabc");
- String s6="abcabc";
- System.out.println(s6=="abc"+"abc");
- System.out.println(s6==s1+s2);
- Integer i1=5;
- Integer i2=new Integer(5);
- Integer i3=5;
- System.out.println(i1==i2);
- System.out.println(i1.equals(i2));
- System.out.println(i1==i3);
- Integer i4=1228;
- Integer i5=1228;
- System.out.println(i4==i5);
- System.out.println(i4.equals(i5));
- }
-
- }
复制代码 运行结果:true
true
false
true
false
false
false
false
true
false
false
true
true
false
true
1:==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
2:对于String a = “a”; Integer b = 1;(只针对-128---127.超过这个范围的不行。在这个范围内和String类似有专门开辟的内存空间)这种类型的特有对象创建方式,==的时候值是相同的。
3:.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
4:.一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。
详述:
String str1 = "abc";
String str2 = "abc";
String str3 = str1+str2; //这种创建方式是不放入字符串池的.这种情况表示str1+str2每次相加都会产生一个新对象储存在栈内存中。
下面的str4和str5一样的。也是每次相加都会产生一个新对象储存在栈内存中。所以每次相加的引用地址都是变换的也就是不相等的。
String str4 = str1+"cd"; //这种创建方式是不放入字符串池的.
String str5 = "ab"+str2; //这种创建方式是不放入字符串池的.
String str6 = "ab"+"cd"; //这种创建方式是放入字符串池的.这种情况实际上是创建了1个对象,abcd"1个对象。
这样就对上面的题有个认识了吧。
String s2="abc";
String s3=s2+"abc";
System.out.println(s3==s2+"abc");所以这个是false
String s4=s1+s2;
System.out.println(s4==s1+s2); false str1+str2每次相加都会产生一个新对象储存在栈内存中。。前后的引用地址是不一样的
System.out.println(s4=="abcabc"); false s4指向的是栈内存的引用地址。“abcabc”指向的常量池。
String s6="abcabc";
System.out.println(s6=="abc"+"abc");这个是ture 。
System.out.println(s6==s1+s2); false
Integer i4=1228;
Integer i5=1228;
System.out.println(i4==i5);false 超出了限制范围(-128---127)
System.out.println(i4.equals(i5));复写了equals方法。之比较内容是否相等。所以是ture
”==“其实总结一句话:看对象的引用地址指向的是哪里。。如果指向常量池。。内容相等那肯定相等。
如果一个指向常量池一个指向栈内存。。不相等。两个都指向栈内存。。如果新创建对象则不相等。引用地址变化了不管内容变化不变化。
看了好几篇博客都这么写的。。其实是不正确的。。因为equals()和hashCode()是两个可以随便复写的方法。怎么能这么说呢。
结论:对于equals()相等的两个对象,其hashCode()返回的值一定相等
- class Person{
- private String name;
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + "]";
- }
- private int age;
- Person(String name,int age){
- this.name=name;
- this.age=age;
- }
- @Override
- public int hashCode(){
- return new Random().nextInt(10)*age;
- }
- @Override
- public boolean equals(Object obj){
- Person p=(Person)obj;
- return name.equals(p.name)&&age==p.age;
- }
复制代码- HashSet hs=new HashSet();
- hs.add(new Person("lisi",45));
- hs.add(new Person("lisi",45));
- hs.add(new Person("lisi",45));
- System.out.println(hs.size());
复制代码 size打印结果是3
表示三个都加进去了。。hashset集合是根据hashcode排列。。如果hashcode相等然后判断equals方法。。如果equals方法表示两个对象true才、、、才判断是重复元素。上面例子。add添加的对象equals全部都是相等。。但是hashcode不相等。所以能添加进去。反驳了“对于equals()相等的两个对象,其hashCode()返回的值一定相等”这句话
|