Java 常量池中字符串的操作与非常量池中字符串的操作-性能
我想改变一个代码,就像Java 常量池中字符串的操作与非常量池中字符串的操作-性能,java,string,performance,pool,Java,String,Performance,Pool,我想改变一个代码,就像 if("T".equalsIgnoreCase(bo.getSubjectType())) //method-1 到 因此,我编写了一个示例代码 String s1 = "T"; String s2 = "T"; char c1 = 'T'; char c2 = 'T'; System.out.println(String.valueOf(c1) == String.valueOf(c2)); // false System.out.println(s1 ==
if("T".equalsIgnoreCase(bo.getSubjectType())) //method-1
到
因此,我编写了一个示例代码
String s1 = "T";
String s2 = "T";
char c1 = 'T';
char c2 = 'T';
System.out.println(String.valueOf(c1) == String.valueOf(c2)); // false
System.out.println(s1 == s2); // true
valueOf(arg)生成一个字符串文本并将其放入常量池中。所以我的问题是,当我们试图在非常量
池和常量池
中操作字符串时,是否会在性能上存在任何对比-基本上,哪一种方法更适合方法1或方法2
if(String.valueOf('T').equalsIgnoreCase(bo.getSubjectType()))
这样写没有任何好处
String.valueOf('T')
将始终返回一个新字符串,等于“T”
,因为String.valueOf(char)
(或任何valueOf
重载的结果)未被缓存。没有理由一次又一次地创建相同的字符串
另外,它更冗长
只需坚持使用方法1。方法2可读性强,没有任何改进
String
使用new
操作符创建,它总是在堆内存中创建一个新对象<使用String literal
创建的code>String
可以从字符串池中返回现有对象(如果该对象已经存在)
它不会从池中返回字符串
,而是使用new
操作符(Oracle JDK 10源代码)创建字符串
:
如果您想定义一个字符串
常量,并且该常量总是从池中加载,只需创建一个:
public static final String T = "T";
从JLS
关于字符串文本和池:
及编制组:
package other;
public class Other {
public static String hello = "Hello";
}
生成输出:
true-false-true
这个例子说明了六点:
•同一类(§8(类))中的文字字符串
相同的文件包(§7(文件包))表示对相同文件包的引用
字符串对象(§4.3.1)
•中不同类中的文字字符串
同一个包表示对同一字符串对象的引用
•不同包中不同类中的文字字符串
同样,表示对同一字符串对象的引用
•由常量表达式(§15.28)计算的字符串在编译时计算,然后将其视为文本
•通过以下方式计算的字符串:
运行时的连接是新创建的,因此是不同的
•显式插入计算字符串的结果相同
字符串作为具有相同内容的任何预先存在的文本字符串
我看不到这里的示例代码、字符串池或其他任何东西的相关性。1显然更好。“这相当于说String.valueOf(arg)生成一个字符串文本并将其放在常量池中”我不明白您是如何得出这个结论的。如果它进入常量池,String.valueOf(c1)=String.valueOf(c2)
将为真。“它必须在常量池中”这是完全错误的。“如果它进入常量池,String.valueOf(c1)==String.valueOf(c1)。intern()==String.valueOf(c2)。intern()
,因为intern()
将其放入常量池中。并且有消息告诉我bo.getSubjectType()
应该返回一个枚举。只是说说而已。
public static final String T = "T";
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
package other;
public class Other {
public static String hello = "Hello";
}