相关疑难解决方法(0)

如何检查字符串池内容?

有没有办法检查,目前字符串池中有哪些字符串.

我可以以编程方式列出池中存在的所有字符串吗?

要么

任何IDE都有这种插件吗?

java string string-pool

25
推荐指数
1
解决办法
3698
查看次数

在此过程中创建的String对象总数?

String str1="JAVA";
String str2="JAVA";
String str3=new String("JAVA");
String str4=new String("JAVA").intern();
Run Code Online (Sandbox Code Playgroud)

将创建2个对象.str1并且str2因为String文字池概念而引用同一个对象并str3指向新对象,因为使用new运算符并str4指向同一个对象,str1并且str2因为intern()方法将字符串池检查到具有相同值的字符串.

str1=str2=str3=str4=null;
Run Code Online (Sandbox Code Playgroud)

一个对象将有资格获得GC.这是通过创建的对象String str3=new String("JAVA").始终可以通过存储在字符串文字池中的引用访问第一个String对象.

我的解释是否正确?

java string object

7
推荐指数
1
解决办法
265
查看次数

实习字符串,字符串池和perm空间上的垃圾收集

在探索了java的字符串内部结构后,我对所谓的"烫发空间"感到困惑.我最初的理解是它保留了String 文字以及类元数据,如本问题所述.

我还阅读了有关该String.intern()方法的内容,并将其String放入String Pool中,返回对它的唯一实例的引用.我的理解是,这是与JVM的perm空间中存在的字符串文字相同的字符串池.对我来说,"烫发空间"可以修改是不可能的(毕竟它是永久性的,是吗?).但后来我发现这个问题,EJP对接受的答案的最高投票评论解释了这一点

现在,实习生的字符串已经可以用GC了.

暗示GC在perm空间上运行,这似乎不是永久性的.这如何调和?GC是否检查了烫发空间中的所有内容?GC是否检查字符串池中的所有内容,包括源中的字符串文字?内联字符串是否有第二个字符串池?GC是否只知道在收集时查看实习生的字符串?或者这个评论是错误的并且实际上是一个字符串阻止它成为GC'd(我希望不是这种情况)?

java string garbage-collection jvm string-interning

7
推荐指数
1
解决办法
2778
查看次数

同步相同的字符串值

假设我有一个为Web应用程序创建新用户的方法.该方法本身调用一个静态助手类,该类创建一个SQL语句,用于执行实际插入到我的数据库中.

public void createUserInDb(String userName){
    SQLHelper.insertUser(userName);
}
Run Code Online (Sandbox Code Playgroud)

我希望同步此方法,以便如果传入的参数(userName)在这些线程上相同,则不能由不同的线程同时调用它.我知道我可以使用synchronized关键字同步方法执行,但这会阻止不同的线程同时执行该方法.如果传入的变量相同,我只想防止并发执行.Java中有一个简单的构造可以让我这样做吗?

java synchronization

7
推荐指数
1
解决办法
1590
查看次数

旧字符串是否会从字符串池中删除?

我见过几个类似的问题,但他们的答案并没有真正回答我的问题。

当我们编辑字符串并创建新字符串时,旧字符串去了哪里。

String s1 = "Hello"
s1 += "World"
Run Code Online (Sandbox Code Playgroud)

我们有一个字符串 Hello,但随后创建了一个新字符串,它是 HelloWorld。

字符串 Hello 是否仍在字符串池中(我猜不是,因为我们失去了对它的引用)。垃圾收集器会销毁它吗?

如果我们创建一个新字符串并使用 intern 方法会怎样?该字符串将从池中取出吗?

String s1 = "Hello";
s1 += "World";

String s2 = "Hello";
Run Code Online (Sandbox Code Playgroud)

这个话题中,Stephen C 说

如果字符串变得无法访问,它们将被垃圾收集

但我做了这样的事:

        String s1 = "Hello";
        System.out.println(System.identityHashCode(s1));
        s1 += "World";

        System.gc();

        String s2 = "Hello";
        System.out.println(System.identityHashCode(s2));
Run Code Online (Sandbox Code Playgroud)

它打印了相同的身份哈希码,尽管我丢失了对“Hello”字符串的引用,并且新的应该打印了另一个身份哈希码。

他还表示

这意味着只要该方法可以执行,该字符串就可以访问。

但我做了一个与上面类似的实验,该方法创建了一个字符串,然后在另一种方法中,我创建了相同的字符串(在使用 System.gc 之前),并打印出相同的身份哈希代码。

如果我丢失了对这两种情况的引用,为什么 GC 不会销毁它们?

java

5
推荐指数
0
解决办法
353
查看次数