use*_*592 60 java string equals
我有以下代码行来比较String.str1不等于str2,这是可以理解的,因为它比较了对象引用.但那么为什么s1等于s2?
String s1 = "abc";
String s2 = "abc";
String str1 = new String("abc");
String str2 = new String("abc");
if (s1==s2)
System.out.println("s1==s2");
else
System.out.println("s1!=s2");
if (str1==str2)
System.out.println("str1==str2");
else
System.out.println("str1!=str2");
if (s1==str1)
System.out.println("str1==s1");
else
System.out.println("str1!=s1");
Run Code Online (Sandbox Code Playgroud)
输出:
s1==s2
str1!=str2
str1!=s1
Run Code Online (Sandbox Code Playgroud)
Mic*_*rry 86
字符串常量池本质上会缓存所有字符串文字,因此它们是下面的同一个对象,这就是为什么你会看到你为之做的输出s1==s2.它本质上是VM中的一个优化,以避免每次声明文字时都创建一个新的字符串对象,这可能会非常快速地变得非常昂贵!在您的str1==str2示例中,您明确告诉VM创建新的字符串对象,因此它是错误的.
顺便说一句,intern()在任何字符串上调用方法都会将它添加到常量池中(并返回它添加到池中的String.)除非你确定要处理的是,否则不一定要做到这一点.肯定会被用作常量的字符串,否则你最终可能难以追踪内存泄漏.
Cha*_*har 21
s1和s2是字符串文字.创建新的字符串文字时,编译器首先检查字符串池中是否存在任何表示相同字符的文字.如果存在一个,则编译器返回该文字,否则编译器将创建一个新文本.
当您创建String时s2,编译器s1将从池中返回String ,因为它之前已创建.这就是原因s1和原因s2相同的原因.此行为称为实习.
在 Java 中,相同的常量字符串将被重用。所以这s1并s2指向同一个“ABC”对象和s1==s2。但是当您使用 时new String("abc"),将创建另一个对象。所以那个s1 != str1。
由于
string在 java 中是不可变的,所有string literals缓存都是为了可重用性。
当您使用 new() 运算符创建 String 对象时,它总是在堆内存中创建一个新对象。另一方面,如果您使用字符串字面量语法(例如“Java”)创建对象,它可能会从字符串池中返回一个现有对象(永久空间中的字符串对象缓存,现在在最近的 Java 版本中移动到堆空间) ,如果它已经存在。否则它将创建一个新的字符串对象并放入字符串池中以备将来重用。
String s1 = new String("java");
String s2 = new String("java");
String s3 = "java";
String s4 = "java";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10486 次 |
| 最近记录: |