我们知道Java中的运行时常量池存储以下文字: 1)整数2)长整数3)浮点数4)双精度5)字符串。因此,布尔文字和字符文字存储在哪里?在Java中比较两个具有相同值的字符
实施例:
Character c1 = 'a';
Character c2 = 'a';
System.out.println(c1==c2); //prints true
由于==
比较参考,确实c1和c2共享相同的参考? (=注意,这些文字被创建为使得它们各自的原始包装类的对象。
我们知道Java中的运行时常量池存储以下文字: 1)整数2)长整数3)浮点数4)双精度5)字符串。因此,布尔文字和字符文字存储在哪里?在Java中比较两个具有相同值的字符
实施例:
Character c1 = 'a';
Character c2 = 'a';
System.out.println(c1==c2); //prints true
由于==
比较参考,确实c1和c2共享相同的参考? (=注意,这些文字被创建为使得它们各自的原始包装类的对象。
Character c1 = 'a';
Character c2 = 'a';
作为相同
Character c1 = 'a';
Character c2 = c1;
两篇参考文献指向相同object.In第二壳体我创建,C2指的是C1,其中C1也是真实指向的对象'a'
的引用变量。
更多解释关于引用变量可以发现here。
更准确地说,你在堆栈内存中创建了两个引用变量,名义上是c1和c2,但是它们都指向堆内存中的同一个对象!
正如你所说,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类)。
希望这有助于:)
我们知道,在Java的运行时间常量池存储以下文字:1)整数2)长3)漂浮4)双5)字符串。
其实这并不完全正确。正确的说法是,在实践存在对于每种类型Boolean
,Byte
,Short
,Character
,Integer
和Long
的autoboxed值单独运行时库。
这些池是不是文字 ...因为不存在的包装类型的文字。这些类型的Java文字是基本类型的值。 (事实上,有没有不同的文字,在所有类型的byte
或short
...根据JLS)。
不会有自动装箱池为Float
和Double
,尽管什么相应的valueOf
方法的javadoc,似乎暗示。对于Float
和Double
,JLS不需要自动包缓存,并且这些库不实现它(至少在Java 6,7,8中)。
另一件需要注意的事情是,并非所有由自动装箱生成的值都会在相应的池中。例如,(默认情况下)只有Integer
缓存-128到+127的值。
因此,布尔文字和文字文字存储在哪里?
答案从以上如下:
Boolean
类型和Character
的文字。Boolean
和Character
通过自动装箱创建可能来自相应的自动装箱池。并为您的示例:
因为==比较引用,确实C1和C2共享相同的参考?
这是正确的。它说明了以前的观点。 Character
的自动装箱池需要(由JLS)缓存'\u0000'
到'\u007f'
。
请注意,我遗漏了String
。 String
池是不同的,因为它(主要)是字符串文字。另一方面,没有为字符串值定义自动装箱...因为字符串值不必与原始封装对比来区分封装对分。
1 - 对不起,是迂腐,但如果你想真正了解这些东西,连贯谈谈他们的其他人,必须使用正确的Java特定的术语。为了严格正确,文字是出现在程序的>>源代码< <中的东西。在运行时,相应的东西就是一个Value。
不喜欢这个人:你能解释我说的错吗? –
不正确。 'char'文字在每行上被自动装箱成单独的'Character'类实例。看到“字符”实例是不可变的,它们在使用中情感上是“相同的”,但在记忆中占据不同的地方。 – Ownaginatious
可能无法保证正在使用的JVM实现足够成熟以缓存容易计算的基元(即char和boolean)的盒装实例。所以你说的不一定是错的,它不一定总是正确的。无论如何,你没有回答这个问题。在你的例子中将'Character'改为'Long',并且你所说的不太可能会成为现实。我不是那个低估了你的人;) – Ownaginatious