/**
* 没有指针的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),相同的两个字符串常量是可以用==来做比较的