Java中的字符串文本
我刚开始学习Java,遇到了以下问题:Java中的字符串文本,java,string,Java,String,我刚开始学习Java,遇到了以下问题: String s = "Hello"; String s1 = "Hello"; if(s.equals("Hello") && s.equals(s1)) { System.out.println("Equal"); } if语句中的第一个条件将字符串文字s与字符序列进行比较,其中第二个语句将s与另一个字符串文字s1进行比较。这两个比较结果都是正确的 我的理解是s将保留对Hello的引用,s1也是。由于s和s1都包含对Hello
String s = "Hello";
String s1 = "Hello";
if(s.equals("Hello") && s.equals(s1))
{
System.out.println("Equal");
}
if语句中的第一个条件将字符串文字s与字符序列进行比较,其中第二个语句将s与另一个字符串文字s1进行比较。这两个比较结果都是正确的
我的理解是s将保留对Hello的引用,s1也是。由于s和s1都包含对Hello的引用,因此可以对它们进行比较,并且由于“公共字符串池”的缘故,它们总是相等的
我的问题是:如何将保存引用的s与实际的字符串Hello(一个字符序列)进行比较??是否有任何逻辑,或者只是负责内存引用然后比较两者的实现
如果我的理解有误,请纠正我 当调用equals方法时,进入堆栈的是对所传递内容的引用。因此,当您编写s.equalsHello时,堆栈上的一个对象是对Hello的引用。当调用equals方法时,进入堆栈的对象是对传递的任何对象的引用。因此,当您编写s.equalsHello时,堆栈上的一个东西是对Hello的引用。您正在调用equals方法,该方法比较两个对象的等效性-它不会检查两个引用是否指向对象的同一实例。要检查对同一对象的两个引用,可以使用s==s1调用equals方法,该方法比较两个对象的等效性-它不会检查两个引用是否对同一对象实例。要检查对同一对象的两个引用,可以使用s==s1如果您看到equals的源代码,您可以理解equals方法会逐个比较字符串的值 性格如果使用==则仅比较引用
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
如果您看到equals的源代码,您就可以理解equals方法会按每个字符串比较字符串的值 性格如果使用==则仅比较引用
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
我的问题是:如何将保存引用的“s”与实际的字符串Hello(一个字符序列)进行比较
Hello不是字符序列。这是一根绳子。字符串确实实现了,但这不是一回事。因此,当您使用equals或==时,您正在比较字符串实例,而不是一些特殊的东西。字符串文字是一个字符串,在源代码中写入文字时,该字符串包含对其的引用
一开始你似乎对等式和==感到困惑。重读一遍,我不确定你是否是,但以防万一:equals比较两个对象的等价性;如果这两个对象是字符串,则如果它们具有相同的字符序列,则返回true比较两个对象引用,如果它们指向同一对象,则计算为真。==有时对于看起来不同的字符串对象也是如此,因为字符串文本隐式地放在一个公共池中,并从中重新使用以节省内存,因此两个独立但等效的文本实际上最终引用同一个对象。永远不要依赖它。使用==来比较字符串几乎总是一个错误。不使用==的情况在很大程度上是边缘情况。使用相等
我的问题是:如何将保存引用的“s”与实际的字符串Hello(一个字符序列)进行比较
Hello不是字符序列。这是一根绳子。字符串确实实现了,但这不是一回事。因此,当您使用equals或==时,您正在比较字符串实例,而不是一些特殊的东西。字符串文字是一个字符串,在源代码中写入文字时,该字符串包含对其的引用
一开始你似乎对等式和==感到困惑。重读一遍,我不确定你是否是,但以防万一:equals比较两个对象的等价性;如果这两个对象是字符串,则如果它们具有相同的字符序列,则返回true比较两个对象引用,如果它们指向同一对象,则计算为真。==有时对于看起来不同的字符串对象也是如此,因为字符串文本隐式地放在一个公共池中,并从中重新使用以节省内存,因此两个独立但等效的文本实际上最终引用同一个对象。永远不要依赖它。使用==来比较字符串几乎总是一个错误。不使用==的情况在很大程度上是边缘情况。使用相等
我的问题是:如何将具有参考的s与
实际字符串Hello是一个字符序列??有吗
逻辑还是仅仅是负责内存的实现
参考,然后比较两者
检查字符串是否相等的算法包括:
如果字符串对象与per==运算符相等,则返回true。
如果==返回false,则比较两个字符串的每个字符,如果存在差异,则为foun
d、 立即返回false。
如果在比较两个字符串的所有字符后,未发现字符串的字符和长度存在差异,则返回true。
以下是String类中.equals方法的defaullt实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
要检查对同一对象的两个引用,可以使用s==s1
要比较两个值,请使用.equals方法
我的问题是:如何将具有参考的s与
实际字符串Hello是一个字符序列??有吗
逻辑还是仅仅是负责内存的实现
参考,然后比较两者
检查字符串是否相等的算法包括:
如果字符串对象与per==运算符相等,则返回true。
如果==返回false,则比较两个字符串的每个字符,如果发现差异,则立即返回false。
如果在比较两个字符串的所有字符后,未发现字符串的字符和长度存在差异,则返回true。
以下是String类中.equals方法的defaullt实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
要检查对同一对象的两个引用,可以使用s==s1
要比较两个值,请使用.equals方法。s==Hello与s.equalsHello不同。equals检查字符串是否相等,而不是引用是否相同。请注意,s和s1通常最多相等。字符串池不是保证@ljgw-你所说的最多通常相等是什么意思。字符串池不能保证!!。您需要了解一些关于Java中字符串和字符串处理的基本知识…可能的重复。你可以参考…-1,因为我的编辑修改了标题中的拼写,删除了主标签,而不是添加了一个更相关的术语s==Hello与s.equalHello不同。equals检查字符串是否相等,而不是引用是否相同。请注意,s和s1通常最多相等。字符串池不是保证@ljgw-你所说的最多通常相等是什么意思。字符串池不能保证!!。您需要了解一些关于Java中字符串和字符串处理的基本知识…可能的重复。你可以参考…-1,因为我的编辑修改了标题中的拼写,删除了主标签,而不是添加了一个更相关的术语现在我明白为什么我被否决了。虽然我已经喝了咖啡,但我误解了他的问题。@marounnaroun:你需要的是睡眠。:-新年快乐!谢谢新年快乐!最好的:现在我明白为什么我被否决了。虽然我已经喝了咖啡,但我误解了他的问题。@marounnaroun:你需要的是睡眠。:-新年快乐!谢谢新年快乐!祝您一切顺利: