java基础-基础类型学习笔记

基础类型

字节数 类型
1
  • boolean
  • byte
2
  • short
4
  • int
  • float
  • char
8
  • double
  • long
  1. 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的。

  1. 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.
 * 

* A pool of strings, initially empty, is maintained privately by the * class {@code String}. *

* 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. *

* 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}. *

* All literal strings and string-valued constant expressions are * interned. String literals are defined in section 3.10.5 of the * The Java™ Language Specification. * * @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数组。

  1. char表示一个UTF-16单元,UTF-16最小为16位一个单元,即二字节。UTF-16可以包含一个单元和二个单元,即二字节和四字节。

  2. 浮点数不能表示精确值,比较浮点数是否相等,应该测试它们的差值时候足够接近。

表达式 结果(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》

你可能感兴趣的:(java基础-基础类型学习笔记)