String直接赋值和new一个字符串的区别及其字符串的比较

问题描述

在这里插入图片描述
今天在写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
* */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值