java中创建String类型对象的两种方式以及在使用equals()和“==”两种方法时的区别

string 对象创建的两种方式

String aString="a";
String bString = new String("a"); 

其中aString是通过直接赋值的方式创建,bString是通过String类型的构造方法创造对象。相同的地方在于他们两都是两个值都为“a”字符串对象。但他们在创建对象的方式是不同的。现在通过常见的判断两个字符串对象的值是否相等的例子来引入。

		String aString = "aa";
		String bString = new String("aa");
                String cString="aa";
		System.out.println(aString==bString);
		System.out.println(aString.equals(bString));
                System.out.println(aString==cString);

此段代码得到的结果是 false,true,true。接下来对这三个答案进行一一解析。

那么接下需要了解equals和==的区别

equals和==的区别

1.首先看看string类中对于equals方法的写法:
 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }

这说明equals方法是通过取到字符串对象的value值来进行比较,故 aString.equals(bString)的结果是true就显而易见,因为他们的value都是aa。

2 那对于==布尔运算符来讲,如果参与运算的对象 不是八大基础类型(int,boolean,char,,,,,,,),那么就是将参加运算的对象的内存地址进行比较。而不同对象的内存地址一定不相同,所以对于 aString==bString来说是两个不同的对象的内存地址进行比较,尽管他们的Value都是等于aa,但显然==运算是忽略Value的。所以是false.

此时各位读友可能会产生了疑问了,既然==对于string对象是进行内存地址的比较,那么 aString==cString的结果应该是false才对,他们属于value值相等的两个不同的对象,所以内存地址也一定不相同。这样讲貌似是有道理的,但忽略了一点,那就是string 类型对象通过new来创建和直接赋值创建是有着本质的区别的。接下来请看二者的区别。

string类型通过new创建对象和直接赋值创建的区别


1.字符串缓存池:当创建字符串对象时,jvm中会存在一个.字符串缓存池,其中可看做类似于hashmap的一个容器,key为字符串对象的内存地址,value为该字符串对象的值value。
当通过new来创建字符串对象时,相当于强制创建新的字符串对象,然后加入字符串缓存池中。
而当通过类似 String aString = "aa"这样的直接赋值创建对象时,jvm会首先在缓存池中检查是否已经存在value等于aa的字符串,若已经存在相同值的字符串对象,则不会创建新的aString对象,也不会加入缓存池中,是直接根据缓存池中已有的对象直接赋给aString,所以aString就相当于是已经存在对象的一个别名。只有缓存池中不存在value值等于aa的对象时,才会创建一个新的对象,然后加入缓存池。

 aString==cString 中 cString和aString一样都是直接赋值aa,所以cString不会创建新的对象,而是成为了aString 对象的别名,都指向的是同一个对象的内存地址。故
aString==cString 的结果是true.



本人的第一篇小博客,如有疏忽请谅解和指正!嘿嘿





  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于Java字符串的使用,具体来说是关于String创建字符串后如何使用equals和==判断字符串是否相等。那么我来回答你的问题。 在JavaString是一个特殊的类,用于表示字符串。创建String对象两种方式使用字符串文字或者使用构造函数。 使用字符串文字创建字符串对象Java会自动将其转换为String对象: ``` String str1 = "Hello"; ``` 使用构造函数创建字符串对象,需要显式地调用String类的构造函数: ``` String str2 = new String("Hello"); ``` 当我们需要比较两个字符串是否相等,可以使用equals方法或者==运算符。 equals方法比较的是两个字符串的内容是否相等,而==运算符比较的是两个字符串的引用是否相等。具体来说,如果两个字符串的内容相同,那么它们使用equals方法比较的结果为true;如果两个字符串的引用指向同一个对象,那么它们使用==运算符比较的结果为true。 下面是一个示例,演示了如何使用equals方法和==运算符比较两个字符串是否相等: ``` String str1 = "Hello"; String str2 = new String("Hello"); String str3 = "Hello"; System.out.println(str1.equals(str2)); // 输出false,因为str1和str2的引用不同 System.out.println(str1 == str2); // 输出false,因为str1和str2的引用不同 System.out.println(str1.equals(str3)); // 输出true,因为str1和str3的内容相同 System.out.println(str1 == str3); // 输出true,因为str1和str3的引用相同 ``` 希望我的回答能够帮到你。如果你还有其他问题,请随提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值