.一个java问题 希望详细解答下
关于下面程序片段,(B)的结论是正确的。Stringa="Java";Stringb="Java";Stringx="Ja";Stringy="va";Stringc=x...
关于下面程序片段,( B )的结论是正确的。
String a = "Java";
String b = "Java";
String x = "Ja";
String y = "va";
String c = x + y;
A、a 和 b 指向同一个实例对象,a 和 c 指向同一个实例对象
B、a 和 b 指向同一个实例对象,a 和 c 不指向同一个实例对象
C、a 和 b 不指向同一个实例对象,a 和 c 指向同一个实例对象
D、a 和 b 不指向同一个实例对象,a 和 c 不指向同一个实例对象 展开
String a = "Java";
String b = "Java";
String x = "Ja";
String y = "va";
String c = x + y;
A、a 和 b 指向同一个实例对象,a 和 c 指向同一个实例对象
B、a 和 b 指向同一个实例对象,a 和 c 不指向同一个实例对象
C、a 和 b 不指向同一个实例对象,a 和 c 指向同一个实例对象
D、a 和 b 不指向同一个实例对象,a 和 c 不指向同一个实例对象 展开
3个回答
展开全部
首先你的明白字符串池(String pool)的概念,你看下面两个例子
String str1 = new String("abc");
Stirng str2 = "abc";
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的String Pool中通过String的 equals 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至String Pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到String Pool里面的,除非程序调用 String的intern方法。
所以说String a ="java"和String b ="java" 他们都是指向的是字符串池的那个引用,所以是一个实例对象。
同时,你要明白字符串相加是重新创建新的对象,所以c是一个新的对象,跟a和b肯定不是指向同一个对象
String str1 = new String("abc");
Stirng str2 = "abc";
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的String Pool中通过String的 equals 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至String Pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到String Pool里面的,除非程序调用 String的intern方法。
所以说String a ="java"和String b ="java" 他们都是指向的是字符串池的那个引用,所以是一个实例对象。
同时,你要明白字符串相加是重新创建新的对象,所以c是一个新的对象,跟a和b肯定不是指向同一个对象
展开全部
public class StringCompareTest
{
public static void main (String [] args)
{
//s1直接引用常量池中的“高等数学”
String s1 = “高等数学” ;
String s2 = "高等" ;
String s3 = "数学" ;
String s4 = "高等" +"数学" ; //编译时就计算出来
String s5 = "高等"+"数"+"学"; //编译时就计算出来
String s6 = s2 + s3 ; //编译时没计算出来
//使用new构造器创建新的String对象,s7引用新创建的String对象
String s7 = new String("高等数学");
System.out.println(s1==s4) ; //true
System.out.println(s1==s5) ; //true
System.out.println(s1==s6) ; //false
System.out.println(s1==s7) ; //false
常量池保证相同的字符串直接量只有一个,不会产生其他的副本,例如,上面例子中,s1 s4 s5所引用的字符串在编译时就确定下来了,因此,它们都将引用常量池中的同一个字符串。
{
public static void main (String [] args)
{
//s1直接引用常量池中的“高等数学”
String s1 = “高等数学” ;
String s2 = "高等" ;
String s3 = "数学" ;
String s4 = "高等" +"数学" ; //编译时就计算出来
String s5 = "高等"+"数"+"学"; //编译时就计算出来
String s6 = s2 + s3 ; //编译时没计算出来
//使用new构造器创建新的String对象,s7引用新创建的String对象
String s7 = new String("高等数学");
System.out.println(s1==s4) ; //true
System.out.println(s1==s5) ; //true
System.out.println(s1==s6) ; //false
System.out.println(s1==s7) ; //false
常量池保证相同的字符串直接量只有一个,不会产生其他的副本,例如,上面例子中,s1 s4 s5所引用的字符串在编译时就确定下来了,因此,它们都将引用常量池中的同一个字符串。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java String是一个不可变的对象。它在分配内存时是固定的。它是对象类型。是对值地址的引用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询