首页 > 试题广场 >

关于下面的一段代码,以下哪些说法是正确的: public

[不定项选择题]
关于下面的一段代码,以下哪些说法是正确的:

public static void main(String[] args) {
    String a = new String("myString");
    String b = "myString";
    String c = "my" + "String";
    String d = c;
    System.out.print(a == b);
    System.out.print(a == c);
    System.out.print(b == c);
    System.out.print(b == d);
}

  • System.out.print(a == b)打印出来的是false
  • System.out.print(a == c)打印出来的是true
  • System.out.print(b == c)打印出来的是false
  • System.out.print(b == d)打印出来的是true
A:a指向堆内存,b指向常量池,因此地址不相等,false
B:java有常量优化机制,c也指向常量池,且与b指向同一个,则a与c地址不相等,false;
C:b与c地址相等,true
D:d是c的副本,地址相同,所以b与d地址相等,true
发表于 2019-08-28 09:50:49 回复(5)
a是运行时动态加载的,此时会在堆内存中生成一个myString字符串,指向堆内存字符串地址
b是编译时静态加载的,此时会在常量池中存放一个myString字符串,指向常量池字符串地址
c会在编译时对"my" + "String"进行拼接成myString字符串,再去常量池查找,找到之后指向该字符串地址
d是c的脚本,地址相同
最后:Sting的==比较的是地址值是否相同
发表于 2019-09-28 12:57:42 回复(3)
关于字符串的拼接问题我想讲一下:
class StringJoin{
    public static void main(String[] args){
        String s1="a";
        String s2="b";
        String s6="ab";
        
        String s3="a"+"b";
        
        String s4=s1+s2;
        
        String s5=s1+"b";
        
        //常量拼接与常量比较
        System.out.println(s6==s3);
        
        //常量与变量拼接与常量比较
        System.out.println(s6==s5);
        
        //变量拼接与常量比较
        System.out.println(s6==s4);
        
    }
}
运行结果:

总结:
字符串的拼接与常量比较的问题(前提是字符串拼接之后的内容与常量相同),若拼接字符串的+两边存在变量,则会在堆上new一个新的对象,此时与常量的==结果为false;
若拼接字符串的+两边均是常量,由于java的常量优化机制,拼接的结果是指向常量池的,与常量==的结果是true;

如有错误之处欢迎指出!

发表于 2020-01-21 10:34:44 回复(7)
String b="mystring"的时候在方法区new了一个空间进行存储,当String c="my"+"string"的时候又new了两个空间分别存储my与string,当my与string两者进行结合时,方法区已经存在了mystring,所以直接用mystring赋值给c,而不是重新new一个空间存储“mystring”
发表于 2019-08-21 11:27:46 回复(5)
题目显示不全
发表于 2021-04-07 08:24:22 回复(1)
a是创建在堆中,b是创建在字符串常量池中,c在创建时会先去字符串常量池中寻找,发现b已经创建过了,会直接引用。补充 a和c应该是不会主动在字符串常量池中创建,都是建立在堆中。如有不对还请指正
发表于 2022-04-13 08:25:56 回复(1)
@Test
    public void  StringStest(){
        
        //堆内存中生成一个myString字符串,指向堆内存字符串地址
        String a = new String("myString");
        //此时会在常量池中存放一个myString字符串,指向常量池字符串地址
         String b = "myString";
        //c会在编译时对"my" + "String"进行拼接成myString字符串,
         //再去常量池查找,找到之后指向该字符串地址
            String c = "my" + "String";
            
            //d是c的脚本,地址相同
            String d = c;
            
            //false
            System.out.print(a == b);
            System.out.print(a == c);
            //true
            System.out.print(b == c);
            System.out.print(b == d);
            System.out.print(c==d);
            
           // String的==比较的是地址值是否相同
    }
发表于 2022-01-17 16:01:45 回复(0)
字符串以非new形式创建时,会先在常量池寻找是否有相同字符;若有,则引用,若没有,则创建后引用。

发表于 2022-05-14 21:06:34 回复(0)
A:a指向堆内存,b指向常量池,因此地址不相等,false
B:java有常量优化机制,c也指向常量池,且与b指向同一个,则a与c地址不相等,false;
C:b与c地址相等,true
D:d是c的副本,地址相同,所以b与d地址相等,true
发表于 2022-05-07 16:38:14 回复(1)
New 堆内存 直接定义常量池
发表于 2021-04-30 14:02:37 回复(1)
a指向的是堆内存,b指向的是常量池,c和d也是。而且==比较的是地址
编辑于 2020-05-26 21:44:02 回复(0)
new 返回的是一个对象的引用
发表于 2019-06-03 19:27:54 回复(0)
b和c是常量池里面找,所以是true!c和d的地址是一样的,所以b,c,d==比较的话都是true

编辑于 2022-03-08 15:40:27 回复(0)
  • 字符串 变量 拼接的原理是StringBuilder 最终在堆内存中

  • 字符串 常量 拼接的原理是编译器优化  最终在串池中    如 :String c = "my" + "String";
  • 直接 new 出来的对象也在串池中
发表于 2021-09-30 15:01:53 回复(0)
public static void main(String[] args) {
  String a = "1";
  String b = "2";
  String c = "12";
  String d = "1"+"2";
  String e = a+b;
  String f = a+"2";
  
  System.out.println(c==d);
  System.out.println(c==e);
  System.out.println(c==f);
 }
输出结果:
true
false
false
如果+两边有变量,都会new一个对象,地址肯定不同。
发表于 2020-10-18 17:06:52 回复(0)
mark
发表于 2022-07-17 13:44:08 回复(0)
bcd都是赋值了myString,放到了常量池当中,地址相同。而a创建了对象,开辟了新地址,地址与bcd不同。 输出中的==比较的就是地址,所以a与bcd比较输出的都是false,bcd之间相互比较结果都是true
发表于 2022-07-08 17:30:46 回复(0)
区别String 和 Integer的包装对象的区别
发表于 2021-10-31 16:55:19 回复(0)
显示不全,这种题早就无压力了
发表于 2021-10-03 16:16:26 回复(0)
要与a比较 要用equalsbd 是一个东西 d是b的副本
发表于 2021-09-16 23:16:55 回复(0)