How many objects are created including String objects
有人能告诉我创建了多少个对象吗?S3是否引用了字符串池中的相同hello?有多少个字符串对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| /**
*
*/
package agnitio;
/**
* @author admin
*
*/
public class TestString {
/**
* @param args
*/
public static void main (String[] args ) {
// TODO Auto-generated method stub
String s1 ="hello";
String s2 ="hello";
String s3 = new String("hello");
System. out. println(s1 ==s2 ); // true
System. out. println(s1 ==s3 ); // false
System. out. println(s2 ==s3 ); // false
}
} |
- 你真的在乎吗?您知道应该使用.equals()比较内容,使用==比较引用。就是这样!问题解决了!
- 有人能告诉我那里正在创建多少对象吗
- 不是重复的-这是关于字符串缓存的更多信息
- 再说一遍,你为什么想知道?
- 你为什么想知道?
- 我是说为什么有人想知道………..为了知识
- 您希望在S3上使用intern()使其达到==s1和s2。DOCS.Oracle .com /JavaSe/ 6 /DOCS/API/Java/Lang//Helip;
- 伙计,有人能告诉我有多少串东西吗?
- 您的代码创建了两个字符串。
- 2、s1和s2是"interned",换句话说,它们指向相同的字符串池,因为字符串是相同的。在S3中,显式地使用new操作符,因此它创建了字符串的新实例,因此不引用s1和s2的同一实例。
- 取决于你传递给main的参数有多少:p2是minium。一个用于文本"hello"(其中get是interned),另一个用于新的引用存储在s3中。
- 了解这一点不会给您带来什么;不同的JVM可能表现得很不一样。您在一个JVM中尝试过这种方法。你试过Dalvik,Bea等吗?
- string s1=new string("hello");在JVM级别创建了多少引用?我知道两个对象:一个在类装入时为"hello",一个在实际执行时为命令。1引用是s1,我怀疑还有第二个引用s2,它是类加载时"hello"字符串的结果,它被传递给"new string()"构造函数。在爪哇中,我们无法在一个函数或构造函数中传递一个对象本身,只能传递一个引用。另外,应该有第三个引用s3,它应该是新字符串("hello")的结果,然后被分配给s1?
只创建两个对象。第一个对象:
执行以下操作时,不会在内存中创建任何对象:
这是因为JVM字符串类是基于flyweight模式的,所以如果内存中已经存在一个字符串,就像您的例子"hello"一样,那么创建一个新的引用将不会创建一个新的对象。s1和s2都将指向相同的内存位置。
第二个对象是在执行以下操作时创建的:
因为new操作符总是创建一个新对象。
==比较两个引用是否指向相同的内存位置。while equals比较字符串的内容。我说过,正如我所提到的,s1和s2都指向相同的内存位置,因此,==和等于都将返回true进行比较。但是s3是一个不同的对象,因此将s1和s2与==操作进行比较将返回false。但是如果你把s1、s2和s3做比较,你会得到正确的结果。
- 我认识的哥们,请回答整个问题。
- @莫妮丝希望你现在明白你想要的是什么。
- 如果这三个都引用同一个对象,为什么只有一个是真的而不是全部
- @monis我说s1,s2指向一个内存对象,而s3指向不同的内存对象。如果您阅读了我的完整答案,您应该能够理解为什么创建了两个对象,以及当您比较它们时,==将如何工作。
- @莫妮丝:这很好地回答了你的问题。创建两个对象。引用比较只检查对象是否相同,而不是内容,但老兄你已经知道这一点了。
- @jonas bystrom如果s3引用不同的对象,那么有3个对象,两个用于hello,一个用于new
- @monis s3是不同的对象,但s1&s2是对1个内存对象的两个引用。当您使用一个字符串文字时,该字符串可以被插入,但是当您使用新的字符串("…")时,您会得到一个新的字符串对象。了解有关string实习生的更多信息,请访问:en.wikipedia.org/wiki/string_interning
- @Junedahsan你所说的我完全理解,但这使得3个被创造的物体不是这样的
- 我们只是在谈论正在创建的池中的字符串吗?否则,该字符串s3=new string("hello");//创建两个对象和一个引用变量。
- @莫妮丝,我相信你混淆了对象和引用。s1、s2、s3是对一些内存对象的引用。这意味着它们指向存储某些内容的内存位置。s1和s2是指向一个内存位置的两个引用。但是S3是一个指向另一个内存位置的引用。两个内存位置的内容相同。希望现在能消除一些混乱
- @Junedahsan-ya我知道引用,我只是说如果S3不引用池的hello,那么会创建另一个hello对象。
- string s=new string("hello");创建两个对象,一个带new,另一个带string…………
- @junedahsan string s="abc";//创建一个字符串对象和一个//引用变量。在这个简单的例子中,"abc"将进入池中,s将引用它。string =新字符串("ABC");/在这种情况下创建两个对象,和/或一个引用变量,因为我们使用了新关键字,Java将在正常内存中创建一个新的String对象,s将参考它。此外,文本"abc"将放在池中。
- @Junedahsan现在谁是困惑的伙计
- @莫妮丝:我和朱尼达森仍然相信是你。
- @jonasbystr&246;m好的,我会问一个问题,运行时有多少个对象,给一个数字。
- @让我告诉你我理解什么。s1=s3是错误的,因为它们引用不同的对象,所以它们是不同的对象,而字符串s3=new string("hello");正在创建两个对象,一个是new,另一个是hello。告诉我哪里错了
- string s1=new string("hello");在JVM级别创建了多少引用?我知道两个对象:一个在类装入时为"hello",一个在实际执行时为命令。1引用是s1,我怀疑还有第二个引用s2,它是类加载时"hello"字符串的结果,它被传递给"new string()"构造函数。在爪哇中,我们无法在一个函数或构造函数中传递一个对象本身,只能传递一个引用。另外,应该有第三个引用s3,它应该是新字符串("hello")的结果,然后被分配给s1?
不,想象一下StringPool工具没有使字符串不可变,这根本不可能,因为在字符串池中,一个字符串对象/文字(例如"hello")被许多引用变量引用,因此如果其中任何一个更改了值,其他的都会自动受到影响,例如
现在字符串b称为"hello".toUpperCase(),它将同一对象更改为"test",因此a也将是"test",这是不可取的。
编辑编辑
如果我们谈论的是有多少个字符串对象:
1 2
| String s ="hello"; // one string object in the string pool"hello"
String s2 ="hello"; // two object variables (s, s2) |
在这个简单的例子中,"abc"将进入池中,s和s2将引用它。
1
| String s3 = new String("hello"); // creates two objects, and one reference variable. |
在这种情况下,因为我们使用了new关键字,Java将创建一个新的字符串对象在正常(非池)内存中,S将引用它。此外,"你好"也将放置在池中(如果不存在)。
- 如果对其应用大写,将创建一个新的字符串对象
- 回答问题:"S3是否引用了字符串池中的相同hello?"
- @melt321-which change the same object-这完全是误导。
- @melt321如果所有引用都相同,那么为什么一个是真的
- @melt321所以有3个对象被创建或没有
- @monis字符串池中的2个字符串对象。1用于S和S2,1用于S3,由于new。4个对象(3个字符串变量和1个引用变量,由于S3的实例化方式)
- @melt321池中的一个对象"hello"一个对象用于新建,一个hello单独创建。此外,文本"hello"也将放置在池中(如果它不存在)。
- @monis你应该澄清你的问题,如果你只是问S3是否使用相同的引用,那么答案是否定的,因为new。
.equals()方法根据该字符串中的值(存在的内容)匹配两个字符串,==检查两个对象是否指向同一引用。
检查下面的链接,你会得到你的答案,
difference between == and equals method
使用String.ContentEquals:
1
| "stringA".contentEquals("StringB"); |
字符串是对象,无论何时创建"新字符串",它实际上都会创建一个指向内存中某个位置的"新字符串(值)",例如,"float"是一个基元/值,而float是一个指向内存中某个位置的指针的对象。使用"=="时,只需检查指针是否相同。"string.contentEquals"检查两个对象的内容是否相同。