【Java】Java创建String时,什么情况放进String Pool?

对Java创建String是否放入String pool作代码性的试验。

参考的优秀文章

JAVA面试题解惑系列(二)——到底创建了几个String对象?

public String(String original) API

public String intern() API

版本说明

JDK 1.7.0_71

new String() 与 intern()

package com.nicchagil.commonstudy.No01String的池;

public class Call {

    public static void main(String[] args) {
        String a = "abc";
        String b = "abc";
        String c = new String(a);
        String d = "ab" + "c";
        String e = "abc".intern();
        String f = new String(a).intern();

        System.out.println("a == b : " + (a == b));
        System.out.println("a == c : " + (a == c));
        System.out.println("a == d : " + (a == d));
        System.out.println("a == e : " + (a == e));
        System.out.println("a == f : " + (a == f));
    }

}

日志

a == b : true
a == c : false
a == d : true
a == e : true
a == f : true

变量、常量字符串拼接,他们是否放入String Pool?

package com.nicchagil.commonstudy.No01String的池;

public class Call2 {

    public static void main(String[] args) {
        final String A = "123";
        final String B = "456";
        String C = "123456";
        String a = "123";
        String b = "456";

        System.out.println("C == (A + B) : " + (C == (A + B))); // A、B为final类型
        System.out.println("C == (\"123\" + \"456\") : " + (C == ("123" + "456"))); // "123"、"456"为常量
        System.out.println("C == (a + b) : " + (C == (a + b))); // a、b为变量
        System.out.println("C == (a + \"456\") : " + (C == (a + "456"))); // a为变量
        System.out.println("C == (a + b).intern() : " + (C == (a + b).intern())); // 使用intern()方法
    }

}

日志

C == (A + B) : true
C == ("123" + "456") : true
C == (a + b) : false
C == (a + "456") : false
C == (a + b).intern() : true

注意

本日志打印的结果为上文JDK所运行的结果。

时间: 2024-10-28 18:03:40

【Java】Java创建String时,什么情况放进String Pool?的相关文章

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

[Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]

场景: 1. 通过socket给Java传递byte[]数组时,utf-8的字节数组在转换为String, Java并不会遇到0就停止结束,而是一直使用完byte[]的容量, 所以在转换为Java的String需要自己判断字节值是0的位置,再截取数组长度. public static int searchByte(byte[] data, byte value) { int size = data.length; for (int i = 0; i < size; ++i) { if (data

在Eclipse配置并编译worldwind java2.1.0源码,选中Src目录下gov.nasa.worldwindx.examples包下ApplicationTemplate.java类文件run时提示“javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V”异常的解决办法

问题现象: 在Eclipse配置并编译worldwind java2.1.0源码,选中Src目录下gov.nasa.worldwindx.examples包下ApplicationTemplate.java类文件run时提示“javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V”异常. 解决办法: 1.定位到报错的方法为WWXML.java文件中的createDocumentBuilder方法: pub

Java中创建String的两种方式差异

我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd"); 那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别? 方法1: String a = "abcd"; String b = "abcd"; System.out.println(a == b); // true System.out.pri

Java堆、栈和常量池以及相关String的详细讲解(转)

一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动

java对象创建与内存模型总结

 1.JVM管辖的内存大致分为三个逻辑部分:java栈(Heap).java堆(JavaStack)和方法区(MethodArea).在JVM启动时创建,关闭时全部回收.  栈.本地方法栈.程序计数器:以线程为粒度,每个线程拥有自己的部分.而堆和方法区被所有线程共享.  堆:运行时的数据区域,程序(线程)运行时动态分配.  方法区:静态存储区,存储被装载到JVM中的class信息. 2.栈 i).存放基本类型的变量数据和对象的引用变量(变量本身存放在堆和常量池中). ii).java系统必须知道

深入理解Java虚拟机:运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范(Java SE 7版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里

Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)

博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的

Oracle EBS Form Builder使用Java beans创建窗体

最近有个项目,需要研究一下Oracle的E-Business Sutie(EBS),对于以前没接触此套件的我来说,简直太痛苦了.在网上找了一堆资料,试着进行Form二次开发,也遇到各类奇葩问题.目前遇到最大的一个问题是,如何在本地 Form Builder中进行窗体构建,并调用后台的JavaBean对窗体进行交互?网上也有不少的解决方案,但是都存在一些差异,试了很多次,终于实现了我预期的效果. 为了防止以后再遇到类似的问题,先做一个记录,以备后查. 1.环境搭建说明  服务器:Oracle EB