String和new String 以及+连接符 各种空的含义

推荐一篇大佬的文章,写的真心不错链接点击这里,看了真的会有大收获

String news=new String()和String s=""的比较

Integer和String有许多类似,看我这篇文章你应该就懂了

上代码:

public class StringDemo {
    public static void main(String[] args) {
        String news=new String(); //已经初始化,内存中分配有空间,不过没有内容
        System.out.println(news); //打印空的
        String s="";//已经初始化,分配内存空间,不过没有内容。
        System.out.println("news.equals(s1)"+news.equals(s));//news.equals(s1)true
        boolean b =s instanceof String;
        System.out.println("b是否是字符串类型"+b);
        System.out.println(news.hashCode());//0
        System.out.println(s.hashCode());//0
        System.out.println("s==news么?"+s==news); //false  +运算符的优先级高于==,所以应该写括号
        System.out.println("s==news么?"+(s==news));//s==news么?false

    }
}


运行结果


news.equals(s1)true
b是否是字符串类型true
0
0
false
s==news么?false

字符串调用equals()和hasCode的源代码

字符串.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;
            }
        }
        return false;
    }

字符串.hsaCode() 注意hash默认为0


 /** Cache the hash code for the string */
 private int hash; // Default to 0
 public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

分析

  1. String news=new String(); 已经初始化,内存中分配有空间,不过没有内容 但是也是字符串
  2. String s=""; 已经初始化,分配内存空间,不过没有内容。但是也是字符串
  3. 两种hashCode都是0
  4. equals源码中 instanceof 关键字用法 :instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。 instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

看着篇文章你就知道为什么s==news的为什么不相等了下面这段话就是这个文章的内容,通过这个你也就明白了我写的代码的意思了

创建的字符串变量在内存中的区别
两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。

  • String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

  • String str2 = new String(“abc”) ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中(这里我认为应该是把常量池中地址放到堆空间中,是个引用,指向常量池中的字符串),在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

各种空

  • 这个是假空,最容易理解,这个里面是真正的字符串null,s2.hasCode()就是一个正整数
	String s2="null";
    System.out.println(s2);//这个null 代表里面是字符串null
  • 其他空,看注释你就明白了
public class StringConstructor {
    public static void main(String[] args) {
        String s=new String(); //已经初始化,内存中分配有空间,不过没有内容
        System.out.println(s); //空的
        String s1=null; //没有初始化,没有分配内存空间
    //    s1.hashCode();  空的如果调用方法会报空指针异常
    //    s1.equals(s);  空的如果调用方法会报空指针异常
        boolean b =s1 instanceof String;
        System.out.println("s1是String么?"+b); //false  s1不是String,那么任何字符串.equals(s1)都终将false;

        System.out.println("s1="+s1); //s1=null

        System.out.println("s.equals(s1)是真假?"+s.equals(s1)); //false  一个初始化后内容为空,一个连空间都没有

    }
}
  • 结果

s1是String么?false
s1=null
s.equals(s1)是真假?false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值