public class BaseDTTest {
/**
* @param args
*/
public static void main(String[] args)
{
int y=10;
int x=0;
do
{
y--;
x++;
}while(y<10);
System.out.println(x);
}
}
此题简单,但是尴尬的不记得各基本数据类型最大值和最小值的就悲催了。如下:
基本类型 | 大小 | 最大值 | 最小值 | 包装类 |
char | 16-bit | unicode 0 | unicode 2^16-1 | Character |
byte | 8bits | -128 | +127 | Byte |
short | 16bits | -2^15 | +2^15-1 | Short |
int | 32bits | -2^31 | +2^31-1 | Integer |
long | 64bits | ... | ... | Long |
float | 32bits | IEEE754 | IEEE754 | Float |
double | 64bits | IEEE754 | IEEE754 | Double |
IEEE754是二进制浮点数算术标准,找下维基百科吧。
JDK1.5后基本类型与包装类之间有自动拆装箱,不用程序员显式的转换.前几天翻JDK的代码发现
/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
除了float、double其他基本类型都有缓存
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
以上搞清楚后,下面这个问题就简单明了了
public static void main(String[] args)
{
Integer a=1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e=321;
Integer f=321;
Long g=3L;
System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));
System.out.println(g.equals(a+b));
}
总结是逐步的,还请大家轻拍。