基础类型
字节数 | 类型 |
---|---|
1 | <ul><li>boolean</li><li>byte</li></ul> |
2 | <ul><li>short</li></ul> |
4 | <ul><li>int</li><li>float</li><li>char</li></ul> |
8 | <ul><li>double</li><li>long</li></ul> |
- JDK缓存了1字节封装对象Integer,-128~127自动装箱会取缓存中的Integer对象。通过自动装箱创建的Integer,用
==
判断两个对象,会发现127以下的是true,128以上是false。代码为证(JDK1.8):
Integer i = 127;
Integer j = 127;
System.out.println(i == j);
i = new Integer(127);
j = new Integer(127);
System.out.println(i == j);
i = 128;
j = 128;
System.out.println(i == j);
以上代码输出true,false,false。可以通过以下方法避免这种错误:
- 去掉Integer缓存,具体方法可以google。
- 比较对象值用
Integer.equals
,不用==
,==
是比较对象指针的地址。 - 要么都用int,要么都用Integer,Integer每次都new。
缓存Integer估计是为了节约内存,这坑害了好多C#转java的。
- String是char数组的封装,不可变,常量字符串有缓存。
缓存池,先看代码:
String a = "给我等"; // 字符串常量
String b = "给我等"; // 字符串常量
System.out.println(a == b);
b = new String("给我等");
System.out.println(a == b);
String c = b.intern(); // 字符串常量,从常量池里面取的
System.out.println(a == c);
上面输出结果为:true,false,true。使用相同的字符序列而不是使用new关键字创建的两个字符串会创建指向Java字符串常量池中的同一个字符串的指针。java.lang.String.intern()返回一个常量池字符串。字符串常量池具体实现代码没找到,java.lang.String.intern()定义如下:
/**
* Returns a canonical representation for the string object.
* <p>
* A pool of strings, initially empty, is maintained privately by the
* class {@code String}.
* <p>
* When the intern method is invoked, if the pool already contains a
* string equal to this {@code String} object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this {@code String} object is added to the
* pool and a reference to this {@code String} object is returned.
* <p>
* It follows that for any two strings {@code s} and {@code t},
* {@code s.intern() == t.intern()} is {@code true}
* if and only if {@code s.equals(t)} is {@code true}.
* <p>
* All literal strings and string-valued constant expressions are
* interned. String literals are defined in section 3.10.5 of the
* <cite>The Java™ Language Specification</cite>.
*
* @return a string that has the same contents as this string, but is
* guaranteed to be from a pool of unique strings.
*/
public native String intern(); // native表示调用其它语言的类库
String不可变 因为String类中将char数组定义成final。如果字符串操作比较频繁,用StringBuilder、StringBuffer,他们是java.lang.AbstractStringBuilder的子类,AbstractStringBuilder中定义了可变长度的char数组。
-
char表示一个UTF-16单元,UTF-16最小为16位一个单元,即二字节。UTF-16可以包含一个单元和二个单元,即二字节和四字节。
-
浮点数不能表示精确值,比较浮点数是否相等,应该测试它们的差值时候足够接近。
表达式 | 结果(JDK1.8) |
---|---|
Math.sqrt(-1.0) | → NaN |
0.0 / 0.0 | → NaN |
1.0 / 0.0 | → Infinity |
-1.0 / 0.0 | → -Infinity |
NaN > 1.0 | → false |
NaN == 1.0 | → false |
NaN < 1.0 | → false |
NaN == NaN | → false |
表达式... | 不一定等于... | 当... |
---|---|---|
f < g | !(f >= g) | f 或 g 为 NaN |
f == f | true | f 为 NaN |
f + g - g | f | g 为 Infinity 或 NaN |
参考资料
字符集与编码(五)——代码单元及length方法
Java 理论与实践: 您的小数点到哪里去了?
《Java核心技术 卷1》
网友评论