JAVA面试题String产生了几个对象

作者:Java蚂蚁 时间:2023-03-19 20:46:21 

面试官Q1:请问String s = new String("xyz");产生了几个对象?

对于这个Java面试题,老套路先上代码:


public class StringTest {
public static void main(String[] args){
String s1="Hello";
String s2="Hello";
String s3=new String("Hello");
System.out.println("s1和s2 引用地址是否相同:"+(s1 == s2));
System.out.println("s1和s2 值是否相同:"+s1.equals(s2));
System.out.println("s1和s3 引用地址是否相同:"+(s1 == s3));
System.out.println("s1和s3 值是否相同:"+s1.equals(s3));
}
}

打印结果如下:


s1和s2 引用地址是否相同:true
s1和s2 值是否相同:true
s1和s3 引用地址是否相同:false
s1和s3 值是否相同:true

上面程序中的"=="是判断两个对象引用的地址是否相同,也就是判断是否为同一个对象,s1与s2 返回为true,s1与s3返回则是false。说明s1与s2 引用的同一个对象的地址,s3则与其它两个引用不是同一个对象地址。

Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面s1与s2引用地址相同。

那为什么s3与s1、s2引用的不是同一个字符串地址呢? String s3=new String("Hello"); JVM首先是在字符串常量池中找"Hello" 字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到 new 时,还会在内存(不是字符串常量池中,而是在堆里面)上创建一个新的String对象,存储"Hello",并将内存上的String对象引用地址返回,所以s3与s1、s2引用的不是同一个字符串地址。 内存结构图如下:

JAVA面试题String产生了几个对象

从内存图可见,s1与s2指向的都是常量池中的字符串常量,所以它们比较的是同一块内存地址,而s3指向的是堆里面的一块地址,说的具体点应该是堆里面的Eden区域,s1跟s3,s2跟s3比较都是不相等的,都不是同一块地址。

了解了String类的工作原理,回归问题本身:

在String的工作原理中,已经提到了,new一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量,然后再在内存中创建一个String对象,所以String str = new String("xyz"); 会创建两个对象。

来源:https://www.cnblogs.com/marsitman/p/11248001.html

标签:java,面试题,string,产生,对象
0
投稿

猜你喜欢

  • Java完美实现2048小游戏

    2023-06-14 12:59:25
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    2021-11-01 15:06:48
  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解

    2021-07-02 03:06:16
  • IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解

    2022-11-24 12:10:39
  • Spring Boot thymeleaf模板引擎的使用详解

    2022-07-27 07:42:54
  • Android SeekBar充当Progress实现兔兔进度条Plus

    2021-12-05 16:36:25
  • Java Scanner输入两个数组的方法

    2022-06-07 08:21:20
  • 使用JavaWeb webSocket实现简易的点对点聊天功能实例代码

    2023-10-29 00:14:17
  • 关于springboot集成swagger及knife4j的增强问题

    2023-11-29 00:43:50
  • spring-boot整合ehcache实现缓存机制的方法

    2023-06-18 20:05:10
  • Java线程同步的四种方式详解

    2021-09-02 19:57:36
  • SpringBoot接口中如何直接返回图片数据

    2023-04-22 13:10:24
  • Mybatis中的常用OGNL表达式

    2023-09-29 10:48:33
  • 详解Android应用main函数的调用

    2021-09-30 12:01:19
  • Java关于MyBatis缓存详解

    2021-11-01 00:40:20
  • 详解从零开始---用C#制作扫雷游戏

    2022-06-14 13:33:12
  • 浅析Java设计模式编程中的单例模式和简单工厂模式

    2021-10-13 15:27:54
  • 带你入门Java的泛型

    2023-06-08 02:48:24
  • Java ConcurrentHashMap的源码分析详解

    2023-05-02 02:16:21
  • Java面向对象基础知识之抽象类和接口

    2023-02-10 03:02:58
  • asp之家 软件编程 m.aspxhome.com