相关疑难解决方法(0)

我们何时应该在字符串文字上使用String的实习方法

根据String #intern(),intern如果在String池中找到String,则该方法应该从String池返回String,否则将在String池中添加新的字符串对象并返回此String的引用.

所以我试过这个:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}
Run Code Online (Sandbox Code Playgroud)

我期待s1 and s3 are same将被打印为s3被实习,并且s1 and s2 are same不会被打印.但结果是:两行都打印出来.这意味着,默认情况下,字符串常量被实现.但如果是这样,那么为什么我们需要这种intern方法呢?换句话说,我们什么时候应该使用这种方法?

java string string-interning

184
推荐指数
5
解决办法
11万
查看次数

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

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

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

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

java string final

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

39
推荐指数
6
解决办法
23万
查看次数

Java中的最终字符

以下代码段发出编译时错误.

char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

第二行的错误说,

possible loss of precision
  required: char
  found:    int
Run Code Online (Sandbox Code Playgroud)

该错误消息基于NetBeans IDE.


当此字符c声明final如下时.

final char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)

编译器时间错误消失了.

它与最终字符串的情况无关

什么是final修改有所作为吗?

java final char

27
推荐指数
2
解决办法
3754
查看次数

如何在Java中完成最终字符串的连接?

当我编译这个片段.

public class InternTest {
    public static void main(String...strings ){
        final String str1="str";
        final String str2="ing";
        String str= str1+str2;

    }
}
Run Code Online (Sandbox Code Playgroud)

其中产生以下字节代码

public static void main(java.lang.String...);
   flags: ACC_PUBLIC, ACC_STATIC, ACC_VARARGS
   Code:
     stack=1, locals=4, args_size=1
        0: ldc           #16                 // String str
        2: astore_1
        3: ldc           #18                 // String ing
        5: astore_2
        6: ldc           #20                 // String string
        8: astore_3
        9: return
Run Code Online (Sandbox Code Playgroud)

所以字符串文字"字符串"已存在于常量池中,该字符串6: ldc #20 // String string在此行的堆栈上被推送.

引用JSL

来自JLS§4.12.4 - 最终变量:

原始类型或类型String的变量是final,并使用编译时常量表达式(第15.28节)初始化,称为常量变量.

同样来自JLS§15.28 - ConstantExpression:

String类型的编译时常量表达式总是"实例化",以便使用String#intern()方法共享唯一的实例.

所以我知道str1和str2将在创建时被实现."str"和"ing"将在行共享相同的内存String str= …

java string final

17
推荐指数
1
解决办法
4396
查看次数

删除final关键字如何改变程序的行为方式?

这个问题主要不是关于字符串.出于学术上的好奇心,我想知道final变量上的修饰符如何改变程序的行为.以下示例显示了它是可能的.

打印这些线条 true

final String x = "x";
System.out.println(x + x == "xx");
Run Code Online (Sandbox Code Playgroud)

但这些线条打印出来 false

String x = "x";
System.out.println(x + x == "xx");
Run Code Online (Sandbox Code Playgroud)

除了String实习之外,如果final从变量声明中删除修饰符,还有其他任何可能导致程序行为发生变化的事情吗?我假设程序使用或不使用修饰符进行编译.

请不要投票将其关闭为比较使用==在Java中声明为final的字符串的副本.我理解这个String例子.

我问是否有任何其他原因删除final修饰符可以有所作为.请有人链接到答案或回答问题.谢谢.

java final

8
推荐指数
1
解决办法
778
查看次数

比较字符串引用

我试图理解Java中的参考比较.我们假设我们有以下主要代码:

public static void main (String args[]) {
   String str1 = "Love!";  
   String str2 = "Love!";
   String str3 = new String("Love!");  
   String str4 = new String("Love!");
   String str5 = "Lov"+ "e!";  
   String str6 = "Lo" + "ve!";  
   String s = "e!";
   String str7 = "Lov"+ s;  
   String str8 = "Lo" + "ve!";
   String str9 = str1;
}
Run Code Online (Sandbox Code Playgroud)

