相关疑难解决方法(0)

为什么String类在Java中声明为final?

从我得知该类java.lang.String在Java中被宣布为final时,我想知道为什么会这样?当时我没有找到任何答案,但这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问.

当然,String提供了我所需要的所有功能,并且从未想过任何需要扩展String类的操作,但你仍然永远不会知道某人可能需要什么!

那么,有没有人知道设计师在决定最终时的意图是什么?

java string final

134
推荐指数
5
解决办法
8万
查看次数

String.intern()的返回解释

考虑:

String s1 = new StringBuilder("Cattie").append(" & Doggie").toString();
System.out.println(s1.intern() == s1); // true why?
System.out.println(s1 == "Cattie & Doggie"); // true another why?

String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern() == s2); // false

String s3 = new String("Cattie & Doggie");
System.out.println(s3.intern() == s3); // false
System.out.println(s3 == "Cattie & Doggie"); // false
Run Code Online (Sandbox Code Playgroud)

我糊涂了,为什么它们是由不同产生的返回值的String.intern()其中说:

调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。

特别是经过以下两个测试:

assertFalse("new String() should create a new instance", new String("jav") == "jav");
assertFalse("new StringBuilder() should create a new instance",
    new StringBuilder("jav").toString() == …
Run Code Online (Sandbox Code Playgroud)

java string-interning

20
推荐指数
1
解决办法
1702
查看次数

为什么intern()不能与文字'java'一起使用?

我试过下面的代码:

public class TestIntern {
  public static void main(String[] args) {
   char[] c1={'a','b','h','i'};
   String s1 = new String(c1);
   s1.intern();
   String s2="abhi";
   System.out.println(s1==s2);//true

   char[] c2={'j','a','v','a'};
   String sj1 = new String(c2);
   sj1.intern();
   String sj2="java";
   System.out.println(sj1==sj2);//false

   char[] c3={'J','A','V','A'};
   String tj1 = new String(c3);
   tj1.intern();
   String tj2="JAVA";
   System.out.println(tj1==tj2);//true
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的文字.

任何人都可以解释为什么intern()不能按字面意思的方式工作"java"?为什么上面的参考比较要评估true,除非文字是"java"?

java string string-interning

12
推荐指数
1
解决办法
303
查看次数

字符串文字,实习和反思

我正试图找到这个问题的第三个解决方案.

我不明白为什么这不打印false.

public class MyClass {

    public MyClass() {
        try {
            Field f = String.class.getDeclaredField("value");
            f.setAccessible(true);
            f.set("true", f.get("false"));
        } catch (Exception e) {
        }
    }

    public static void main(String[] args) {
        MyClass m = new MyClass();
        System.out.println(m.equals(m));
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,由于字符串实习,"true"被修改的实例与print方法中使用的实例完全相同PrintStream?

public void print(boolean b) {
    write(b ? "true" : "false");
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

编辑

@yshavit的一个有趣的观点是,如果你添加这条线

System.out.println(true);
Run Code Online (Sandbox Code Playgroud)

之前try,输出是

true
false
Run Code Online (Sandbox Code Playgroud)

java string reflection jvm

10
推荐指数
1
解决办法
325
查看次数

为什么String.intern()方法返回两个不同的结果?

我有这样的代码:

String str1 = new StringBuilder("???").append("??").toString();
System.out.println(str1.intern() == str1); //true

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
Run Code Online (Sandbox Code Playgroud)

我有结果:

String str1 = new StringBuilder("???").append("??").toString();
System.out.println(str1.intern() == str1); //true

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
Run Code Online (Sandbox Code Playgroud)

我能理解为什么line1和line3是真的,但我是关于line2的问题,为什么这是假的?

我的java是:java版"1.8.0_73"

java string stringbuilder string-interning

9
推荐指数
1
解决办法
275
查看次数

用于访问JDK 8 HotSpot JVM中的字符串池内容的实用程序

是否有任何实用程序或脚本(使用java或本机代码)查看JDK 8 HotSpot JVM中字符串池中存在的所有字符串的列表,而不会对JVM产生很多性能影响?

或者,只要将新字符串添加到JVM中,我是否可以将侦听器连接起来?

谢谢,哈里什

java string jvm jvm-hotspot

4
推荐指数
1
解决办法
565
查看次数