【学习笔记】 唐大仕—Java程序设计 第5讲 深入理解Java语言之5.8 没有指针的Java语言

/**
* 没有指针的Java语言 学习笔记
* @author cnRicky
* @date 2018.11.11
*/

没有指针的Java语言

引用与指针
  • 引用(reference)实质就是指针(pointer)
  • 但是它是受控的、安全的
  • 比如
    • 会检查指针是否为空
    • 没有指针运算*(p+5);
    • 不能访问没有引用到的内存
    • 自动垃圾回收
C语言指针在Java中的体现
  • (1)传地址(C) -> 对象(Java)

    • 引用类型,引用本身就相当于指针
      • 可以用来修改对象的属性、调用对象的方法
    • 基本类型(primitive type):没有对应的
      • 如交换两个整数
      • void swap(int x, int y){ int t = x; x = y; y = t; }
      • int a = 8, b = 9; swap(a, b);
      • 一种变通的办法,传出一个有两个分量x,y的对象
  • (2)指针运算(C) -> 数组(Java)

    • *(p+5) 则可以用args[5]
  • (3)函数指针 -> 接口、Lambda表达式

  • (4)指向结点的指针 -> 对象的引用

class Node{
    Object date;
    Node next;
}
  • 使用JNI
    • Java Native Interface(JNI)
    • 它允许Java代码和其他语言写的代码进行交互
相等还是不等
  • ==
  • 简单地说,基本类型是值相等,引用类型是引用相等(两个引用是否引用到了同一个对象实体上)
  • 但有不少具体情况需要具体分析
基本类型的相等
  • 基本类型
    • 数值类型:转换后比较
    • 浮点数,最好不直接用==
    • Double.NAN == Double.NAN 结果为false
      • 请参见JDK的API文档
    • boolean型无法与int相比较
思考实例
Integer i = new Integer(10);
Integer j = new Integer(10);
System.out.println(i==j);//false,因为对象是两个

Integer m = 10;
Integer n = 10;
System.out.println(m==n);//true,因为对象有缓存

Integer p = 200;
Integer q = 200;
System.out.println(p==q);//false,因为对象是两个
  • 注意缓存这种机制
枚举、引用对象是否相等
  • 枚举类型

    • 内部进行了唯一实例化,所以可以直接判断
  • 引用对象

    • 是直接看两个引用是否一样
    • 如果要判断内容是否相等,则要写equals方法
    • 如果重写equals方法,则最好重写hasCode()方法
String对象的特殊性
  • String对象
    • 判断相等,一等不要用==,要用equals
    • 但是字符串常量(String literal)及字符串常量会进行内部化(interned),相同的两个字符串常量是可以用==来做比较的
posted @ 2018-11-11 16:25  cnRicky  阅读(369)  评论(0编辑  收藏  举报