在字符串建立时,在内存中有一个字符串缓冲区,或者叫做字符串常量池。在创建新的字符串时,就会到内存中的字符串常量池中查找,没有才创建。;有的话就直接用,所以比较s和s1的地址值是一样的。
解析: String s="abc"; 在字符串常量池中创建了一个abc字符串,并把地址赋值给了s引用型变量。 在内存中只产生一个对象。 String s1=new String("abc"); 在堆内存中创建了一个String类型的对象,此对象在构造的时候接受了一个字符串对象“abc”,但并没有涉及到字符串常量池中的任何动作。 在内存中产生两个对象,new了一个,接收了一个。
区别: 前者是在常量池中创建一个对象;后者是在堆内存中创建两个对象。 常量池中装的都是字符串对象。 比较对象是否相同,用equals方法,打印输出结果为true 当年在查看equals源码的时候,实际上比较也是地址值,怎么是这样呢?
原因: String类是Object类的子类,在使用时,String类将equals方法进行了复写。 建立了字符串对象根据自身特点比较是否相同的依据,比较的是内容。
|