[Java]关于字符串那些事儿

一.什么时候使用==两个字符串是相等的

string不同于基本数据类型,它实际上是一个封装好的对象,然后和其他引用数据又有所不同,在JAVA中,String可以直接通过=的形式来赋值。

于是就出现了以下这两种新建字符串的方法:

String s1 = "HelloWorld";
String s2 = new String("HelloWorld");
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true

在这里我们先要提一下==和equals()方法之间的区别

==可以用于比较基本数据类型和引用数据类型,比较基本数据类型时只会比较里面的值是否相等,而不会关注值的数据类型(long或者int等等),比较引用数据类型时比较的就是引用数据类型的地址;

equals方法只能比较引用数据类型,因为它是写在Object类中的一个方法,在没有重写的情况下,它的内部就是一个==方法。一般需要对对象比较的时候,我们都会去重写equals()方法,打成对对象内的值进行比较的目的。(String类中已经重写了equals方法用于比较字符串的值)

 那么是不是两个值相等的字符串用==比较内容就一定不同呢,让我们看看下面的代码:

        String s1 = "HelloWorld";        
        String s3 = "HelloWorld";
        System.out.println(s1==s3); //true
        System.out.println(s1.equals(s3)); //true

我们又会惊奇的发现两个结果都为true,这又是为什么呢?

原来在JVM中有一个字符串常量池,当s1和s3被创建的时候,JVM就会去查找常量池中有没有

"HelloWorld"这个值,如果有的话就把地址返回给s1,s3,没有的话就新建一个再返回。

而当我们使用new String()构造的时候,JVM也会去常量池中查找或者创建,但是new关键字会创建一个新的String对象,s2中存储的是新对象的地址,而常量池中字符串的地址是存储在新对象中的,所以与s1进行==比较的时候,因为地址不相同,自然就会返回一个false了。

再看一下一些特殊情况:

        final String s4 = "Hello";
        String s5 = "Hello";
        String s6 = "World";
        String s7 = s5+s6;
        String s8 = "Hello" + "World";
        String s9 = s4+"World";
        System.out.println(s1==s7); //false
        System.out.println(s1==s8); //true
        System.out.println(s1==s9); //true

s4被final修饰,所以s4+"World"的拼接在编译的时候就会完成

而s5+s6实际上就是用了StringBuilder的append方法生成了一个新的对象,所以比较的地址自然也就不同了。

二.关于String的参数传递

public class Demo2 {
    public static void main(String[] args) {
        String s1 = "HelloWorld";
        change(s1);
        System.out.println(s1); //HelloWorld
    }

    private static void change(String s1) {
        s1 = "Bee";
        System.out.println(s1); //Bee
    }
    
}

与第一部分是同理的,因为字符串是不可变的,每次新赋值地址都会改变,所以方法内的s1改变不会影响到原值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值