面试官再问String面试题,教你如何满分回答

面试官再问String面试题,教你如何满分回答

  1. 判定定义为String类型的st1和st2是否相等,为什么?
public class Compare_String{

  public static void main(String[] args) {
  	String st1 = "abc";
    String st2 = "abc";
    System.out.println(st1 == st2);
    System.out.println(st1.equals(st2));
  }

}

输出结果:
  true、true
分析:
  == 比较运算符,如果是基本数据类型,比较的是值是否相等,如果是引用数据类型,比较的是地址值是否相等,’‘abc’'是存储在常量池中的,常量池有一个特点,如果已经存在,就不会再重复的创建对象,所以两个str1、str2是指向的同一个地址,赋值给两个字符串对象,故(str1 == str2)输出为true。
  使用equals()方法既要比较地址值又要比较值是否相同,所以str1.equals(str2)输出也为true。

  1. 下面这句话在内存中创建了几个对象?

String st1 = new String(“abc”);

输出结果:
  2个
分析:
  在内存中创建了两个对象,new 是在堆内存中创建的对象,’‘abc’'是在常量池中创建的对象。堆内存中的对象是常量池对象的一个拷贝副本。
  当我们看到了new这个关键字,就要想到只要是new出来的对象都是在堆内存中存储

  1. 判定以下定义为String类型的st1和st2是否相等?

package string;
public class Compare_String {
   public static void main(String[] args) {
     String st1 = new String("abc");
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

输出结果:
  false、true
分析:
  new关键字,对象的引用指向堆内存,"abc"在常量池中

  1. 判定以下定义为String类型的st1和st2是否相等
public class Compare_String{
 
   public static void main(String[] args) {
     String st1 = "a" + "b" + "c";
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

输出结果:
  true、true
分析:
  “a” + “b” + "c"本来就是字符串常量,字符串拼接后还是字符串,在常量池中存储,常量池中存在一个对象就不会再重复创建一个相同的对象,所以都为true。

  1. 判断以下st2和st3是否相等

package string;
 
public class Compare_String{
 
   public static void main(String[] args) {
     String st1 = "ab";
     String st2 = "abc";
     String st3 = st1 + "c";
     System.out.println(st2 == st3);
     System.out.println(st2.equals(st3));
   }
}

输出结果:
  false、true
分析:
  在JDK 1.6中对String对象的介绍中,Java语言提供对字符串拼接 ‘’+“以及将对象转换为字符串的特殊支持,字符串串联是通过StringBuilder或者StringBuffer类及其append方法实现的,字符串转换是通过toSting方法实现的。
  也就是说由StringBuilder或者StringBuffer类和里面的append方法实现拼接,然后调用 toString() 把拼接的对象转换成字符串对象,最后把得到字符串对象的地址赋值给变量。
  对象str1和str2都是指向常量池,对象str3显示通过StringBuilder类的append方法的到了"abc”,他是一个StringBuilder对象,在堆内存中存储001,再通过toString() 转换为了String对象,堆内存中存储002,然后赋值给str3.所有st2 == st3内存地址不一样了,输出为false。
  内容相同st2.equals(st3)为true。

原创文章 6 获赞 8 访问量 950

猜你喜欢

转载自blog.csdn.net/weixin_42437102/article/details/106048155