打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java中String常见面试题

Java代码

  1. String s = new String('abc');   
  2. String s1 = 'abc';   
  3. String s2 = new String('abc');   
  4.   
  5. System.out.println(s == s1);   
  6. System.out.println(s == s2);   
  7. System.out.println(s1 == s2);  

String s = new String('abc');String s1 = 'abc';String s2 = new String('abc');System.out.println(s == s1);System.out.println(s == s2);System.out.println(s1 == s2);
请问以上程序执行结果是什么?

第一句执行后内存中有两个对象,而不是一个。一个由new String('abc')中的'abc'在String Pool里生成一个值为'abc'的对象;第二个由new在堆里产生一个值为'abc'的对象,该对象完全是String Pool里的'abc'的一个拷贝。变量s最后指向堆中产生的'abc'对象;
第二句执行时,s1先去String Pool找是否有值为'abc'的对象,很显然在上一步中java已经在String Pool里生成一个'abc'对象了,所以s1直接指向String Pool中的这个'abc';
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个'abc'对象,这与执行第一句后生成的'abc'是不同的两个对象,s2最后指向这个新生成的对象。
因此,执行后面的打印语句的结果是三个false

问题2:
Java代码

  1. System.out.println(s == s.intern());   
  2. System.out.println(s1 == s1.intern());   
  3. System.out.println(s1.intern() == s2.intern());  

System.out.println(s == s.intern());System.out.println(s1 == s1.intern());System.out.println(s1.intern() == s2.intern());
请问以上程序执行结果是什么?

设s为String类型的变量,当执行s.intern()时,java先在String Pool里找与字符串变量s相等(用equals()方法)的字符串,若有则将其引用返回;若没有则在String Pool里创建一个与s的值相等的字符串对象,并将其引用返回。从中我们可以总结出intern()方法无论如何都将返回String Pool里的字符串对象的引用。
因此,以上程序执行的结果是falsetruetrue
PS:设s和t为两个字符串变量,若有s.equals(t),必有s.intern() == t.intern();
PS:'=='永远比较的是两边对象的地址是否相等。

问题3:
Java代码

  1. String hello = 'hello';   
  2. String hel = 'hel';   
  3. String lo = 'lo';   
  4. System.out.println(hello == 'hel' 'lo');   
  5. System.out.println(hello == 'hel' lo);  

String hello = 'hello';String hel = 'hel';String lo = 'lo';System.out.println(hello == 'hel' 'lo');System.out.println(hello == 'hel' lo);
请问以上程序执行结果是什么?

前三句在String Pool里分别产生“hello”、“hel”、“lo”三个常量字符串对象
当做第一个加法连接时, 号两边都是常量字符串,java就会将两者拼起来后到String Pool里找与之相等(用equals)的字符串,若存在则将其地址返回;不存在则在String Pool里新建一个常量对象,其值等于拼接后的字符串,并将其地址返回。
第二个 号两边有一个是变量,此时,java会在堆里新建一个对象,其值是两字符串拼接后的值,此时返回的地址是堆中新对象的地址。
所以,第一句做 连接后返回String Pool中“hello”的地址,显然与变量hello的地址相等;
第二句返回的是堆中地址,显然与变量hello的地址不等;

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
解析Java String字符串对象的创建及管理(2)
java的栈与堆(基本数据类型与包装数据类型)详解
Java之内存分析和String对象
String s = new String("abc");你真的了解吗???
java字符串池(string pool)和字符串堆(heap)内存分配
关于JAVA String长度的限制
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服