java-String类的常见面试题

package com.day7.one;

public class DemoString {

  /**
  * @param args
  */
  public static void main(String[] args) {
    demo1();
    demo2();
    demo3();
    demo4();
    demo5();
  }
  private static void demo1() {
    String s1="abc"; //在常量池中创建了abc字符串
    String s2="abc";
    System.out.println(s1==s2); //s1和s2指向的是同一个地址(true)
    System.out.println(s1.equals(s2)); //将此字符串与指定的对象比较。当且仅当该参数不为 null,
                   //并且是与此对象表示相同字符序列的 String 对象时,结果才为 (true)。
  }
  private static void demo2() {
    String s3=new String("abc"); //创建了两个对象,一个在常量池中,副本在堆内存中
  }
  private static void demo3() {
    String s4=new String("abc");
    String s5="abc";
    System.out.println(s4==s5); //false,因为s4指向的是堆中abc的地址值,s5指向的是常量池中的地址值
    System.out.println(s4.equals(s5)); //true,字符序列相同就行
  }
    private static void demo4() {
    String s6="a"+"b"+"c";
    String s7="abc";
    System.out.println(s6==s7); //true,java中有常量优化机制
    System.out.println(s6.equals(s7)); //true,因为s7直接指向已有的"abc"字符串地址
  }
  private static void demo5() {
    String s8="ab";
    String s9="abc";
    String s10=s8+"c"; //s10是指向对内存中的地址
    System.out.println(s8==s9); //false,
    System.out.println(s9.equals(s10)); //true,
  }

}

原文地址:https://www.cnblogs.com/zhujialei123/p/8110165.html