2016-05-08 106 views
0

我们知道Java中的运行时常量池存储以下文字: 1)整数2)长整数3)浮点数4)双精度5)字符串。因此,布尔文字和字符文字存储在哪里?在Java中比较两个具有相同值的字符

实施例:

Character c1 = 'a'; 
Character c2 = 'a'; 
System.out.println(c1==c2); //prints true 

由于==比较参考,确实c1和c2共享相同的参考? (=注意,这些文字被创建为使得它们各自的原始包装类的对象。

回答

0
Character c1 = 'a'; 
Character c2 = 'a'; 

作为相同

Character c1 = 'a'; 
Character c2 = c1; 

两篇参考文献指向相同object.In第二壳体我创建,C2指的是C1,其中C1也是真实指向的对象'a'的引用变量。

更多解释关于引用变量可以发现here

更准确地说,你在堆栈内存中创建了两个引用变量,名义上是c1和c2,但是它们都指向堆内存中的同一个对象!

+1

不喜欢这个人:你能解释我说的错吗? –

+0

不正确。 'char'文字在每行上被自动装箱成单独的'Character'类实例。看到“字符”实例是不可变的,它们在使用中情感上是“相同的”,但在记忆中占据不同的地方。 – Ownaginatious

+0

可能无法保证正在使用的JVM实现足够成熟以缓存容易计算的基元(即char和boolean)的盒装实例。所以你说的不一定是错的,它不一定总是正确的。无论如何,你没有回答这个问题。在你的例子中将'Character'改为'Long',并且你所说的不太可能会成为现实。我不是那个低估了你的人;) – Ownaginatious

2

正如你所说,c1和c2在堆中共享同一个对象,所以比较结果是正确的。这是Java缓存机制。所有字符,值在-127到127之间的整数都将被缓存。所以Java将获得缓存值,而不是创建新的值。这就是为什么两个对象共享相同的引用。

Character c1 = 'a'; 
Character c2 = 'a'; 
Character c3 = new Character('a'); // force Java creates new object in heap 
System.out.println(c1 == c2); -> true 
System.out.println(c1 == c3); -> false 

这是出于同样的原因又如:

Integer i1 = 127; 
Integer i2 = 127; 
System.out.println(i1 == i2); // true 
Integer i3 = 1000; 
Integer i4 = 1000; 
System.out.println(i3 == i4); // false, out of cache range 

你会满足串另一个例子,但在不同的机制:

String s1 = "stack"; 
String s2 = "stack"; 
String s3 = new String("stack"); 
System.out.println(s1 == s2); // true 
System.out.println(s1 == s3); // false 

创建时,所有的java字符串会分配和存储在String Pool。当你创建新的字符串时(如果是s2),Java将在String pool中搜索这个字符串是否已经分配到某个地方。在s3的情况下,我们对Java说:“嗨,Java,请始终为我创建一个新的”。

总结,当比较两个对象时,使用compareTo方法,当比较两个基元时,可以使用==运算符。 (只是提醒你旧的Java类)。

希望这有助于:)

2

我们知道,在Java的运行时间常量池存储以下文字:1)整数2)长3)漂浮4)双5)字符串。

其实这并不完全正确。正确的说法是,在实践存在对于每种类型BooleanByteShortCharacterIntegerLong的autoboxed值单独运行时库。

这些池是不是文字 ...因为不存在的包装类型的文字。这些类型的Java文字是基本类型的值。 (事实上​​,有没有不同的文字,在所有类型的byteshort ...根据JLS)。

不会有自动装箱池为FloatDouble,尽管什么相应的valueOf方法的javadoc,似乎暗示。对于FloatDouble,JLS不需要自动包缓存,并且这些库不实现它(至少在Java 6,7,8中)。

另一件需要注意的事情是,并非所有由自动装箱生成的值都会在相应的池中。例如,(默认情况下)只有Integer缓存-128到+127的值。

因此,布尔文字和文字文字存储在哪里?

答案从以上如下:

  • 没有Boolean类型和Character的文字。
  • 实例BooleanCharacter通过自动装箱创建可能来自相应的自动装箱池。

并为您的示例:

因为==比较引用,确实C1和C2共享相同的参考?

这是正确的。它说明了以前的观点。 Character的自动装箱池需要(由JLS)缓存'\u0000''\u007f'


请注意,我遗漏了StringString池是不同的,因为它(主要)是字符串文字。另一方面,没有为字符串值定义自动装箱...因为字符串值不必与原始封装对比来区分封装对分。


1 - 对不起,是迂腐,但如果你想真正了解这些东西,连贯谈谈他们的其他人,必须使用正确的Java特定的术语。为了严格正确,文字是出现在程序的>>源代码< <中的东西。在运行时,相应的东西就是一个Value。

相关问题