美文网首页
java基础-基础类型学习笔记

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

作者: 西普士 | 来源:发表于2016-07-25 11:55 被阅读19次

    基础类型

    字节数 类型
    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>
    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.
     * <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&trade; 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数组。

    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基础-基础类型学习笔记

          本文链接:https://www.haomeiwen.com/subject/ctvgjttx.html