查看原文
其他

Java中创建String的两道面试题及详解

2017-11-21 javastack Java技术栈

我们知道创建一个String类型的变量一般有以下两种方法:

  1. String str1 = "abcd";

  2. String str2 = new String("abcd");

那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别?

下面来看下面两道经常遇到的面试题。

面试题1:
  1. String a = "abcd";

  2. String b = "abcd";

  3. System.out.println(a == b);  // true

  4. System.out.println(a.equals(b)); // true

解析:

用""创建的a,b两个字符串,==和equals比较返回都为true,这是因为a,b都指向了方法区的同一个字符串。所以,当同样的一个字符串用""重复创建时只在方法区创建一次。

面试题2:
  1. String c = new String("abcd");

  2. String d = new String("abcd");

  3. System.out.println(c == d);  // false

  4. System.out.println(c.equals(d)); // true

解析:

用new创建的c,d两个字符串,equals为true很简单因为equals永远比较的是值,而==为false说明两个字符串的引用不一样。用new创建的字符串每次都会在JVM堆中创建,所以c,d都对应堆中的两个不同的字符串。

关于这两道题中的""和new创建的字符串在内存中的表现形式可以看下图就明白了。


推荐推荐



阿里高级Java面试题(首发,70道,带详细答案)

2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案

Spring面试题(70道,史上最全)

17张图揭密支付宝系统架构

阿里巴巴,排行前10的开源项目!

2018年必看:关于区块链技术的10本书



  Java技术栈  
微信公众号:「Javastack

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。
 ▼长按二维码关注我们↓↓↓




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存