根据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.lang.String在Java中被宣布为final时,我想知道为什么会这样?当时我没有找到任何答案,但这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问.
当然,String提供了我所需要的所有功能,并且从未想过任何需要扩展String类的操作,但你仍然永远不会知道某人可能需要什么!
那么,有没有人知道设计师在决定最终时的意图是什么?
以下代码段发出编译时错误.
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修改有所作为吗?
当我编译这个片段.
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= …
这个问题主要不是关于字符串.出于学术上的好奇心,我想知道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中的参考比较.我们假设我们有以下主要代码:
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, …
我正在学习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)
也许我误会了什么?
昨天这个问题由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==s2和s3==s4返回true和true我是非常有信心.突然间,他说不是错误的输出然后我认为他可能是在开玩笑或试图失去信心,但直到最后他说错了.当我检查输出是true和false.我也在想如何通过给出适当的答案来解决我的困惑.提前致谢.
我通常将全局编译时变量(如我使用的常量,如avogadro的数字或其他)放入公共静态最终变量中.但是,我还没有考虑过这对Strings是否真的有用.因为它已经是不可变的,所以制作一个String final有什么意义吗?
这是一个理论而不是一个实际的问题.
我无法识别以下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)
为什么str3而str4不是指同一个对象?
这就是我在说的:
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)
} …