java的string存放位置的疑惑

查看:109
本文介绍了java的string存放位置的疑惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

有一道题是这样的:

new String("aaa")创建了几个对象? 答案是创建一个或2个,理由是如果常量区中存在了aaa变量,则只在堆中创建一个;如果常量区不存在aaa变量,则分别在常量区和堆中各创建一个。

但我实际测试的结果却不符:

String s1 = new String("aaa");
String s2 = "aaa";
System.out.println(s1 == s2); //false

如果说new String("aaa")在堆中和常量区中都创建了对象,那么为什么s2不直接复用s1的常量池的引用呢?

补充:
发现自己想错了,s1应该指向的堆中的元素,而s2指向的是常量池中的,所以两者不相等是对的,那有没有办法测试测试出new String("aaa")也同时在常量池中创建对象了呢?

又或者String s3 = "aa".concat("a"); 请问这个s3是指向堆中还是指向常量池的,它能否复用常量池中的变量呢?

解决方案

    String s1 = new String("aaa");
    String s2 = "aaa";
    System.out.println(s1 == s2); //false
    System.out.println(s1.intern() == s2); //true

当一个String实例调用intern()方法时,会查找常量池中是否有相同的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个等于str的字符串并返回它的引用,由于s2已经在常量池中,所以s1.intern()不会再创建,而是直接引用同一个"aaa"。

如果这个还不够明显,那么我们就来试验,

public class Cons {
    public static void main(String[] args) throws InterruptedException {
        String s1 = new String("vv");
    }
}

然后命令行

注意常量池有 VV

这篇关于java的string存放位置的疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