[img]
[img]http://dl.iteye.com/upload/attachment/0082/4604/624fcc23-c7c1-39d7-914b-e06875f43563.jpg[/img]
[/img]
执行到(1)时候,在内存中共分配几个对象?答案是2个i对象,但有的同学会错误的理解为
在堆里分配个abc这个对象,在栈里分配个s空间对象,实际上这是错误的。s只是一个实例,是一个存放对象引用的标签变量,像C语言里的指针一样,所以说JAVA是有指针的。实际上是有一个String pool的,叫做串池的,首先看String pool中有没有abc这个串,发现没有,所以就把abc放到String pool中了,然后new String("abc");这句就是在JAVA的堆内存中分配abc这个对象,所以是2个对象,而s指向堆里的abc串。
OK,
下面我们看(2),(2)就不分配对象了,因为s1直接指向,String pool中的abc了,因为String pool中已经存在了abc了。
(3)分配一个对象abc,s2指向这个新分配的对象.
(4)(5)(6)都为false,因为s,s1,s2指向了不同的对象
equals方法比的是内容,只要内容相同了,就返回true,而==比的是,是不是指向同一个对象
[img]http://dl.iteye.com/upload/attachment/0082/4604/624fcc23-c7c1-39d7-914b-e06875f43563.jpg[/img]
[/img]
package com.test;
public class StringTest
{
public static void main(String[] args)
{
(1) String s=new String("abc");
(2) String s1="abc";
(3) String s2=new String("abc");
(4) System.out.println(s==s1);
(5) System.out.println(s==s2);
(6) System.out.println(s1==s2);
}
执行到(1)时候,在内存中共分配几个对象?答案是2个i对象,但有的同学会错误的理解为
在堆里分配个abc这个对象,在栈里分配个s空间对象,实际上这是错误的。s只是一个实例,是一个存放对象引用的标签变量,像C语言里的指针一样,所以说JAVA是有指针的。实际上是有一个String pool的,叫做串池的,首先看String pool中有没有abc这个串,发现没有,所以就把abc放到String pool中了,然后new String("abc");这句就是在JAVA的堆内存中分配abc这个对象,所以是2个对象,而s指向堆里的abc串。
OK,
下面我们看(2),(2)就不分配对象了,因为s1直接指向,String pool中的abc了,因为String pool中已经存在了abc了。
(3)分配一个对象abc,s2指向这个新分配的对象.
(4)(5)(6)都为false,因为s,s1,s2指向了不同的对象
equals方法比的是内容,只要内容相同了,就返回true,而==比的是,是不是指向同一个对象