String中“+”号拼接字符串

先试用代码进行测试

String str1 = "hello";
String str2 = "he"+"llo";
String str3 = "he";
Stirng str4 = str3 + "llo"; System.out.println(str1 == str2); //true System.out.println(str2 == str4); //false System.out.println(str1.equals(str4)); //true

第一种结果,是程序在编译时,JVM编译器对字符串做了优化,str2就被优化成“hello”,str1和str2指向字符串常量池同一个字符串常量,所以“==”比较为true;

第二种结果,String通过+号来拼接字符串的时候,如果有字符串变量(str3)参与,实际上底层会转成通过StringBuilder的append( )方法来实现拼接,StringBuilder 的 toString( )方法底层new了一个String对象,所以str4在堆内存中重新开辟了新空间,而str2指向常量池,所以str2 == str4为false。

StringBuilder sb = new StringBuilder( );//先创建一个StringBuilder对象
		sb.append(str3);
		sb.append("llo");
		str4 = sb.toString();

第三种结果,String类中重写equals()方法,在String类中的equals()方法中,先使用“==”判断两个字符串的地址是否相等,如果相等,直接返回true;如果不相等,将两个字符串的转换成char数组,挨个比较其中的字符是否相等,有一个比较不一样的,直接返回false,比较完成之后,都一样,返回true;

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;
            }
        }
原文地址:https://www.cnblogs.com/chuzijing/p/14692473.html