zoukankan      html  css  js  c++  java
  • Java 字符串面试题

    1. String的创建

    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. String的拼装

    String hello = "hello";   
    String hel = "hel";   
    String lo = "lo";   
    System.out.println(hello == "hel" + "lo");   
    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的地址不等;

  • 相关阅读:
    Codeforces 1439B. Graph Subset Problem (思维,复杂度分析)
    石子游戏(nim游戏+按位考虑)
    Codeforces 1437F Emotional Fishermen(思维,dp)
    Codeforces Round #671 (Div. 2) (A~E)
    Java就业企业面试问题ssh框架
    DUBBO初探搭建DUBBO开发环境
    Spring容器组建注解@Component和Resouces实现完全注解配置
    jUnit 4 在 s2sh 中的应用
    4.5、常量、作用域、内置全局变量
    Java 诗词纵向转换字符流输出
  • 原文地址:https://www.cnblogs.com/tigerson/p/7233312.html
Copyright © 2011-2022 走看看