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"; 
}