假设我在Java中编写了如下内容:

String a = args[0]; // user input from keyboard
String b = a + "foo1";
String c = "foo2" + "foo3";

是否会在字符串池中创建"foo1"、"foo2"、"foo3"?

推荐答案

字符串"foo1""foo2foo3"的值为compile time constant expressions,两者都将被插入.

其他字符串都不会.

  • a人未被拘留.

  • a + "foo1"人未被拘留.

  • "foo2""foo3"都没有被拘留.事实上,runtime String个对象甚至没有为这两个文本创建."foo2" + "foo3"表达式在编译时求值.


字符串是不可变的这一事实并不能预测字符串值是否为内部值.(所有字符串都是不可变的,但只有一些字符串是插入的.)

最后,所有这些都与practical编程无关.如果您始终使用equals(...)来测试字符串,则实习(或不实习)对程序行为没有影响.

在现代JVM中,GC的字符串重复数据消除功能是管理可能重复的字符串所消耗的空间的更好方法,而不是保留.而且文字/常量表达式占用的内存量无论如何都应该是微不足道的.

Java相关问答推荐

屏蔽字母数字代码的Java正则表达式

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

蒙蒂霍尔比赛结果不正确

JPanel透支重叠的JComcoBox

Java:使用Class.cast()将对象转换为原始数组

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

如何将其他属性引用到log4j2 yaml配置中?

使用用户引入的参数生成人员数组

如何在一行中使用Dijkstra中的Java Stream

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

有没有可能在时间范围内得到多种解决方案?

通过/失败的参数化junit测试方法执行数

具有多个分析模式的复杂分隔字符串的正则表达式

使用同步方法中的新线程调用同步方法

如何在特定关键字后提取与模式匹配的多个值?

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

URI构造函数错误?

双对象供应商

如何在Java中正确实现填字游戏求解器