问题描述
今天在写ATM管理系统时候遇到的问题 , 当我输入正确的卡号和密码时,不会执行最里面的登录成功的语句。在调试之后才发现 if判断条件存在问题:在判断语句中使用equals()方法解决了该问题,下面是对该问题的一些扩展。
定义区别
字符串定义时候有两种方式:
- 使用直接赋值的方法创建一个字符串
String s2 = "abc";
String s3 = "abc";
System.out.println(s2 == s3);
其中s2 和 s3 都指向字符串常量池中的同一个字符串对象"abc"
所以s2 == s3的结果为true。
String类内部定义了final char[] value用于存储字符串数据,这表明字符串被创建将不可被修改。
至于他们为什么相等因为 , 字符串常量池中是不会存储相同内容的字符串的,所以这两个s2 和 s3指向的是同一个地址,当你定义s2时会在字符串常量池中查找如果存在则不会创建新的字符串 , 而是把相同字符串的地址传递过去。
- 使用new的方式来获取一个字符串对象
String s1 = new String("abc");
其中s1是使用new关键字进行创建,此时s1字符对象是被存储在堆中,会在堆里面给他分配一个地址。
地址比较
- 如何获取String的地址,我们可以使用System.identityHashCode()方法获取字符串地址,System.identityHashCode()方法可以获取对象的哈希码,而字符串的哈希码实际上就是字符串对象的地址。 因此,可以使用该方法 来获取字符串对象的地址。System.identityHashCode()方法返回的地址是一个整数,而不是一个字符串地址的字面值。可以使用下面的方法将其转换为十六进制的字符串形式:Integer.toHexString()方法。
public static int identityHashCode(Object x)返回与默认方法hashCode()
返回的给定对象相同的哈希码,无论给定对象的类是否覆盖了hashCode()。 空引用的哈希码为零。
public static String toHexString(int i)返回整数参数的字符串表示形式,作为16位中的无符号整数。
- “==”: 可以比较基本数据类型 , 也可以比较引用数据类型 。基本数据类型比较的是值,引用数据类型比较的是地址。
- equals()比较字符串对象钟中的内容是否相等,区分大小写。
public boolean equals(Object anObject)
//true如果给定的对象代表一个 String等效于这个字符串, false否则
- equalsIgnoreCase()比较字符串对象的内容是否相等,不区分大小写。
public boolean equalsIgnoreCase(String anotherString)
将此String与其他String比较,忽略案例注意事项。 如果两个字符串的长度相同,并且两个字符串中的相应字符等于忽略大小写,则两个字符串被认为是相等的。
接下来我将要通过代码实现他们的地址比较:
public class stirng {
public static void main(String[] args) {
String s1 = new String("abc");//堆
String s2 = "abc";//串池
String s3 = "abc";//串池
//1.地址获取
int s1Adress = System.identityHashCode(s1);
int s2Adress = System.identityHashCode(s2);
int s3Adress = System.identityHashCode(s3);
System.out.println("s1地址为:" + s1Adress + " s2地址为:" + s2Adress + " s3地址为:" + s3Adress);
int s1AdressHexadecimal = System.identityHashCode(s1Adress);
int s2AdressHexadecimal = System.identityHashCode(s2Adress);
int s3AdressHexadecimal = System.identityHashCode(s3Adress);
System.out.println("s1十六进制地址为:" + s1AdressHexadecimal +
" s2十六进制地址为:" + s2AdressHexadecimal + " s3十六进制地址为:" + s3AdressHexadecimal);
//2.==比较
System.out.println("s1和s2 ==字符串比较" + (s1 == s2));
//3.equals比较
boolean result1 = s1.equals(s2);
System.out.println("s1和s2 equals字符串比较" + result1);
//4.equalsIgnoreCase比较
String s4 = "ABC";
boolean flage = s1.equalsIgnoreCase(s4);
System.out.println("s1和s4 equalsIgnoreCase字符串比较:" + flage);
}
}
/*结果:
s1地址为:1915910607 s2地址为:284720968 s3地址为:284720968
s1十六进制地址为:455896770 s2十六进制地址为:1323165413 s3十六进制地址为:1880587981
s1和s2 ==字符串比较false
s1和s2 equals字符串比较true
s1和s4 equalsIgnoreCase字符串比较:true
* */