我理解这一点str1 == str2 == str5 == str6 == str8 == str9,所有这些都是对公共池的引用.(价值"爱!"). s也是对公共池的引用,但它引用值"e!"

我也明白str1 != s.

我知道str3, …

java string heap reference string-interning

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

无法理解Java字符串文字是如何实现的

我正在学习StringBuider类。我在该站点和许多其他书籍中已经读到,当编译器遇到文字的“ +”运算符时,它将自动使用StringBuilder append的方法来将它们连接起来。

这似乎有点问题,因为将在运行时创建StringBuilder对象,但是应该在编译时获取String引用的串联String对象的地址。

String s1 = "hello";  
String s2 ="bc"; 
int value = 22;
Run Code Online (Sandbox Code Playgroud)

当编译器“满足”此代码时:

String s = s1+s2+22;
Run Code Online (Sandbox Code Playgroud)

它将“更改”为:

String s = new StringBuilder().append("hello").append("bc").append(22).toString();
Run Code Online (Sandbox Code Playgroud)

也许我误会了什么?

java string stringbuilder jvm compiler-optimization

2
推荐指数
1
解决办法
126
查看次数

如果两个字符串具有相同的引用,为什么输出不被排除(true)?

昨天这个问题由Interviewer询问该线路的输出是什么.

public class StringTest {

  public static void main(String[] args) {
      String s1 = "abc";
      String s2 = "abc";
      String s3 = s1+s2;
      String s4 = s1+s2;

      //check s1 == s2
      System.out.println(s1==s2);

      //check s3 == s4
      System.out.println(s3==s4);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我看着这个问题,然后思考面试官提出的简单问题.我告诉他,输出s1==s2s3==s4返回truetrue我是非常有信心.突然间,他说不是错误的输出然后我认为他可能是在开玩笑或试图失去信心,但直到最后他说错了.当我检查输出是truefalse.我也在想如何通过给出适当的答案来解决我的困惑.提前致谢.

java string

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

不可变的字符串和final关键字

我通常将全局编译时变量(如我使用的常量,如avogadro的数字或其他)放入公共静态最终变量中.但是,我还没有考虑过这对Strings是否真的有用.因为它已经是不可变的,所以制作一个String final有什么意义吗?

这是一个理论而不是一个实际的问题.

java string

0
推荐指数
1
解决办法
728
查看次数

以下声明中的差异

我无法识别以下Java中的字符串声明的区别.

假设我有两个字符串

String str1="one";
String str2="two";
Run Code Online (Sandbox Code Playgroud)

有什么区别

String str3=new String(str1+str2);
Run Code Online (Sandbox Code Playgroud)

String str3=str1+str2;
Run Code Online (Sandbox Code Playgroud)

在上述两个声明中,内容都str3将是onetwo.

假设我创建了一个新字符串

String str4="onetwo";
Run Code Online (Sandbox Code Playgroud)

然后,在上述声明中,

if(str4==str3) {
    System.out.println("This is not executed");
}
Run Code Online (Sandbox Code Playgroud)

为什么str3str4不是指同一个对象?

java string declaration string-concatenation

0
推荐指数
1
解决办法
57
查看次数

在System.out.println中使用str1 == str2只打印true或false但不打印随之写入的任何文本

这就是我在说的:

package finalExample;

public class FinalExample {

public static void main(String args[]) {

    final String str1 = "str";
    final String str2 = "ing";

    String str11 = "str";
    String str22 = "ing";

    System.out.println("Using equals() for non final :" + str11.equals(str22));
    System.out.println("Using == for non final :" + (str11==str22));
    System.out.println("MAGIC Using == for non final :" + str11==str22);

    System.out.println("Using equals() for final :" + str1.equals(str2));
    System.out.println("Using == for final :" + (str1==str2));
    System.out.println("MAGIC Using == for final :" + str1==str2);
}
Run Code Online (Sandbox Code Playgroud)

} …

java

-2
推荐指数
1
解决办法
633
查看次数