Java String
equals 和==的区别
(1)对于基本类型来说,没有equals方法,只能用==, 比较的是值
(2)对于引用类型来说,==比较的是引用地址, equals默认情况下,比较的也是引用地址。
但是我们可以重写equals方法,来达到比较值的目的。 其中有一个特殊的类 String, 在jdk源码里面已经重写了equals方法,实现了equals方法比较值
(3)重写equals方法,一定要重写hashcode方法。 如果重写了equals,没有重写hashcode,会导致使用hash算法的集合出问题,比如HashMap 导致值找不到。
(4) 如果两个变量 equals返回true, 那么两个变量的hashcode一定相同。 两个变量的hashcode相同,equals方法不一定返回true.
String 代码演示
package com.javabase;
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a=" aadbbdfdfdsssfee e ";
System.out.println("字符串长度:"+a.length());
System.out.println("字符串 截取2到5(不包含5):"+a.substring(2, 5));
System.out.println("字符串 去掉两边的空格:"+a.trim());
System.out.println("字符串 获取3号位置的字符:"+a.charAt(3));
System.out.println("字符串长度:连接两个字符串"+a.concat("ttt"));
System.out.println("字符 返回相同的字符的下标,如果没有就返回-1:"+a.indexOf("bb"));
System.out.println("字符串长度:");
//1,先到字符串池里面找,有没有yyyy,有就从池里返回,不需要在堆里创建yyyy
//2, 如果池里没有,就在堆里创建一个新的yyyy,并且拷贝到字符串池
String test1="yyyy";
// 不检查字符串池,直接在堆里新建一个yyyy
String test2= new String("yyyy");
//这次池里有yyyy,直接返回了yyyy,所以和第一内存地址是一样的
String test3="yyyy";
String test4="yy";
//只要有+,就要在堆里新创建
String test5=test4+"yy";
System.out.println("test1.equals(test2):"+test1.equals(test2));
System.out.println("test1.equals(test3):"+test1.equals(test3));
System.out.println("test1.equals(test5):"+test1.equals(test5));
System.out.println("test1==test2:"+(test1==test2));
System.out.println("test1==test3):"+(test1==test3));
System.out.println("test1.equals(test5):"+(test1==test5));
//1,先到字符串池里面找(使用了equals),找到了,直接把池里的返回
//2, 如果没,就在池里新建一个,并且把池里新建的这个返回
String test6=test2.intern();
String test7="yyyy".intern();
System.out.println("test1==test2:"+(test1==test2));
System.out.println("test1==teest6):"+(test1==test6));
System.out.println("test1==test7):"+(test1==test7));
//创建了两个对象
//一个在堆里的abc
//一个在字符串池里的abc
String s=new String("abc");
//创建了4个对象
String s1="aaaa"+new String("zzzz");
//只创建了一个ttttuuuu
String s2="tttt"+"uuuu";
}
}
字符串长度:20
字符串 截取2到5(不包含5):adb
字符串 去掉两边的空格:aadbbdfdfdsssfee e
字符串 获取3号位置的字符:d
字符串长度:连接两个字符串 aadbbdfdfdsssfee e ttt
字符 返回相同的字符的下标,如果没有就返回-1:4
字符串长度:
test1.equals(test2):true
test1.equals(test3):true
test1.equals(test5):true
test1test2:false
test1test3):true
test1.equals(test5):false
test1test2:false
test1teest6):true
test1==test7):true