gpt4 book ai didi

Java 字符串池和类型转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:19 26 4
gpt4 key购买 nike

我的问题是关于 Java 处理字符串文字的方式。从 Java Language Specs (JLS) 中可以清楚地看出,字符串文字被隐式地驻留——换句话说,在堆的字符串常量池部分创建的对象,与调用 new String("whatever") 时创建的基于堆的对象形成对比。

似乎与 JLS 所说的不一致的是,当使用 String 连接和转换的常量 String 类型创建新的 String 时,根据 JLS 应将其视为常量 String,显然 JVM 是创建一个新的 String 对象而不是隐式地将其驻留。我感谢有关此特定行为的任何解释以及这是否是特定于平台的行为。我在 Mac OSX Snow Leopard 上运行。

public class Test
{
public static void main(String args[])
{
/*
Create a String object on the String constant pool
using a String literal
*/
String hello = "hello";
final String lo = "lo"; // this will be created in the String pool as well
/*
Compare the hello variable to a String constant expression
, that should cause the JVM to implicitly call String.intern()
*/
System.out.println(hello == ("hel" + lo));// This should print true
/*
Here we need to create a String by casting an Object back
into a String, this will be used later to create a constant
expression to be compared with the hello variable
*/
Object object = "lo";
final String stringObject = (String) object;// as per the JLS, casted String types can be used to form constant expressions
/*
Compare with the hello variable
*/
System.out.println(hello == "hel" + stringObject);// This should print true, but it doesn't :(

}
}

最佳答案

编译时常量表达式中不允许转换为 Object。唯一允许的类型转换为 String 和原语。 JLS(Java SE 7 版)第 15.28 节:

> - Casts to primitive types and casts to type String

(实际上还有第二个原因。object 不是 final 因此不可能被视为 constant variable 。“基本类型或类型 的变量String,即 final 并使用编译时常量表达式(§15.28)初始化,称为常量变量。”——第 4.12.4 节。)

关于Java 字符串池和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com