在java内存机制的常量池中
String s="helloworld";
//先在池中找有没有这个常量字符串,有的话,把字符串的引用s指向"helloworld"的首地址。如果没有就把"helloworld"字符串放入池中,在把他的地址返回给s引用。
String str1=new String("helloworld");
String str2=new String("helloworld");
如果用这种方式建立对象的话,str1与str2不相等,用new关键字,建立一个字符串对象的时候,回在内存的堆中给对象分配存储空间,返回这个对象的引用(即地址)。
那么对于str1与str2来说相当与建立了两个字符串的对象,也就是String类的实例。会在堆中分配两块存储区来存放这两个对象,它们的地址当然是不会相等的了。如果有如下语句:
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出:not equal
这里虽然是这两个对象的内容是相等的。但是这里的str1和str2里面的值是这两个对象的引用。所以当然是不等的了。那么要比较两个对象的内容怎么办呢:
在java中提供了一个方法,也是每一个对象都有的方法
boolean equals(Object anObject) 这个方法是继承java中的基类Object的。具体的资料你可以去查java的帮助文档;
那么对于下面的例子:
String str1="helloworld";
String str2="helloworld";
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出结果:equal
因为在定义str1是把"helloworld"这个字符串常量放进常量池中。并把它的引用返回个str1
在定义str2时,系统先在常量池中找看有没有"helloworld"这个常量,这时侯系统找到了,直接把它的引用返回个str2,所以实际上这时侯str1和str2都指向同一个字符串常量。所以他们的引用是相等的。
至于你说怎么分配存储空间,对象是在堆里面分配存储空间的。而变量则在栈中,字符串常量对象在池中。
对于你的问题可以这样测试:
class test
{
public static void main(String [] args)
{
String str1="a"+"b"+"c";
String str2="abc";
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
}
}
输出结果:equal
这说明:系统先把"a"+"b"+"c"连接起来变成"abc"放入常量池中了。所以才有后面的相等了。
所以str1的值实际上是"abc"
String s="helloworld";
//先在池中找有没有这个常量字符串,有的话,把字符串的引用s指向"helloworld"的首地址。如果没有就把"helloworld"字符串放入池中,在把他的地址返回给s引用。
String str1=new String("helloworld");
String str2=new String("helloworld");
如果用这种方式建立对象的话,str1与str2不相等,用new关键字,建立一个字符串对象的时候,回在内存的堆中给对象分配存储空间,返回这个对象的引用(即地址)。
那么对于str1与str2来说相当与建立了两个字符串的对象,也就是String类的实例。会在堆中分配两块存储区来存放这两个对象,它们的地址当然是不会相等的了。如果有如下语句:
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出:not equal
这里虽然是这两个对象的内容是相等的。但是这里的str1和str2里面的值是这两个对象的引用。所以当然是不等的了。那么要比较两个对象的内容怎么办呢:
在java中提供了一个方法,也是每一个对象都有的方法
boolean equals(Object anObject) 这个方法是继承java中的基类Object的。具体的资料你可以去查java的帮助文档;
那么对于下面的例子:
String str1="helloworld";
String str2="helloworld";
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出结果:equal
因为在定义str1是把"helloworld"这个字符串常量放进常量池中。并把它的引用返回个str1
在定义str2时,系统先在常量池中找看有没有"helloworld"这个常量,这时侯系统找到了,直接把它的引用返回个str2,所以实际上这时侯str1和str2都指向同一个字符串常量。所以他们的引用是相等的。
至于你说怎么分配存储空间,对象是在堆里面分配存储空间的。而变量则在栈中,字符串常量对象在池中。
对于你的问题可以这样测试:
class test
{
public static void main(String [] args)
{
String str1="a"+"b"+"c";
String str2="abc";
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
}
}
输出结果:equal
这说明:系统先把"a"+"b"+"c"连接起来变成"abc"放入常量池中了。所以才有后面的相等了。
所以str1的值实际上是"abc"
说到这里相信你对这个已经有一个大概的了解了吧。要不然在去查哈资料。。
效率:
1.
string sb;
for(int i=0;i<10;i++){
sb = sb +“sb”;
}
2.
stringbuffer sb;
for(int i=0;i<10;i++){
sb .apend(“sb”);
}
很显然,第二种方法效率更高